diff --git a/.gitignore b/.gitignore index 482be5c7..85311b56 100755 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build/dev docs/* !docs/*.conf.json !docs/*.ico +.vscode diff --git a/Gruntfile.js b/Gruntfile.js index 40a79c8a..5ec73d08 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -7,12 +7,12 @@ module.exports = function(grunt) { // Tasks grunt.registerTask("dev", "A persistent task which creates a development build whenever source files are modified.", - ["clean:dev", "concat:css", "concat:js", "copy:html_dev", "copy:static_dev", "chmod:build", "watch"]); + ["clean:dev", "concat:css", "concat:js", "copy:htmlDev", "copy:staticDev", "chmod:build", "watch"]); grunt.registerTask("prod", "Creates a production-ready build. Use the --msg flag to add a compile message.", - ["eslint", "exec:stats", "clean", "jsdoc", "concat", "copy:html_dev", "copy:html_prod", "copy:html_inline", - "copy:static_dev", "copy:static_prod", "cssmin", "uglify:prod", "inline", "htmlmin", "chmod"]); + ["eslint", "exec:stats", "clean", "jsdoc", "concat", "copy:htmlDev", "copy:htmlProd", "copy:htmlInline", + "copy:staticDev", "copy:staticProd", "cssmin", "uglify:prod", "inline", "htmlmin", "chmod"]); grunt.registerTask("docs", "Compiles documentation in the /docs directory.", @@ -20,15 +20,15 @@ module.exports = function(grunt) { grunt.registerTask("stats", "Provides statistics about the code base such as how many lines there are as well as details of file sizes before and after compression.", - ["concat:js", "uglify:prod", "exec:stats", "exec:repo_size", "exec:display_stats"]); + ["concat:js", "uglify:prod", "exec:stats", "exec:repoSize", "exec:displayStats"]); grunt.registerTask("release", "Prepares and deploys a production version of CyberChef to the gh-pages branch.", - ["copy:gh_pages", "exec:deploy_gh_pages"]); + ["copy:ghPages", "exec:deployGhPages"]); grunt.registerTask("default", "Lints the code base and shows stats", - ["jshint", "exec:stats", "exec:display_stats"]); + ["eslint", "exec:stats", "exec:displayStats"]); grunt.registerTask("doc", "docs"); grunt.registerTask("lint", "eslint"); @@ -50,7 +50,7 @@ module.exports = function(grunt) { // JS includes - var js_files = [ + var jsFiles = [ // Third party framework libraries "src/js/lib/jquery-2.1.1.js", "src/js/lib/bootstrap-3.3.6.js", @@ -93,6 +93,10 @@ module.exports = function(grunt) { "src/js/lib/cryptojs/tripledes.js", "src/js/lib/cryptojs/rc4.js", "src/js/lib/cryptojs/pbkdf2.js", + "src/js/lib/cryptoapi/crypto-api.js", + "src/js/lib/cryptoapi/hasher.md2.js", + "src/js/lib/cryptoapi/hasher.md4.js", + "src/js/lib/cryptoapi/hasher.sha0.js", "src/js/lib/jsbn/jsbn.js", "src/js/lib/jsbn/jsbn2.js", "src/js/lib/jsbn/base64.js", @@ -130,7 +134,8 @@ module.exports = function(grunt) { "src/js/lib/vkbeautify.js", "src/js/lib/Sortable.js", "src/js/lib/bootstrap-colorpicker.js", - + "src/js/lib/xpath.js", + // Custom libraries "src/js/lib/canvas_components.js", @@ -174,10 +179,10 @@ module.exports = function(grunt) { * limitations under the License.\n\ */\n'; - var template_options = { + var templateOptions = { data: { - compile_msg: grunt.option("compile-msg") || grunt.option("msg") || "", - codebase_stats: grunt.file.read("src/static/stats.txt").split("\n").join("
") + compileMsg: grunt.option("compile-msg") || grunt.option("msg") || "", + codebaseStats: grunt.file.read("src/static/stats.txt").split("\n").join("
") } }; @@ -215,7 +220,7 @@ module.exports = function(grunt) { }, concat: { options: { - process: template_options + process: templateOptions }, css: { options: { @@ -237,43 +242,43 @@ module.exports = function(grunt) { options: { banner: '"use strict";\n' }, - src: js_files, + src: jsFiles, dest: "build/dev/scripts.js" } }, copy: { - html_dev: { + htmlDev: { options: { process: function(content, srcpath) { - return grunt.template.process(content, template_options); + return grunt.template.process(content, templateOptions); } }, src: "src/html/index.html", dest: "build/dev/index.html" }, - html_prod: { + htmlProd: { options: { process: function(content, srcpath) { - return grunt.template.process(content, template_options); + return grunt.template.process(content, templateOptions); } }, src: "src/html/index.html", dest: "build/prod/index.html" }, - html_inline: { + htmlInline: { options: { process: function(content, srcpath) { // TODO: Do all this in Jade content = content.replace( 'Download CyberChef', 'Compile time: ' + grunt.template.today("dd/mm/yyyy HH:MM:ss") + " UTC"); - return grunt.template.process(content, template_options); + return grunt.template.process(content, templateOptions); } }, src: "src/html/index.html", dest: "build/prod/cyberchef.htm" }, - static_dev: { + staticDev: { files: [ { expand: true, @@ -288,7 +293,7 @@ module.exports = function(grunt) { } ] }, - static_prod: { + staticProd: { files: [ { expand: true, @@ -303,13 +308,13 @@ module.exports = function(grunt) { } ] }, - gh_pages: { + ghPages: { options: { process: function(content, srcpath) { // Add Google Analytics code to index.html content = content.replace("", grunt.file.read("src/static/ga.html") + ""); - return grunt.template.process(content, template_options); + return grunt.template.process(content, templateOptions); } }, src: "build/prod/index.html", @@ -326,12 +331,12 @@ module.exports = function(grunt) { ASCIIOnly: true, beautify: { beautify: false, - inline_script: true, - ascii_only: true, - screw_ie8: true + inline_script: true, // eslint-disable-line camelcase + ascii_only: true, // eslint-disable-line camelcase + screw_ie8: true // eslint-disable-line camelcase }, compress: { - screw_ie8: true + screw_ie8: true // eslint-disable-line camelcase }, banner: banner }, @@ -403,7 +408,7 @@ module.exports = function(grunt) { } }, exec: { - repo_size: { + repoSize: { command: [ "git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'", "du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'" @@ -438,13 +443,13 @@ module.exports = function(grunt) { ].join(" >> src/static/stats.txt;") + " >> src/static/stats.txt;", stderr: false }, - display_stats: { + displayStats: { command: "cat src/static/stats.txt" }, - clean_git: { + cleanGit: { command: "git gc --prune=now --aggressive" }, - deploy_gh_pages: { + deployGhPages: { command: [ "git add build/prod/index.html -v", "COMMIT_HASH=$(git rev-parse HEAD)", @@ -466,15 +471,15 @@ module.exports = function(grunt) { }, html: { files: "src/html/**/*.html", - tasks: ["copy:html_dev", "chmod:build"] + tasks: ["copy:htmlDev", "chmod:build"] }, static: { files: ["src/static/**/*", "src/static/**/.*"], - tasks: ["copy:static_dev", "chmod:build"] + tasks: ["copy:staticDev", "chmod:build"] }, grunt: { files: "Gruntfile.js", - tasks: ["clean:dev", "concat:css", "concat:js", "copy:html_dev", "copy:static_dev", "chmod:build"] + tasks: ["clean:dev", "concat:css", "concat:js", "copy:htmlDev", "copy:staticDev", "chmod:build"] } }, }); diff --git a/build/prod/cyberchef.htm b/build/prod/cyberchef.htm index 54bcc18a..d64eda10 100755 --- a/build/prod/cyberchef.htm +++ b/build/prod/cyberchef.htm @@ -69,13 +69,7 @@ Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css -*/html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}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}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}.glyphicon,address{font-style:normal}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[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-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}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{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!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:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.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 td,.table-bordered th{border:1px solid #ddd!important}}.dropdown-menu,.modal-content{-webkit-background-clip:padding-box}.img-thumbnail,body{background-color:#fff}@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-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro: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,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble: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"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>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;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-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}[role=button]{cursor:pointer}.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,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,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,.h5,.h6,h4,h5,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}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.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:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{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-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{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-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{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}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@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 #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.btn,.form-control{padding:6px 12px;background-image:none}.form-control{width:100%;height:34px;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(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,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.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],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.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],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.btn,.checkbox-inline,.radio-inline{display:inline-block;vertical-align:middle;font-weight:400}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;padding-left:20px;margin-bottom:0;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.btn-block+.btn-block,.help-block{margin-top:5px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{margin-bottom:0;font-size:14px;line-height:1.42857143;text-align:center;white-space:nowrap;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .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{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.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;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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,.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 .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group{float:left}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 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:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 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:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.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}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{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{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.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 #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.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:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.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;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;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}.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 .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{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)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.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-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;pointer-events:none;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent}.alert h4{margin-top:0;color:inherit}.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}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-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{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-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: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)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.arg-input,.arg-label,.media-middle,select{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{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.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:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom: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-left-radius:3px;border-top-right-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>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.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 #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border: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+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;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:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;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:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-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,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none;letter-spacing:normal}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.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 #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.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,.5);box-shadow:0 5px 15px rgba(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-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6);text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;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}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>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:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.arg-input,.io-info,code,textarea.arg{font-family:Consolas,monospace}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.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!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.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!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!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}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.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}.hidden-print{display:none!important}}/*! @license -======================================================================== - StyleSheet for JQuery splitter Plugin - Copyright (C) 2010 Jakub Jankiewicz - - Same license as plugin -*/.splitter_panel{position:relative}#banner,#content-wrapper,#wrapper,.splitterMask,.textarea-wrapper{position:absolute}.splitter_panel .vsplitter{background-color:grey;cursor:col-resize;z-index:900;width:4px}#banner,#wrapper,.splitter_panel .bottom_panel,.splitter_panel .hsplitter,.splitter_panel .top_panel{width:100%}.splitter_panel .hsplitter{background-color:#5F5F5F;cursor:row-resize;z-index:800;height:4px}.splitter_panel .hsplitter.splitter-invisible,.splitter_panel .vsplitter.splitter-invisible{background:0 0}.splitter_panel .bottom_panel,.splitter_panel .hsplitter,.splitter_panel .left_panel,.splitter_panel .right_panel,.splitter_panel .top_panel,.splitter_panel .vsplitter{position:absolute;overflow:auto}.splitter_panel .left_panel,.splitter_panel .right_panel,.splitter_panel .vsplitter{height:100%}.splitter_panel .left_panel,.splitter_panel .top_panel,.splitter_panel .vsplitter{top:0}.splitter_panel .bottom_panel,.splitter_panel .hsplitter,.splitter_panel .left_panel,.splitter_panel .top_panel{left:0}.splitter_panel .bottom_panel{bottom:0}.splitter_panel .right_panel{right:0}.splitterMask{left:0;top:0;right:0;bottom:0;z-index:1000}/*! @license +*/html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}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}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}.glyphicon,address{font-style:normal}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[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-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}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{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!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:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.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 td,.table-bordered th{border:1px solid #ddd!important}}.dropdown-menu,.modal-content{-webkit-background-clip:padding-box}.img-thumbnail,body{background-color:#fff}@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-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro: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,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble: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"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>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;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-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}[role=button]{cursor:pointer}.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,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,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,.h5,.h6,h4,h5,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}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.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:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{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-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{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-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{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}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@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 #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.btn,.form-control{padding:6px 12px;background-image:none}.form-control{width:100%;height:34px;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(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,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.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],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.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],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.btn,.checkbox-inline,.radio-inline{display:inline-block;vertical-align:middle;font-weight:400}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;padding-left:20px;margin-bottom:0;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.btn-block+.btn-block,.help-block{margin-top:5px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{margin-bottom:0;font-size:14px;line-height:1.42857143;text-align:center;white-space:nowrap;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .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{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.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;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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,.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 .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group{float:left}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 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:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 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:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.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}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{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{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.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 #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.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:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.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;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;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}.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 .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{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)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.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-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;pointer-events:none;cursor:not-allowed;background-color:#fff}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent}.alert h4{margin-top:0;color:inherit}.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}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-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{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-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: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)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.arg-input,.arg-label,.media-middle,select{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{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.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:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom: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-left-radius:3px;border-top-right-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>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.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 #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border: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+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;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:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;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:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-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,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none;letter-spacing:normal}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.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 #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.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,.5);box-shadow:0 5px 15px rgba(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-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6);text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;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}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>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:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.arg-input,.io-info,code,textarea.arg{font-family:Consolas,monospace}.affix{position:fixed}#banner,#content-wrapper,#wrapper,.textarea-wrapper{position:absolute}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.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!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.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!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!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}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.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}.hidden-print{display:none!important}}/*! @license ======================================================================== StyleSheet for Google Code Prettify Copyright (C) 2006 Google Inc. @@ -93,6 +87,7 @@ limitations under the License. <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD */.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}#content-wrapper{top:0;left:0;width:100%;height:100%}#banner{height:30px;text-align:center;line-height:30px}#wrapper{top:30px;bottom:0}div#operations,div#recipe{width:50%;height:100%}div#input,div#output{width:100%;height:50%}.title{padding:10px;height:43px}.textarea-wrapper{top:43px;bottom:0;width:100%;overflow:hidden}#output-html,textarea{width:100%;height:100%;border:none;padding:3px;-moz-padding-start:3px;-moz-padding-end:3px}#input-text,#output-html,#output-text{position:relative;border-width:0;margin:0;resize:none;background-color:transparent;white-space:pre-wrap;word-wrap:break-word}#output-html{display:none;overflow-y:auto;-moz-padding-start:1px}.split{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:auto;position:relative}.gutter.gutter-horizontal,.split.split-horizontal{height:100%;float:left}#input-highlighter,#output-highlighter{position:absolute;left:0;top:0;width:100%;height:100%;padding:3px;margin:0;overflow:hidden;letter-spacing:normal;white-space:pre-wrap;word-wrap:break-word;color:#fff;background-color:transparent;border:none}#op_list,#rec_list,.op_list{margin:0;padding:0;list-style-type:none}#op_list,#rec_list{position:absolute;top:43px;bottom:0;width:100%}.io-btn-group,.io-info{margin-top:-4px;float:right}#rec_list{bottom:120px;overflow:auto}.operation{cursor:pointer;padding:10px;list-style-type:none;position:relative}#controls{position:absolute;width:100%;height:120px;bottom:0;padding:10px}.io-info{margin-right:20px;height:30px;text-align:right;line-height:10px}.arg-group,.inline-args input[type=checkbox]{margin-top:10px}#input-info{line-height:15px}.arg-group{display:table;width:100%}.arg-group-text{display:block}.inline-args{float:left;width:auto;margin-right:30px;height:34px}.inline-args input[type=number]{width:100px}.arg-input{display:table-cell;width:100%;padding:6px 12px}.short-string{width:150px}select{display:block}.arg[disabled]{cursor:not-allowed;opacity:1}textarea.arg{width:100%;min-height:50px;height:70px;margin-top:5px;border:1px solid #ddd;resize:vertical}.arg-label{display:table-cell;width:1px;padding-right:10px;font-weight:400;white-space:pre}.title,optgroup{font-weight:700}.editable-option{position:relative;display:inline-block}.editable-option-input{position:absolute;top:1px;left:1px;width:calc(100% - 20px);height:calc(100% - 2px)!important;border:none!important}#operational-controls{width:65%;float:left;text-align:center}#bake-group{display:table;width:100%}#bake{display:table-cell;width:100%;border-top-right-radius:0;border-bottom-right-radius:0}#auto-bake-label{display:table-cell;padding:1px;line-height:1.35;width:60px;border-top-left-radius:0;border-bottom-left-radius:0;border-left:1px solid #5cb85c}#auto-bake-label:hover{border-left-color:#398439}#auto-bake-label div{font-size:10px;padding:2px}#extra-controls{float:right;width:35%;padding-left:10px}.op-icon{float:right;margin-left:10px;margin-top:3px}.recip-icons{position:absolute;top:13px;right:10px;height:16px}.recip-icon{margin-right:10px;vertical-align:baseline;float:right}.disable-icon{width:16px;height:16px;margin-top:-1px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfElEQVQ4y6WTPWgTYRjHf8nlfVvuoDVIP4Yuki4WHKoUqggFRUTsUEGkVG2hmCq6OnTwIxYHB+eijZOKdLNDW1pKKyGigh8dBHUJElxyBgx3vEnukvdyDrUhRXDxGR+e/+/583xEwjDkfyIGwNVTzURm4tYAMA6MAoN/0tvAMrA48uL+l2bx4w0iYRjSuHKC6OnTZLqHk8CcaZq9bW1tSCkBqNVq+L5PpVIpAHdGfr5LN9bXiT7Z2nGgteb1/qFkLBJZ6OjowHEc8vk8pVIJgHg8TldXF52dnb2u6y5s7R/iuF5JSyAKkLl4eyAMwznLsrBtm1wu99Z13amk+BFJih8R13WXANrb27EsizAM5zIXbw+wC9Baj0spe5VSFAqFt4ZhXJ6ufXuK55E5cDKVSCTGenp6yGazKKWQUvZqrcebgCAIRqWUOI6DEOLR1K8POapVMgfPpoC7u2LLspYcx0FKSRAEo60OBg3DwPd9Jr5vPqWvj8zh83vEwL2J75vnfN/HMAy01oPNNQZBQBAEO1OvVsl0D/8lTuZfpYDd7gRBQKuD7XK5jGmarB679PIv8deVFJUKq8cuTZqmSblcRmu93QpYVkohhMCyrLE94n2/UlSrbJy5kRBCXBNCoJRCa73cClh0XbfgeR6WZZHNZunv719KvnmeYnWVVxdmJ2Ox2DMhxFHP83Bdt6C1XgR2LvHzQDvvb84npZQL8Xgc0zSJRqN7br7RaFCpVCiVStRqtZmhh9fTh754TQdMr82nPc+bsW27UCwWUUpRr9ep1+sopSgWi9i2XfA8b2Z6bT6ttabp4GMi0uz0aXbhn890+MFM85mO5MIdwP/Eb1pMUCdctYRzAAAAAElFTkSuQmCC) no-repeat}.disable-icon-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACFUlEQVR4XqWTP0tbURjGn9zY3mjBwsUhBQtS6XKxiNypIGZJ6SKYUYdaKWg7OrrE3pYO+Qit3dpFuuQO6lI7Z4nESQdjlJbkJh0MksSb3Jvk9H0gjZFu9YWH83LO7zn/3nNCSincJobAeP1sEDBFi6J50UyPy4l2RNuioz756Ts0tt1OB4jH2a52Ne2HGh9PwrJm2EcxZx/HyPRYMDgB2u02/N3d1c7w8BZMM1ptNJBPp3GwsUExB/s4RoYsPf0JOkFgdoH34YkJ/D48xC/HyTTOzl5ayWSIktwxqlVo0SjIkKWnP0Hg+4swjGitVMJFNpu5o+svptfXv6DZBDIZezoWS3Db3A0ZsvRcH8H354dGR9EoFHA3EvlorqycwvOAXM4G8Pav+f7YmEOGLD1gsIzl54+V+vBK/Yw9ZAv1LQW1FrdFSnKVfQTK5liPUfRI9I8ArqiPjLAF9vcHVybyzlpasgcZeq7voNXKNSsV3DMMXB4fp/8xLyzYuLri2DIZsvQM3sFOzXURiUR4zsQNcyrFleFVKpNyP2/IkKVnsArbF65bbkqplJSJZrl5x5qbs7G3h3artSyV+arr+lMyZOnpP2Wp6ZFos3R+vvUgCGDNzgKalkA4rECIr07662J2i0X4nrfJJ33jJT6Zmvpcr9XWCicn5WI+j7rrAmKgmLOPY2TI0sPgb8TBZOi/PpN1qnDr7/wH3jxgB/FKIXkAAAAASUVORK5CYII=) no-repeat}.breakpoint{float:right;width:14px;height:14px;background-color:#eee;border:1px solid #aaa}.breakpoint-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEXIUkvzUVHzTEzzn5785eXrbW24BgbzWVnze3vzVVXzY2Pyion509PzbW3zXV1UMxj0l5f1srKbRTRgOxzJDg796ur74ODfIyP5zs6LLx3pNTXYGxuxdkVZNhn////sCC1eAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAABWSURBVBjTnc+7EoAgDERRTOQVxMEZFAf//z8FjAUFDbfb060QU2FwxngimxnCea3bjegSgz+0tguAfBgIy64QGfZQdg91dgAtqUZgnfz6IacYVWvu2AvR4wNAv0nxrAAAAABJRU5ErkJggg==) -2px -2px no-repeat #eee}.banner-right{float:right;margin-right:10px}#banner img{margin-bottom:2px;margin-left:8px}.category-title{display:block;padding:10px}.category{margin:0!important;border-radius:0!important;border:none}#search{border-radius:0;border:none}.loading_file{background:url(data:image/gif;base64,R0lGODlhPAA8APcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQhCAD/ACwAAAAAPAA8AAAI/gD/CRxIsKDBgwgTKlzIsKHDhxAZ9puy5VjEixj/hZsAAECGfhlDFrSl5hPBdCA6dgxSkF26dyIfItox48aXgfk+qASQYiC/dOXKmXMXkyGxJDOS9pA1cMyBjhLUDJQXNOg5fkUV+hqStGaoqY4+dBBEMF7Vcuj2ZVVIpasRfwXrwS14rmq7tQTLzR0oRokWePoa7kt3jh1Igf7mxcMXEp+dx4wJ7sMK8fBAd+aEWoZ4To6Zz3nY4f2HL7NVjMPWfDazpthos1XPqY2oLs5qOeVG/6sbFF3Gcp7l/NL9b945c+j2XuR2Kxxxgf3ubX5OXSG9dsqrG5xXbyGvUqRO/mk/qA+d0HeUDUoDlak9qvEFgVaNh5BW+/ak5sGHzjvo3YPGbHIfKfsNpM5Z+h00Ty6eaHLKOQUaaI45+MyG0DXPRCiZPYFp6OGHBvWTHYj8TPdPP/w0www0IF6GDjqRDdQPMzQy40yLBwZljnLZ1EhjOh/2Y15VRA3kjY/MAOmhP0MGBQ9B/vgoTYvx8OZbQf5I0ww2LQokzzrvWNjlmGSS2U887tjz4TzqrNNdQu3omN5+9Jh2zogC4XPWnQUKeZZoB8FmlZja+VmVOgk1eWWBglKYUD3nnJOch+2gkw6KCvmTD55ldopRPPJQJ89LIe3DmzqchhRnbxnJF1SCh2vd0185RULkz6yAxjprqBflKBSsa7nKJ0bsRLpOQfl06JA/+ExXKaqpLhRdPgWtIyk90cp43FXw+WoOsP/Ig55kppUjm3ZM/plXVZbVc1Y59BS6q4HvDmRqVeYQStytQSkpULlBpWeqOefoYyJx9rwTz2bs1CtZPfp62F+2LfYDD0yeZkxmQAAh+QQhCAD/ACwCAAIAKQAfAAAI/gD/CRxIsKDBgv3q8JF2sKHDhwLNCZkx40g/iBgJInt0i2C7JhQpninIpIWbjAVLrTGT5tBAfUtCzqAysFwMAAAcdEEpcNodM0DbEBsoKAdFIYgGGjKAE0CHdTydyQHKMtdAeqSYKNlEsI+Aph648fz3hyodfwXvoS3ooekViO7WDkx0Z9C8fRnDufDAxJ1DfaMC6yvI7+LYeg/fhcrEuJS8sZD/XePEOFMnbJHHxgNVOVS7zGPdLQZFDTRkdM+gml7N+mA+e3JbP+wmLdo02RBRM9t9G3fDbLt3R8vn+6C44MyiFXe9zRmzafOWN1xnTrr167j9xcber1+5ctWxHwv0/h28+H/ryn+Pjr2d+nL0xPtTf+78P3/oyqkWHxAAIfkEIQgA/wAsBAACAC8AFgAACP4A/wkcSLCgwYH9LnHqdrChw4cN2ckxY6ZOP4gYH2qj9YxgvDwUKTIqCOeKoowQh3HKpOnVwH14Qpr5M1CdlhkzfPRB2TAcqUxAO2EbGEoNxTilBnq6gXOGknc8DXoLBZQltIH3duW5Q4vgpRpNl4yLajBVVVH+CuZLW3BJUzxk7bEdCIvUqnv8MprDsgROPISU9PhqyC+a4bwE+12Meq8gGAgAHsAzeO8Zs8vS8JGF2KsBgM8bDK5rdplZs3WbH+r5/JkDt4L4LF9+Zi/1Qw+sQRy0Z/lZOtsPH12wIAKxwXnm6gGHCE8XveXQDfLTNzd61HbozqGzHlWfPHPlwiRv554xHbvw4veRh9jvHDz05c6tx6huXzvw6DTPz0hP3v6MAQEAIfkEIQgA/wAsCQACAC8AFgAACP4A/wkcSLAgQX+6eqEzyLChw4cC5YHKlGmUP4gYH7LLdo6gvVIUKc4qSCnQqYwQwzVjxszaQH4gQ6Ya+G6QGTNuPKFsCC8aS2bO1g0EtokiqGEDbaW5aebOvJ0G3T37yayjwHzRSpFqRjDWGaZ41EE1SO0ntIsE96EliIepprH61gq8Fo2avn4Z2QXCM4newH6pKC1r2O+cYbwH5WbMVxAQkBk/nhbUZ66cZXT7xkJU1mOG5yQG6VkeXU/zQ0qeP48ruK+yZXP6TD9kkpoJQ8rlzkmW3bBUkSJO+DXMJ48x74fzkNk7zry584GSRj0f262EAQhmzC2cjvEFgO8JACFh5v6wXofv36FYJe+wBnoClfCxh4gDwoRg2eanRFVNYEAAIfkEIQgA/wAsEQACACkAOAAACP4A/wkcSPCfP27e5hVcyLChw3/4njFjFs3fw4sL67GTR1CftIkTsRW8tYoYxoXvyqlUN7DfR5DUBtJjlSmTJ18nB947p7KcOXoDvzWb+CzcQGebamYidS/nP3s8e3IUyA+dtGjmCC5TmqlUPKf/0vU8Z5Fgv7IESyndBVbgOnTo+KF9KG9VqVv4Wvp6JfKiv7kn9xX8BMfMG3ttE19zY6axncRtXzVufIclZKd4Jue5DHbXnDl6+nEGa69a3tGoUzs9VUs1xnFRcAAptM61QywzcuvIZJvhPSW5c8vpzbBLcBuqiDMEA0RIM3DKF57L1S269eu2z03FLhDMhxDFuN//mwGgfAXR1995KF++C3Z968sHgMO9z4byKMT/S/TDzDb9AAYoIEHzqLNOPeLRY45KZGHXDzo9lcOOgxD2ZNl18fRkzmnYtYNOOv3wM+CIysmTzjv6tdMTOtztFKE72LkoFXdiMQhYQfnoA5Y/+KA3kIfq/OXQOuegQ8+NDPVzjjnniAiWOhoqRFA+9zgp0D4LMihYTv5UqNKEA6lzzjnpEFRPhOUAlZOSEW4HT4RlXhmVT1tyGVWcAkE5lo/7LHmOPj7mZM878QQqD5wF7VNPnaq1syQ6SBLnzz2IuRYQACH5BCEIAP8ALBoAAgAgADgAAAj+AP/989fOXT6BCBMqXMhwn7ly5c75Y0ix4j9+6CBCXKdwG7VwFhn6y6gxHcJ81Zgxc+Yt5MJ3Gs29Q2hOpcpo+1wm7DcP3Tl5CcvZZBYNn06F/SYqlGaz21Gd+KpF25ZToD9qyco9ZdhP4a9PmT4d3FqRnKdMaEmRrZgMbdp4aymWclsqLkVpokKZ6mqXYb5x+voKHvyvFzLCCdXxSfNmFDzE/wSZmbxmFuJ8dyZPrgS5kGY0vyD/OwQnTjZ0otst0yq6teuQ6+i5BsSkCTTRXGboJsJ3sLwlunX3QbwPuG4ajSBbQqJbSmtQZgqJe029umtJM3acEv2JAgAAGHqGC6YH4vt3J4jflTePA/KdBN8ZEBONRcSKeuqs648rL93M1Bqhhtg952hUjjsDFqgRUIilo5FEcfmDj3j/tIOOOv4otVU/55hzDj/8vQMiQg49WNVTBvZWj4HlyPaUOiySqGA55pyo00MGjvjPPh2eow+FIbETY0L71GPjUzNqSFg/8PyHWEAAIfkEIQgA/wAsJAAEABYALgAACP4A//1jl+6dwIMIEx7kl65cOXPuFEo8KM+hw3P8JkqMZ7Ecun0aJZ6z2C6kxH3pzrHrd9BfOnLyTP5jifDbM2bPMso8GM8Zs5/Rdh4k9xMoPqECoxWVhlQgOmjQpPlrKpBfPJ1Us4acpi1rPFSbPgWr13RVprOcmCHdR+rsWVxNXbnVRI3qq0+gzBlsOo9bRK2AAyeEd0/rJzx5tlElZKbxHJo76+Fp3LgTUn6TKadqCstOYz9ZcTEalU6w6dM7T3ERA7eprCEzZhiBLNMek9ix4yCV1wT3jC9NJemI3QMaVT1OrNj7i7r5wUMx0mSNUgBAgBFNcWUAwN2AGaSxMBdwB2AAUVMY4zfQTugP33ooIWbwm6owIAAh+QQhCAD/ACwkAAkAFgAvAAAI/gD/7Ut3jl2/fwj9zYuHD6HDhw4PPnRnrpw5iRAzOsRXsVy5cxpD/ovn0eO5fSI1niuJLqXGeefMofPnUmO/exhr6twJER07ng7vTWvmDJw+oNWYKW1Wjme/aEqVbgNqLSqzdED/XXv2TN69rPna2ctKtmzNevnK/iplCiTQVpnihqK5E1+puHF9Ob2LtxhQZaPioiL7TFYweGYTKy7bq1CiZFmLyTFjhk5Ol/jyUKZciWc9zZsPvV1Duc1UoJv0AMInb7FrkZ+0iM4658YMGk+AGjsyo/cNQjyBGek94wYooFmIJ7n80N6v1g/nNNnCj25GdhkqaFgHVJsEAOA3H3jj6UkBeAAIOPH8duG8A2xAw2lYgMFau6zbQoHLGhAAIfkEIQgA/wAsGwARAB8AKQAACP4A/wkcSLCgQYLz6h1cyHCgPnTlzL3j17AiwXTlMpaLZ9Fiv3May7XraFFdyHkkS5ozh29fyor77Ol7SbOmzZsOKeI0+E2aNHk7CVpjRhSav6D/9kkjStQbUn9LmYpD+o9cNKLTqAo8hw3cPa1gw4pdOK0VrG1asYXKlEnU0aD6SrFliwspPlNzM72iiowTW0/ntPIypUqfvbGId94aVAqspTRmzOyhSq1OZDNpRiGFRudymrpIB12206/mPWb0ClrKQ6jf25TvjhBB8q5mMFfrCIYLMqN3EnIvaVyoUKK0wFg7es/IASvlmwMAoqsYWK6Ich/fUsaIHl3DyK1HdhwY8QYv5aEB3E0UFEfLXE0pFyB8MI60HytSYAMCACH5BCEIAP8ALBEAGgApACAAAAj+AP8JHEiwoMGDCP/x65ewoUOE7tChw/ewokN15TKa82exY8F+6DJmdOex5D9/IUXCM1ky3rmM6FialLfu3T6ZOHPq3MlTJzpr19r1bLjuGTNm0DgONchP2tGj25Ya3Of0qTWpBsc1O+psHlaD3aRR46fvq9mzJZ2xEoZ2YC5NmTKdaitOVNxMmoKh/WY37qZnbVndJaUUITLAHfNhu1cwl6lW/Qob9MFBRCaKD+fVmWPHq8ccAEJLiFSQGa93BNHBMcPazrqO9zyEDs2EIJciQ6AwFFhsDWszaoZ1pDdi9oBGAxfhmMGcysB1dH67OecxHwcABFoQzMKc+ZGVAtsk1WFDxxy9krDSAKpHsFON7lEKpjPGbumcIkCW7Ebbb1etoQEBACH5BCEIAP8ALAkAJAAvABYAAAj+AP8JHEiwoMGDCA3OU7eu3j9+CSNKjEjPXLly5/xlnMiRYz90Fy+yO7evo8mEH0OWU4fupMuD8UKaw+fvpU2C7dCl6wfxps+fQCP6QRQUoblq4BB6+yAgQY57RQlyY0Z12sEXALIWWBRVIDxoVKkmJYivQ9asTLr+ewc27DmDO846mKT2X7Ww0WoaPIKBQ5CC07Cd3FcuX0Fu0qz501vQXS5mBckkcdLK8MR7o0KNgvoTzIzPQk4VvLZsHkF4oDKpJhXPJ74lnz/DIThoTpw9/QZi66Q6E6drPu09iV2D1EBTacwo9zNQnqjent791Jdkho0rBAMpV07HtMB5ozokiXLH2ScwQ5nK/6N1ZvuegvCyyatbkJKcN3dy05fYT5mxogEBACH5BCEIAP8ALAQAJAAvABYAAAj+AP/RA0TG1b+DCBMqXMiwIUMtCwAsUOewosWK9IBFBABAg76LIEH2QweII0cO2kKqdDjynwiTIVbKZBjv3ygMGkD0m8lzoT5lO3sKHUq0IiZQRRvKS/euITkmNXSEwZc0YbtyWNExzDKj641QVQ/eO4cVqzuF+ZR07fom7L+xZcvJWyhmrQ9Ubv+lK3vOH0M2RpKcUehN3Mp+8vgpbIdOnT+/C+Mds6Zw0R09wj5e3BcNWrR9RBGZGR2nl0Jx2u4lvPeMmetoVHvqwzN6NKWEq0CBKhX037pmrpk1WycUn57aZ3QhDLYpk/NTCPFBC+5MtdB9dsygCZRQlXPnoawp/8sXrRk0e6CHPiMlK19CZd8zmVJ4j13svAhtgfI0CjL+iv1oQxlPAQEAIfkEIQgA/wAsAgAaACkAIAAACP4A//3L50+gwYMIEypcKHDfvRIbhDCcSDEhPwwAAAiQWLEjQ0MHMgLgoMyjSYSZEIjcYOyky3/+NmQsgOXlS35LQLSxybOnz59Agy60l2mQL6EU9fCYwcMd0oXMls6YgWTf04SZpk5NEu5qQidam3hNWMsIEib9xibcRy2t2rc2Y92Ca3AdnjNrEOmjK8iM3zS54Oq749fvJLqJCrs5ShcSnTuNEKZbd9IfPrcM6VUDhzAWKVPW+HXsd87cOdEnX2VaDUoaQnborBrcZ66c7XOyO+4rtXr1XIPSnDmDhrme7eP0TOoz1VtTNIPdmEln9rzhuePmcnfkRyqTplUHpSVNZ/Zsr3XT+jB7/CaMmXZw46Eh3FdPO9Brzpo9K0i3X7pzFQUEACH5BCEIAP8ALAIAEQAgACkAAAj+AP8J/EeOmr+BCBMqXDgQy4cOIxhKnOhoAoCLKCZqTFjk4sUO4TaKnFPAoweRIsNBaTBgRDGUKDclgkmzps2bC/UdxLlwHz4oSMzwVMivyIwZNIQOHcgJx9EZSKYtFbgqx1Mk0Kb+84fk6A08WgXyc8NkZtizaNPCxCdLlDO0m9iYYSMvbDa5ZszU4adVVt68d9CF1fNXz9ljdOrk6YeW3zfGaiMnXPYMbbxSmTi92heWVabPmrJO5Ufq8+dbYWGZ9iQ1bC1RpGQlpFePJ75x6hJiiyZNHeSp15gJfyYYobx3fGn2kyZc+DaE5aKX+y2SH/Pm5waqkx69Zr9owqsZITTHvVxymO/ATUfIrvzZc9J3au0H793AgAAh+QQhCAD/ACwCAAkAFgAvAAAI/gD/CRxIsJo/gv/WoUPH7yBCgfQ2SKSH0J/Dh/+uUQDA8QM4jCA5JeAIQMEnkBi7TSBZgRpKjNUqAKBQ6SVIY4ia2dzJMx23izwF5mGi5EnQgaWEzFg65eg/NUuXKjl31NGNqEucnpvTo8YTaE4FvgIVtqxZkPuABuWXb0+dRWH5zTFDF+7RWWnomqnD7agvNXrraDvqrw5dNJjC9ouEp9TZx5Aj62MWzFtZXp0ydbLntFzmTJlG9TvKDDRoUvCcmjJtKqw2UaNKqeXZL93syGXLUQ2LTxqzZtdGH63GrDiz3bSjGWe2zek1487SuYYWDRvCfPps7otHkeC6c+joId1Gqa6ceXPzCKMzb57d0X7n2JeT59Rf/HLSw9p7F290QAAh+QQhCAD/ACwCAAQAFgAvAAAI/gD/CRxIsKBAUkUOGVxYUE0CAAVwMGRoiwOAiww+TTToisJFiIo2GlTxEYO/jd1OEtzRAUa7fAztIUGSxF7BffwmfhsyoycTcyIJwtLRc8YOWUEHjhNSlAi3pAO7EZkxRBVUgtE+XbvKtaC7ciq5bspzZ0/XXXHMqO3D9ZFatXfaXVWF5u0dru0stUGz52nXYbi6Ch7MkF/Yq/z2lRIFq2u/UJkiN76aTFPkTKKAQo226bKoclf9iYqsKTDXfrRIBSPMurVrfuXAuRPczRkzZ/q4yrPNjFm0wyLL9e4d7R5XacOldWUHLZo04En90YPuWnA8eYL3nStXTh31iem4IXOfF3q7eHZc1Yk3R54ru3Pn1hXMl3tjv3swCa47h256QAA7) center center no-repeat #f5f5f5}#alert{position:fixed;width:30%;margin:30px auto;top:10px;left:0;right:0;z-index:2000;display:none}#alert a{text-decoration:underline}.option-item .bootstrap-switch{margin:15px 10px}.option-item button{margin:10px}.option-item input[type=number]{margin:15px 10px;width:80px;height:28px;padding:3px 10px;vertical-align:middle}.option-item select{margin:10px;display:inline-block}button img,span.btn img{margin-right:3px;margin-bottom:1px}#edit-favourites{float:right;margin-top:-5px}#edit-favourites-list{margin:10px}.about-img-left{float:left;margin:10px 20px 20px 0}.about-img-right{float:right;margin:10px 0 20px 20px}.save-link-options{float:right}.save-link-options input{margin-left:10px}#save-footer{border-top:none;margin-top:0}a:focus,button{outline:0;-moz-outline-style:none}.btn-default{border-color:#ddd}.btn-default:focus{background-color:#fff;border-color:#adadad}.btn-default:active,.btn-default:hover{background-color:#ebebeb;border-color:#adadad}.alert,.btn,.btn-lg,.dropdown-menu,.form-control,.modal-content,.nav-tabs>li>a,.popover,.tooltip-inner{border-radius:0!important}input[type=search]{-webkit-appearance:searchfield;box-shadow:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.modal{overflow-y:auto}.form-control{background-color:transparent}code{border:0;white-space:pre-wrap}.bootstrap-switch,.bootstrap-switch-container,.bootstrap-switch-handle-off,.bootstrap-switch-handle-on,.bootstrap-switch-label,pre{border-radius:0!important}#banner,.title{border-bottom:1px solid #ddd}blockquote{font-size:inherit}.panel-body:after,.panel-body:before{content:""}.sortable-ghost{opacity:.6}.colorpicker-element{float:left;margin-right:15px}.colorpicker-color,.colorpicker-color div{height:100px}.word-wrap{white-space:pre!important;word-wrap:normal!important;overflow-x:scroll!important}.clearfix{height:0}.blur{color:transparent!important;text-shadow:rgba(0,0,0,.95) 0 0 10px!important}.no-select{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.konami{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg);-moz-transform:rotate(180deg)}.hl1,.hlyellow{background-color:#fff000}.hl2,.hlblue{background-color:#95dfff}.hl3,.hlred{background-color:#ffb6b6}.hl4,.hlorange{background-color:#fcf8e3}.hl5,.hlgreen{background-color:#8de768}.title{color:#424242;background-color:#fafafa}.gutter{background-color:#eee;background-repeat:no-repeat;background-position:50%}.gutter.gutter-horizontal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos/EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAlSURBVChTYzxz5sx/BiBgAhEgwPju3TtUEZZ79+6BGcNcDQMDACWJMFs4hNOSAAAAAElFTkSuQmCC);cursor:ew-resize}.gutter.gutter-vertical{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAACCAYAAABPJGxCAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKL2lDQ1BJQ0MgUHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s3BCkeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAI0lEQVQYV2M8c+bMfwYgUFJSAlEM9+7dA9O05jOBSboDBgYAtPcYZ1oUA30AAAAASUVORK5CYII=);cursor:ns-resize}.operation{border:1px solid #999;border-top-width:0}.op_list .operation{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#rec_list .operation{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.arg-input,select{height:34px;border:1px solid #ddd;background-color:#fff;color:#424242}#controls{border-top:1px solid #ddd;background-color:#fafafa}.textarea-wrapper div,.textarea-wrapper textarea{font-family:Consolas,monospace;font-size:inherit}.io-info{font-weight:400;font-size:8pt}.arg-title,.category-title{font-weight:700}.arg-input{font-size:15px;line-height:1.428571429}select{padding:6px 8px}.arg[disabled]{background-color:#eee}textarea.arg{color:#424242}.break{color:#b94a48!important;background-color:#f2dede!important;border-color:#eed3d7!important}.category-title{background-color:#fafafa;border-bottom:1px solid #eee}.category-title[aria-expanded=true],.category-title[href='#catFavourites']{border-bottom-color:#ddd}.category-title.collapsed{border-bottom-color:#eee}.category-title:hover{color:#3a87ad}#search{border-bottom:1px solid #e3e3e3}.dropping-file{border:5px dashed #3a87ad!important}.selected-op{color:#c09853!important;background-color:#fcf8e3!important;border-color:#fbeed5!important}.option-item input[type=number]{font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;border:1px solid #ccc}.favourites-hover{color:#468847;background-color:#dff0d8;border:2px dashed #468847!important;padding:8px 8px 9px}#edit-favourites-list{border:1px solid #bce8f1}#edit-favourites-list .operation{border-left:none;border-right:none}#edit-favourites-list .operation:last-child{border-bottom:none}.subtext{font-style:italic;font-size:13px;color:#999}#save-footer{border-bottom:1px solid #e5e5e5}.flow-control-op{color:#396f3a!important;background-color:#c7e4ba!important;border-color:#b3dba2!important}#support-modal textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}#load-text,#save-text{font-family:Consolas,monospace}button.dropdown-toggle{background-color:#f4f4f4}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background-color:#fafafa}::-webkit-scrollbar-thumb{background-color:#ccc}::-webkit-scrollbar-thumb:hover{background-color:#bbb}::-webkit-scrollbar-corner{background-color:#fafafa}.disabled{color:#999!important;background-color:#dfdfdf!important;border-color:#cdcdcd!important}.grey{color:#333;background-color:#f5f5f5;border-color:#ddd}.dark-blue{color:#fff;background-color:#428bca;border-color:#428bca}.red{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.amber{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.green{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.blue{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1} Edit
Operations
    Recipe
      Input
      Output
      Operations
        Recipe
          Input
          Output
          >>>>>>> master +======= +function(a){"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=a():"undefined"!=typeof Package?Sortable=a():window.Sortable=a()}(function(){function a(a,b){if(!a||!a.nodeType||1!==a.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(a);this.el=a,this.options=b=s({},b),a[M]=this;var c={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(a.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(a,b){a.setData("Text",b.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var d in c)!(d in b)&&(b[d]=c[d]);W(b);for(var f in this)"_"===f.charAt(0)&&(this[f]=this[f].bind(this));this.nativeDraggable=!b.forceFallback&&Q,e(a,"mousedown",this._onTapStart),e(a,"touchstart",this._onTapStart),this.nativeDraggable&&(e(a,"dragover",this),e(a,"dragenter",this)),U.push(this._onDragOver),b.store&&this.sort(b.store.get(this))}function b(a){w&&w.state!==a&&(h(w,"display",a?"none":""),!a&&w.state&&x.insertBefore(w,t),w.state=a)}function c(a,b,c){if(a){c=c||O;do if(">*"===b&&a.parentNode===c||q(a,b))return a;while(a!==c&&(a=a.parentNode))}return null}function d(a){a.dataTransfer&&(a.dataTransfer.dropEffect="move"),a.preventDefault()}function e(a,b,c){a.addEventListener(b,c,!1)}function f(a,b,c){a.removeEventListener(b,c,!1)}function g(a,b,c){if(a)if(a.classList)a.classList[c?"add":"remove"](b);else{var d=(" "+a.className+" ").replace(L," ").replace(" "+b+" "," ");a.className=(d+(c?" "+b:"")).replace(L," ")}}function h(a,b,c){var d=a&&a.style;if(d){if(void 0===c)return O.defaultView&&O.defaultView.getComputedStyle?c=O.defaultView.getComputedStyle(a,""):a.currentStyle&&(c=a.currentStyle),void 0===b?c:c[b];b in d||(b="-webkit-"+b),d[b]=c+("string"==typeof c?"":"px")}}function i(a,b,c){if(a){var d=a.getElementsByTagName(b),e=0,f=d.length;if(c)for(;e5||b.clientX-(d.right+d.width)>5)&&c}function o(a){for(var b=a.tagName+a.className+a.src+a.href+a.textContent,c=b.length,d=0;c--;)d+=b.charCodeAt(c);return d.toString(36)}function p(a,b){var c=0;if(!a||!a.parentNode)return-1;for(;a&&(a=a.previousElementSibling);)"TEMPLATE"!==a.nodeName.toUpperCase()&&q(a,b)&&c++;return c}function q(a,b){if(a){b=b.split(".");var c=b.shift().toUpperCase(),d=new RegExp("\\s("+b.join("|")+")(?=\\s)","g");return!(""!==c&&a.nodeName.toUpperCase()!=c||b.length&&((" "+a.className+" ").match(d)||[]).length!=b.length)}return!1}function r(a,b){var c,d;return function(){void 0===c&&(c=arguments,d=this,setTimeout(function(){1===c.length?a.call(d,c[0]):a.apply(d,c),c=void 0},b))}}function s(a,b){if(a&&b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}if("undefined"==typeof window||"undefined"==typeof window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K={},L=/\s+/g,M="Sortable"+(new Date).getTime(),N=window,O=N.document,P=N.parseInt,Q=!!("draggable"in O.createElement("div")),R=function(a){return a=O.createElement("x"),a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents}(),S=!1,T=Math.abs,U=([].slice,[]),V=r(function(a,b,c){if(c&&b.scroll){var d,e,f,g,h=b.scrollSensitivity,i=b.scrollSpeed,j=a.clientX,k=a.clientY,l=window.innerWidth,m=window.innerHeight;if(A!==c&&(z=b.scroll,A=c,z===!0)){z=c;do if(z.offsetWidth-1){for(;d--;)U[d]({clientX:I.clientX,clientY:I.clientY,target:a,rootEl:b});break}a=b}while(b=b.parentNode);R||h(v,"display","")}},_onTouchMove:function(b){if(H){a.active||this._dragStarted(),this._appendGhost();var c=b.touches?b.touches[0]:b,d=c.clientX-H.clientX,e=c.clientY-H.clientY,f=b.touches?"translate3d("+d+"px,"+e+"px,0)":"translate("+d+"px,"+e+"px)";J=!0,I=c,h(v,"webkitTransform",f),h(v,"mozTransform",f),h(v,"msTransform",f),h(v,"transform",f),b.preventDefault()}},_appendGhost:function(){if(!v){var a,b=t.getBoundingClientRect(),c=h(t),d=this.options;v=t.cloneNode(!0),g(v,d.ghostClass,!1),g(v,d.fallbackClass,!0),h(v,"top",b.top-P(c.marginTop,10)),h(v,"left",b.left-P(c.marginLeft,10)),h(v,"width",b.width),h(v,"height",b.height),h(v,"opacity","0.8"),h(v,"position","fixed"),h(v,"zIndex","100000"),h(v,"pointerEvents","none"),d.fallbackOnBody&&O.body.appendChild(v)||x.appendChild(v),a=v.getBoundingClientRect(),h(v,"width",2*b.width-a.width),h(v,"height",2*b.height-a.height)}},_onDragStart:function(a,b){var c=a.dataTransfer,d=this.options;this._offUpEvents(),"clone"==G.pull&&(w=t.cloneNode(!0),h(w,"display","none"),x.insertBefore(w,t)),b?("touch"===b?(e(O,"touchmove",this._onTouchMove),e(O,"touchend",this._onDrop),e(O,"touchcancel",this._onDrop)):(e(O,"mousemove",this._onTouchMove),e(O,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(c&&(c.effectAllowed="move",d.setData&&d.setData.call(this,c,t)),e(O,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(a){var d,e,f,g=this.el,i=this.options,j=i.group,l=j.put,o=G===j,p=i.sort;if(void 0!==a.preventDefault&&(a.preventDefault(),!i.dragoverBubble&&a.stopPropagation()),J=!0,G&&!i.disabled&&(o?p||(f=!x.contains(t)):G.pull&&l&&(G.name===j.name||l.indexOf&&~l.indexOf(G.name)))&&(void 0===a.rootEl||a.rootEl===this.el)){if(V(a,i,this.el),S)return;if(d=c(a.target,i.draggable,g),e=t.getBoundingClientRect(),f)return b(!0),void(w||y?x.insertBefore(t,w||y):p||x.appendChild(t));if(0===g.children.length||g.children[0]===v||g===a.target&&(d=n(g,a))){if(d){if(d.animated)return;r=d.getBoundingClientRect()}b(o),k(x,g,t,e,d,r)!==!1&&(t.contains(g)||(g.appendChild(t),u=g),this._animate(e,t),d&&this._animate(r,d))}else if(d&&!d.animated&&d!==t&&void 0!==d.parentNode[M]){B!==d&&(B=d,C=h(d),D=h(d.parentNode));var q,r=d.getBoundingClientRect(),s=r.right-r.left,z=r.bottom-r.top,A=/left|right|inline/.test(C.cssFloat+C.display)||"flex"==D.display&&0===D["flex-direction"].indexOf("row"),E=d.offsetWidth>t.offsetWidth,F=d.offsetHeight>t.offsetHeight,H=(A?(a.clientX-r.left)/s:(a.clientY-r.top)/z)>.5,I=d.nextElementSibling,K=k(x,g,t,e,d,r);if(K!==!1){if(S=!0,setTimeout(m,30),b(o),1===K||K===-1)q=1===K;else if(A){var L=t.offsetTop,N=d.offsetTop;q=L===N?d.previousElementSibling===t&&!E||H&&E:N>L}else q=I!==t&&!F||H&&F;t.contains(g)||(q&&!I?g.appendChild(t):d.parentNode.insertBefore(t,q?I:d)),u=t.parentNode,this._animate(e,t),this._animate(r,d)}}}},_animate:function(a,b){var c=this.options.animation;if(c){var d=b.getBoundingClientRect();h(b,"transition","none"),h(b,"transform","translate3d("+(a.left-d.left)+"px,"+(a.top-d.top)+"px,0)"),b.offsetWidth,h(b,"transition","all "+c+"ms"),h(b,"transform","translate3d(0,0,0)"),clearTimeout(b.animated),b.animated=setTimeout(function(){h(b,"transition",""),h(b,"transform",""),b.animated=!1},c)}},_offUpEvents:function(){var a=this.el.ownerDocument;f(O,"touchmove",this._onTouchMove),f(a,"mouseup",this._onDrop),f(a,"touchend",this._onDrop),f(a,"touchcancel",this._onDrop)},_onDrop:function(b){var c=this.el,d=this.options;clearInterval(this._loopId),clearInterval(K.pid),clearTimeout(this._dragStartTimer),f(O,"mousemove",this._onTouchMove),this.nativeDraggable&&(f(O,"drop",this),f(c,"dragstart",this._onDragStart)),this._offUpEvents(),b&&(J&&(b.preventDefault(),!d.dropBubble&&b.stopPropagation()),v&&v.parentNode.removeChild(v),t&&(this.nativeDraggable&&f(t,"dragend",this),l(t),g(t,this.options.ghostClass,!1),g(t,this.options.chosenClass,!1),x!==u?(F=p(t,d.draggable),F>=0&&(j(null,u,"sort",t,x,E,F),j(this,x,"sort",t,x,E,F),j(null,u,"add",t,x,E,F),j(this,x,"remove",t,x,E,F))):(w&&w.parentNode.removeChild(w),t.nextSibling!==y&&(F=p(t,d.draggable),F>=0&&(j(this,x,"update",t,x,E,F),j(this,x,"sort",t,x,E,F)))),a.active&&(null!==F&&F!==-1||(F=E),j(this,x,"end",t,x,E,F),this.save()))),this._nulling()},_nulling:function(){x=t=u=v=y=w=z=A=H=I=J=F=B=C=G=a.active=null},handleEvent:function(a){var b=a.type;"dragover"===b||"dragenter"===b?t&&(this._onDragOver(a),d(a)):"drop"!==b&&"dragend"!==b||this._onDrop(a)},toArray:function(){for(var a,b=[],d=this.el.children,e=0,f=d.length,g=this.options;e0&&f<=1?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e=this.toHex(a,b,c,d);for(var f in this.colors)if(this.colors[f]===e)return f;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return c<0?c+=1:c>1&&(c-=1),6*c<1?a+(b-a)*c*6:2*c<1?b:3*c<2?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){b<0&&(b=0);var e;e=c<=.5?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){a=a||"rgba";var b=!1;switch(a){case"rgb":return b=this.toRGB(),this.rgbaIsTransparent(b)?"transparent":"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":return b=this.toRGB(),"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":return b=this.toHSL(),"hsl("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%)";case"hsla":return b=this.toHSL(),"hsla("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%,"+b.a+")";case"hex":return this.toHex();case"alias":return this.toAlias()||this.toHex();default:return b}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]&&this.colors[a.toLowerCase()]}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'"; } return output + ""; @@ -332,17 +332,17 @@ var Compress = { /** * Bzip2 Decompress operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {string} */ - run_bzip2_decompress: function(input, args) { + runBzip2Decompress: function(input, args) { var compressed = new Uint8Array(input), - bzip2_reader, + bzip2Reader, plain = ""; - bzip2_reader = bzip2.array(compressed); - plain = bzip2.simple(bzip2_reader); + bzip2Reader = bzip2.array(compressed); + plain = bzip2.simple(bzip2Reader); return plain; }, diff --git a/src/js/operations/Convert.js b/src/js/operations/Convert.js index 72e1a6e9..e10360ba 100755 --- a/src/js/operations/Convert.js +++ b/src/js/operations/Convert.js @@ -64,12 +64,12 @@ var Convert = { * @param {Object[]} args * @returns {number} */ - run_distance: function (input, args) { - var input_units = args[0], - output_units = args[1]; + runDistance: function (input, args) { + var inputUnits = args[0], + outputUnits = args[1]; - input = input * Convert.DISTANCE_FACTOR[input_units]; - return input / Convert.DISTANCE_FACTOR[output_units]; + input = input * Convert.DISTANCE_FACTOR[inputUnits]; + return input / Convert.DISTANCE_FACTOR[outputUnits]; // TODO Remove rounding errors (e.g. 1.000000000001) }, @@ -145,12 +145,12 @@ var Convert = { * @param {Object[]} args * @returns {number} */ - run_data_size: function (input, args) { - var input_units = args[0], - output_units = args[1]; + runDataSize: function (input, args) { + var inputUnits = args[0], + outputUnits = args[1]; - input = input * Convert.DATA_FACTOR[input_units]; - return input / Convert.DATA_FACTOR[output_units]; + input = input * Convert.DATA_FACTOR[inputUnits]; + return input / Convert.DATA_FACTOR[outputUnits]; }, @@ -225,12 +225,12 @@ var Convert = { * @param {Object[]} args * @returns {number} */ - run_area: function (input, args) { - var input_units = args[0], - output_units = args[1]; + runArea: function (input, args) { + var inputUnits = args[0], + outputUnits = args[1]; - input = input * Convert.AREA_FACTOR[input_units]; - return input / Convert.AREA_FACTOR[output_units]; + input = input * Convert.AREA_FACTOR[inputUnits]; + return input / Convert.AREA_FACTOR[outputUnits]; }, @@ -336,12 +336,12 @@ var Convert = { * @param {Object[]} args * @returns {number} */ - run_mass: function (input, args) { - var input_units = args[0], - output_units = args[1]; + runMass: function (input, args) { + var inputUnits = args[0], + outputUnits = args[1]; - input = input * Convert.MASS_FACTOR[input_units]; - return input / Convert.MASS_FACTOR[output_units]; + input = input * Convert.MASS_FACTOR[inputUnits]; + return input / Convert.MASS_FACTOR[outputUnits]; }, @@ -401,12 +401,12 @@ var Convert = { * @param {Object[]} args * @returns {number} */ - run_speed: function (input, args) { - var input_units = args[0], - output_units = args[1]; + runSpeed: function (input, args) { + var inputUnits = args[0], + outputUnits = args[1]; - input = input * Convert.SPEED_FACTOR[input_units]; - return input / Convert.SPEED_FACTOR[output_units]; + input = input * Convert.SPEED_FACTOR[inputUnits]; + return input / Convert.SPEED_FACTOR[outputUnits]; }, }; diff --git a/src/js/operations/DateTime.js b/src/js/operations/DateTime.js index f119978e..8e64f8f6 100755 --- a/src/js/operations/DateTime.js +++ b/src/js/operations/DateTime.js @@ -24,7 +24,7 @@ var DateTime = { * @param {Object[]} args * @returns {string} */ - run_from_unix_timestamp: function(input, args) { + runFromUnixTimestamp: function(input, args) { var units = args[0], d; @@ -55,7 +55,7 @@ var DateTime = { * @param {Object[]} args * @returns {number} */ - run_to_unix_timestamp: function(input, args) { + runToUnixTimestamp: function(input, args) { var units = args[0], d = moment(input); @@ -130,21 +130,21 @@ var DateTime = { * @param {Object[]} args * @returns {html} */ - run_translate_format: function(input, args) { - var input_format = args[1], - input_timezone = args[2], - output_format = args[3], - output_timezone = args[4], + runTranslateFormat: function(input, args) { + var inputFormat = args[1], + inputTimezone = args[2], + outputFormat = args[3], + outputTimezone = args[4], date; try { - date = moment.tz(input, input_format, input_timezone); + date = moment.tz(input, inputFormat, inputTimezone); if (!date || date.format() === "Invalid date") throw Error; } catch(err) { return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; } - return date.tz(output_timezone).format(output_format); + return date.tz(outputTimezone).format(outputFormat); }, @@ -155,14 +155,14 @@ var DateTime = { * @param {Object[]} args * @returns {html} */ - run_parse: function(input, args) { - var input_format = args[1], - input_timezone = args[2], + runParse: function(input, args) { + var inputFormat = args[1], + inputTimezone = args[2], date, output = ""; try { - date = moment.tz(input, input_format, input_timezone); + date = moment.tz(input, inputFormat, inputTimezone); if (!date || date.format() === "Invalid date") throw Error; } catch(err) { return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; diff --git a/src/js/operations/Endian.js b/src/js/operations/Endian.js index 13ce1ce6..c7cdf81d 100755 --- a/src/js/operations/Endian.js +++ b/src/js/operations/Endian.js @@ -32,39 +32,39 @@ var Endian = { * @param {Object[]} args * @returns {string} */ - run_swap_endianness: function(input, args) { - var data_format = args[0], - word_length = args[1], - pad_incomplete_words = args[2], + runSwapEndianness: function(input, args) { + var dataFormat = args[0], + wordLength = args[1], + padIncompleteWords = args[2], data = [], result = [], words = [], i = 0, j = 0; - if (word_length <= 0) { + if (wordLength <= 0) { return "Word length must be greater than 0"; } // Convert input to raw data based on specified data format - switch (data_format) { + switch (dataFormat) { case "Hex": - data = Utils.from_hex(input); + data = Utils.fromHex(input); break; case "Raw": - data = Utils.str_to_byte_array(input); + data = Utils.strToByteArray(input); break; default: data = input; } // Split up into words - for (i = 0; i < data.length; i += word_length) { - var word = data.slice(i, i + word_length); + for (i = 0; i < data.length; i += wordLength) { + var word = data.slice(i, i + wordLength); // Pad word if too short - if (pad_incomplete_words && word.length < word_length){ - for (j = word.length; j < word_length; j++) { + if (padIncompleteWords && word.length < wordLength){ + for (j = word.length; j < wordLength; j++) { word.push(0); } } @@ -81,11 +81,11 @@ var Endian = { } // Convert data back to specified data format - switch (data_format) { + switch (dataFormat) { case "Hex": - return Utils.to_hex(result); + return Utils.toHex(result); case "Raw": - return Utils.byte_array_to_utf8(result); + return Utils.byteArrayToUtf8(result); default: return result; } diff --git a/src/js/operations/Entropy.js b/src/js/operations/Entropy.js index cec9b3a1..8724c7c2 100755 --- a/src/js/operations/Entropy.js +++ b/src/js/operations/Entropy.js @@ -18,14 +18,14 @@ var Entropy = { /** * Entropy operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {html} */ - run_entropy: function(input, args) { - var chunk_size = args[0], + runEntropy: function(input, args) { + var chunkSize = args[0], output = "", - entropy = Entropy._calc_entropy(input); + entropy = Entropy._calcEntropy(input); output += "Shannon entropy: " + entropy + "\n" + "

          \n" + @@ -35,14 +35,14 @@ var Entropy = { "The following results show the entropy of chunks of the input data. Chunks with particularly high entropy could suggest encrypted or compressed sections.\n\n" + "
          "; - var chunk_entropy = 0; - if (chunk_size !== 0) { - for (var i = 0; i < input.length; i += chunk_size) { - chunk_entropy = Entropy._calc_entropy(input.slice(i, i+chunk_size)); - output += "Bytes " + i + " to " + (i+chunk_size) + ": " + chunk_entropy + "\n"; + var chunkEntropy = 0; + if (chunkSize !== 0) { + for (var i = 0; i < input.length; i += chunkSize) { + chunkEntropy = Entropy._calcEntropy(input.slice(i, i+chunkSize)); + output += "Bytes " + i + " to " + (i+chunkSize) + ": " + chunkEntropy + "\n"; } } else { output += "Chunk size cannot be 0."; @@ -78,17 +78,17 @@ var Entropy = { /** * Frequency distribution operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {html} */ - run_freq_distrib: function (input, args) { + runFreqDistrib: function (input, args) { if (!input.length) return "No data"; var distrib = new Array(256), percentages = new Array(256), len = input.length, - show_zeroes = args[0]; + showZeroes = args[0]; // Initialise distrib to 0 for (var i = 0; i < 256; i++) { @@ -115,19 +115,19 @@ var Entropy = { "\n\nByte Percentage\n" + ""; for (i = 0; i < 256; i++) { - if (distrib[i] || show_zeroes) { + if (distrib[i] || showZeroes) { output += " " + Utils.hex(i, 2) + " (" + - Utils.pad_right(percentages[i].toFixed(2).replace(".00", "") + "%)", 8) + + Utils.padRight(percentages[i].toFixed(2).replace(".00", "") + "%)", 8) + Array(Math.ceil(percentages[i])+1).join("|") + "\n"; } } @@ -140,13 +140,13 @@ var Entropy = { * Calculates the Shannon entropy for a given chunk of data. * * @private - * @param {byte_array} data + * @param {byteArray} data * @returns {number} */ - _calc_entropy: function(data) { + _calcEntropy: function(data) { var prob = [], uniques = data.unique(), - str = Utils.byte_array_to_chars(data); + str = Utils.byteArrayToChars(data); for (var i = 0; i < uniques.length; i++) { prob.push(str.count(Utils.chr(uniques[i])) / data.length); diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 816c72ad..64390a3c 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -10,29 +10,29 @@ var Extract = { /** - * Runs search operations across the input data using refular expressions. + * Runs search operations across the input data using regular expressions. * * @private * @param {string} input - * @param {RegExp} search_regex - * @param {RegExp} remove_regex - A regular expression defining results to remove from the + * @param {RegExp} searchRegex + * @param {RegExp} removeRegex - A regular expression defining results to remove from the * final list - * @param {boolean} include_total - Whether or not to include the total number of results + * @param {boolean} includeTotal - Whether or not to include the total number of results * @returns {string} */ - _search: function(input, search_regex, remove_regex, include_total) { + _search: function(input, searchRegex, removeRegex, includeTotal) { var output = "", total = 0, match; - while ((match = search_regex.exec(input))) { - if (remove_regex && remove_regex.test(match[0])) + while ((match = searchRegex.exec(input))) { + if (removeRegex && removeRegex.test(match[0])) continue; total++; output += match[0] + "\n"; } - if (include_total) + if (includeTotal) output = "Total found: " + total + "\n\n" + output; return output; @@ -57,13 +57,13 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_strings: function(input, args) { - var min_len = args[0] || Extract.MIN_STRING_LEN, - display_total = args[1], + runStrings: function(input, args) { + var minLen = args[0] || Extract.MIN_STRING_LEN, + displayTotal = args[1], strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]", - regex = new RegExp(strings + "{" + min_len + ",}", "ig"); + regex = new RegExp(strings + "{" + minLen + ",}", "ig"); - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -90,37 +90,37 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_ip: function(input, args) { - var include_ipv4 = args[0], - include_ipv6 = args[1], - remove_local = args[2], - display_total = args[3], + runIp: function(input, args) { + var includeIpv4 = args[0], + includeIpv6 = args[1], + removeLocal = args[2], + displayTotal = args[3], ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", ips = ""; - if (include_ipv4 && include_ipv6) { + if (includeIpv4 && includeIpv6) { ips = ipv4 + "|" + ipv6; - } else if (include_ipv4) { + } else if (includeIpv4) { ips = ipv4; - } else if (include_ipv6) { + } else if (includeIpv6) { ips = ipv6; } if (ips) { var regex = new RegExp(ips, "ig"); - if (remove_local) { + if (removeLocal) { var ten = "10\\..+", oneninetwo = "192\\.168\\..+", oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+", onetwoseven = "127\\..+", - remove_regex = new RegExp("^(?:" + ten + "|" + oneninetwo + + removeRegex = new RegExp("^(?:" + ten + "|" + oneninetwo + "|" + oneseventwo + "|" + onetwoseven + ")"); - return Extract._search(input, regex, remove_regex, display_total); + return Extract._search(input, regex, removeRegex, displayTotal); } else { - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); } } else { return ""; @@ -135,11 +135,11 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_email: function(input, args) { - var display_total = args[0], + runEmail: function(input, args) { + var displayTotal = args[0], regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig; - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -150,11 +150,11 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_mac: function(input, args) { - var display_total = args[0], + runMac: function(input, args) { + var displayTotal = args[0], regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig; - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -165,8 +165,8 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_urls: function(input, args) { - var display_total = args[0], + runUrls: function(input, args) { + var displayTotal = args[0], protocol = "[A-Z]+://", hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+", port = ":\\d+", @@ -175,7 +175,7 @@ var Extract = { path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*"; var regex = new RegExp(protocol + hostname + "(?:" + port + ")?(?:" + path + ")?", "ig"); - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -186,14 +186,14 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_domains: function(input, args) { - var display_total = args[0], + runDomains: function(input, args) { + var displayTotal = args[0], protocol = "https?://", hostname = "[-\\w\\.]+", tld = "\\.(?:com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+", regex = new RegExp("(?:" + protocol + ")?" + hostname + tld, "ig"); - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -215,29 +215,29 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_file_paths: function(input, args) { - var include_win_path = args[0], - include_unix_path = args[1], - display_total = args[2], - win_drive = "[A-Z]:\\\\", - win_name = "[A-Z\\d][A-Z\\d\\- '_\\(\\)]{0,61}", - win_ext = "[A-Z\\d]{1,6}", - win_path = win_drive + "(?:" + win_name + "\\\\?)*" + win_name + - "(?:\\." + win_ext + ")?", - unix_path = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+", - file_paths = ""; + runFilePaths: function(input, args) { + var includeWinPath = args[0], + includeUnixPath = args[1], + displayTotal = args[2], + winDrive = "[A-Z]:\\\\", + winName = "[A-Z\\d][A-Z\\d\\- '_\\(\\)]{0,61}", + winExt = "[A-Z\\d]{1,6}", + winPath = winDrive + "(?:" + winName + "\\\\?)*" + winName + + "(?:\\." + winExt + ")?", + unixPath = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+", + filePaths = ""; - if (include_win_path && include_unix_path) { - file_paths = win_path + "|" + unix_path; - } else if (include_win_path) { - file_paths = win_path; - } else if (include_unix_path) { - file_paths = unix_path; + if (includeWinPath && includeUnixPath) { + filePaths = winPath + "|" + unixPath; + } else if (includeWinPath) { + filePaths = winPath; + } else if (includeUnixPath) { + filePaths = unixPath; } - if (file_paths) { - var regex = new RegExp(file_paths, "ig"); - return Extract._search(input, regex, null, display_total); + if (filePaths) { + var regex = new RegExp(filePaths, "ig"); + return Extract._search(input, regex, null, displayTotal); } else { return ""; } @@ -251,14 +251,14 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_dates: function(input, args) { - var display_total = args[0], + runDates: function(input, args) { + var displayTotal = args[0], date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy regex = new RegExp(date1 + "|" + date2 + "|" + date3, "ig"); - return Extract._search(input, regex, null, display_total); + return Extract._search(input, regex, null, displayTotal); }, @@ -269,29 +269,29 @@ var Extract = { * @param {Object[]} args * @returns {string} */ - run_all_idents: function(input, args) { + runAllIdents: function(input, args) { var output = ""; output += "IP addresses\n"; - output += Extract.run_ip(input, [true, true, false]); + output += Extract.runIp(input, [true, true, false]); output += "\nEmail addresses\n"; - output += Extract.run_email(input, []); + output += Extract.runEmail(input, []); output += "\nMAC addresses\n"; - output += Extract.run_mac(input, []); + output += Extract.runMac(input, []); output += "\nURLs\n"; - output += Extract.run_urls(input, []); + output += Extract.runUrls(input, []); output += "\nDomain names\n"; - output += Extract.run_domains(input, []); + output += Extract.runDomains(input, []); output += "\nFile paths\n"; - output += Extract.run_file_paths(input, [true, true]); + output += Extract.runFilePaths(input, [true, true]); output += "\nDates\n"; - output += Extract.run_dates(input, []); + output += Extract.runDates(input, []); return output; }, - + }; diff --git a/src/js/operations/FileType.js b/src/js/operations/FileType.js index 6e2088f4..c265e418 100755 --- a/src/js/operations/FileType.js +++ b/src/js/operations/FileType.js @@ -12,12 +12,12 @@ var FileType = { /** * Detect File Type operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {string} */ - run_detect: function(input, args) { - var type = FileType._magic_type(input); + runDetect: function(input, args) { + var type = FileType._magicType(input); if (!type) { return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?"; @@ -43,26 +43,26 @@ var FileType = { /** * Scan for Embedded Files operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {string} */ - run_scan_for_embedded_files: function(input, args) { + runScanForEmbeddedFiles: function(input, args) { var output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally.\n", type, - ignore_common = args[0], - common_exts = ["ico", "ttf", ""], - num_found = 0, - num_common_found = 0; + ignoreCommon = args[0], + commonExts = ["ico", "ttf", ""], + numFound = 0, + numCommonFound = 0; for (var i = 0; i < input.length; i++) { - type = FileType._magic_type(input.slice(i)); + type = FileType._magicType(input.slice(i)); if (type) { - if (ignore_common && common_exts.indexOf(type.ext) > -1) { - num_common_found++; + if (ignoreCommon && commonExts.indexOf(type.ext) > -1) { + numCommonFound++; continue; } - num_found++; + numFound++; output += "\nOffset " + i + " (0x" + Utils.hex(i) + "):\n" + " File extension: " + type.ext + "\n" + " MIME type: " + type.mime + "\n"; @@ -73,13 +73,13 @@ var FileType = { } } - if (num_found === 0) { + if (numFound === 0) { output += "\nNo embedded files were found."; } - if (num_common_found > 0) { - output += "\n\n" + num_common_found; - output += num_common_found === 1 ? + if (numCommonFound > 0) { + output += "\n\n" + numCommonFound; + output += numCommonFound === 1 ? " file type was detected that has a common byte sequence. This is likely to be a false positive." : " file types were detected that have common byte sequences. These are likely to be false positives."; output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details."; @@ -94,13 +94,13 @@ var FileType = { * extension and mime type. * * @private - * @param {byte_array} buf + * @param {byteArray} buf * @returns {Object} type * @returns {string} type.ext - File extension * @returns {string} type.mime - Mime type * @returns {string} [type.desc] - Description */ - _magic_type: function (buf) { + _magicType: function (buf) { if (!(buf && buf.length > 1)) { return null; } diff --git a/src/js/operations/HTML.js b/src/js/operations/HTML.js index 0cb7c2dc..c07d43f0 100755 --- a/src/js/operations/HTML.js +++ b/src/js/operations/HTML.js @@ -27,35 +27,35 @@ var HTML = { * @param {Object[]} args * @returns {string} */ - run_to_entity: function(input, args) { - var convert_all = args[0], + runToEntity: function(input, args) { + var convertAll = args[0], numeric = args[1] === "Numeric entities", hexa = args[1] === "Hex entities"; - var charcodes = Utils.str_to_charcode(input); + var charcodes = Utils.strToCharcode(input); var output = ""; for (var i = 0; i < charcodes.length; i++) { - if (convert_all && numeric) { + if (convertAll && numeric) { output += "&#" + charcodes[i] + ";"; - } else if (convert_all && hexa) { + } else if (convertAll && hexa) { output += "&#x" + Utils.hex(charcodes[i]) + ";"; - } else if (convert_all) { - output += HTML._byte_to_entity[charcodes[i]] || "&#" + charcodes[i] + ";"; + } else if (convertAll) { + output += HTML._byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";"; } else if (numeric) { - if (charcodes[i] > 255 || HTML._byte_to_entity.hasOwnProperty(charcodes[i])) { + if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) { output += "&#" + charcodes[i] + ";"; } else { output += Utils.chr(charcodes[i]); } } else if (hexa) { - if (charcodes[i] > 255 || HTML._byte_to_entity.hasOwnProperty(charcodes[i])) { + if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) { output += "&#x" + Utils.hex(charcodes[i]) + ";"; } else { output += Utils.chr(charcodes[i]); } } else { - output += HTML._byte_to_entity[charcodes[i]] || ( + output += HTML._byteToEntity[charcodes[i]] || ( charcodes[i] > 255 ? "&#" + charcodes[i] + ";" : Utils.chr(charcodes[i]) @@ -73,7 +73,7 @@ var HTML = { * @param {Object[]} args * @returns {string} */ - run_from_entity: function(input, args) { + runFromEntity: function(input, args) { var regex = /&(#?x?[a-zA-Z0-9]{1,8});/g, output = "", m, @@ -85,7 +85,7 @@ var HTML = { output += input[i++]; // Add match - var bite = HTML._entity_to_byte[m[1]]; + var bite = HTML._entityToByte[m[1]]; if (bite) { output += Utils.chr(bite); } else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) { @@ -130,17 +130,17 @@ var HTML = { * @param {Object[]} args * @returns {string} */ - run_strip_tags: function(input, args) { - var remove_indentation = args[0], - remove_line_breaks = args[1]; + runStripTags: function(input, args) { + var removeIndentation = args[0], + removeLineBreaks = args[1]; - input = Utils.strip_html_tags(input); + input = Utils.stripHtmlTags(input); - if (remove_indentation) { + if (removeIndentation) { input = input.replace(/\n[ \f\t]+/g, "\n"); } - if (remove_line_breaks) { + if (removeLineBreaks) { input = input.replace(/^\s*\n/, "") // first line .replace(/(\n\s*){2,}/g, "\n"); // all others } @@ -156,7 +156,7 @@ var HTML = { * @param {Object[]} args * @returns {html} */ - run_parse_colour_code: function(input, args) { + runParseColourCode: function(input, args) { var m = null, r = 0, g = 0, b = 0, a = 1; @@ -177,7 +177,7 @@ var HTML = { var h_ = parseFloat(m[1]) / 360, s_ = parseFloat(m[2]) / 100, l_ = parseFloat(m[3]) / 100, - rgb_ = HTML._hsl_to_rgb(h_, s_, l_); + rgb_ = HTML._hslToRgb(h_, s_, l_); r = rgb_[0]; g = rgb_[1]; @@ -195,7 +195,7 @@ var HTML = { b = Math.round(255 * (1 - y_) * (1 - k_)); } - var hsl_ = HTML._rgb_to_hsl(r, g, b), + var hsl_ = HTML._rgbToHsl(r, g, b), h = Math.round(hsl_[0] * 360), s = Math.round(hsl_[1] * 100), l = Math.round(hsl_[2] * 100), @@ -210,9 +210,9 @@ var HTML = { k = k.toFixed(2); var hex = "#" + - Utils.pad_left(Math.round(r).toString(16), 2) + - Utils.pad_left(Math.round(g).toString(16), 2) + - Utils.pad_left(Math.round(b).toString(16), 2), + Utils.padLeft(Math.round(r).toString(16), 2) + + Utils.padLeft(Math.round(g).toString(16), 2) + + Utils.padLeft(Math.round(b).toString(16), 2), rgb = "rgb(" + r + ", " + g + ", " + b + ")", rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")", hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", @@ -237,7 +237,7 @@ var HTML = { var color = e.color.toRGB();\ document.getElementById('input-text').value = 'rgba(' +\ color.r + ', ' + color.g + ', ' + color.b + ', ' + color.a + ')';\ - window.app.auto_bake();\ + window.app.autoBake();\ });\ "; }, @@ -246,7 +246,7 @@ var HTML = { /** * Converts an HSL color value to RGB. Conversion formula - * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace. * Assumes h, s, and l are contained in the set [0, 1] and * returns r, g, and b in the set [0, 255]. * @@ -258,7 +258,7 @@ var HTML = { * @param {number} l - The lightness * @return {Array} The RGB representation */ - _hsl_to_rgb: function(h, s, l){ + _hslToRgb: function(h, s, l){ var r, g, b; if (s === 0){ @@ -286,7 +286,7 @@ var HTML = { /** * Converts an RGB color value to HSL. Conversion formula - * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace. * Assumes r, g, and b are contained in the set [0, 255] and * returns h, s, and l in the set [0, 1]. * @@ -298,7 +298,7 @@ var HTML = { * @param {number} b - The blue color value * @return {Array} The HSL representation */ - _rgb_to_hsl: function(r, g, b) { + _rgbToHsl: function(r, g, b) { r /= 255; g /= 255; b /= 255; var max = Math.max(r, g, b), min = Math.min(r, g, b), @@ -327,7 +327,7 @@ var HTML = { * @private * @constant */ - _byte_to_entity: { + _byteToEntity: { 34 : """, 38 : "&", 39 : "'", @@ -591,7 +591,7 @@ var HTML = { * @private * @constant */ - _entity_to_byte : { + _entityToByte : { "quot" : 34, "amp" : 38, "apos" : 39, diff --git a/src/js/operations/HTTP.js b/src/js/operations/HTTP.js index 5b3dcf2d..23ab44e8 100755 --- a/src/js/operations/HTTP.js +++ b/src/js/operations/HTTP.js @@ -18,11 +18,11 @@ var HTTP = { * @param {Object[]} args * @returns {string} */ - run_strip_headers: function(input, args) { - var header_end = input.indexOf("\r\n\r\n") + - (header_end < 0) ? input.indexOf("\n\n") + 2 : header_end + 4; + runStripHeaders: function(input, args) { + var headerEnd = input.indexOf("\r\n\r\n") + + (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4; - return (header_end < 2) ? input : input.slice(header_end, input.length); + return (headerEnd < 2) ? input : input.slice(headerEnd, input.length); }, @@ -33,8 +33,8 @@ var HTTP = { * @param {Object[]} args * @returns {string} */ - run_parse_user_agent: function(input, args) { - var ua = UAS_parser.parse(input); + runParseUserAgent: function(input, args) { + var ua = UAS_parser.parse(input); // eslint-disable-line camelcase return "Type: " + ua.type + "\n" + "Family: " + ua.uaFamily + "\n" + diff --git a/src/js/operations/Hash.js b/src/js/operations/Hash.js index 983d2bff..2d43e3de 100755 --- a/src/js/operations/Hash.js +++ b/src/js/operations/Hash.js @@ -1,4 +1,4 @@ -/* globals CryptoJS, Checksum */ +/* globals CryptoApi, CryptoJS, Checksum */ /** * Hashing operations. @@ -10,6 +10,30 @@ * @namespace */ var Hash = { + + /** + * MD2 operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runMD2: function (input, args) { + return Utils.toHexFast(CryptoApi.hash("md2", input, {})); + }, + + + /** + * MD4 operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runMD4: function (input, args) { + return Utils.toHexFast(CryptoApi.hash("md4", input, {})); + }, + /** * MD5 operation. @@ -18,10 +42,22 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_md5: function (input, args) { + runMD5: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex); }, + + + /** + * SHA0 operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runSHA0: function (input, args) { + return Utils.toHexFast(CryptoApi.hash("sha0", input, {})); + }, /** @@ -31,7 +67,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha1: function (input, args) { + runSHA1: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex); }, @@ -44,7 +80,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha224: function (input, args) { + runSHA224: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex); }, @@ -57,7 +93,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha256: function (input, args) { + runSHA256: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex); }, @@ -70,7 +106,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha384: function (input, args) { + runSHA384: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex); }, @@ -83,7 +119,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha512: function (input, args) { + runSHA512: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex); }, @@ -102,11 +138,11 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_sha3: function (input, args) { + runSHA3: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); - var sha3_length = args[0], + var sha3Length = args[0], options = { - outputLength: parseInt(sha3_length, 10) + outputLength: parseInt(sha3Length, 10) }; return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex); }, @@ -119,7 +155,7 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_ripemd160: function (input, args) { + runRIPEMD160: function (input, args) { input = CryptoJS.enc.Latin1.parse(input); return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex); }, @@ -138,8 +174,8 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_hmac: function (input, args) { - var hash_func = args[1]; + runHMAC: function (input, args) { + var hashFunc = args[1]; input = CryptoJS.enc.Latin1.parse(input); var execute = { "MD5": CryptoJS.HmacMD5(input, args[0]), @@ -151,7 +187,7 @@ var Hash = { "SHA3": CryptoJS.HmacSHA3(input, args[0]), "RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]), }; - return execute[hash_func].toString(CryptoJS.enc.Hex); + return execute[hashFunc].toString(CryptoJS.enc.Hex); }, @@ -162,23 +198,29 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_all: function (input, args) { - var byte_array = Utils.str_to_byte_array(input), - output = "MD5: " + Hash.run_md5(input, []) + - "\nSHA1: " + Hash.run_sha1(input, []) + - "\nSHA2 224: " + Hash.run_sha224(input, []) + - "\nSHA2 256: " + Hash.run_sha256(input, []) + - "\nSHA2 384: " + Hash.run_sha384(input, []) + - "\nSHA2 512: " + Hash.run_sha512(input, []) + - "\nSHA3 224: " + Hash.run_sha3(input, ["224"]) + - "\nSHA3 256: " + Hash.run_sha3(input, ["256"]) + - "\nSHA3 384: " + Hash.run_sha3(input, ["384"]) + - "\nSHA3 512: " + Hash.run_sha3(input, ["512"]) + - "\nRIPEMD-160: " + Hash.run_ripemd160(input, []) + + runAll: function (input, args) { + var byteArray = Utils.strToByteArray(input), + output = "MD2: " + Hash.runMD2(input, []) + + "\nMD4: " + Hash.runMD4(input, []) + + "\nMD5: " + Hash.runMD5(input, []) + + "\nSHA0: " + Hash.runSHA0(input, []) + + "\nSHA1: " + Hash.runSHA1(input, []) + + "\nSHA2 224: " + Hash.runSHA224(input, []) + + "\nSHA2 256: " + Hash.runSHA256(input, []) + + "\nSHA2 384: " + Hash.runSHA384(input, []) + + "\nSHA2 512: " + Hash.runSHA512(input, []) + + "\nSHA3 224: " + Hash.runSHA3(input, ["224"]) + + "\nSHA3 256: " + Hash.runSHA3(input, ["256"]) + + "\nSHA3 384: " + Hash.runSHA3(input, ["384"]) + + "\nSHA3 512: " + Hash.runSHA3(input, ["512"]) + + "\nRIPEMD-160: " + Hash.runRIPEMD160(input, []) + "\n\nChecksums:" + - "\nFletcher-16: " + Checksum.run_fletcher16(byte_array, []) + - "\nAdler-32: " + Checksum.run_adler32(byte_array, []) + - "\nCRC-32: " + Checksum.run_crc32(byte_array, []); + "\nFletcher-8: " + Checksum.runFletcher8(byteArray, []) + + "\nFletcher-16: " + Checksum.runFletcher16(byteArray, []) + + "\nFletcher-32: " + Checksum.runFletcher32(byteArray, []) + + "\nFletcher-64: " + Checksum.runFletcher64(byteArray, []) + + "\nAdler-32: " + Checksum.runAdler32(byteArray, []) + + "\nCRC-32: " + Checksum.runCRC32(byteArray, []); return output; }, @@ -191,38 +233,38 @@ var Hash = { * @param {Object[]} args * @returns {string} */ - run_analyse: function(input, args) { + runAnalyse: function(input, args) { input = input.replace(/\s/g, ""); var output = "", - byte_length = input.length / 2, - bit_length = byte_length * 8, - possible_hash_functions = []; + byteLength = input.length / 2, + bitLength = byteLength * 8, + possibleHashFunctions = []; if (!/^[a-f0-9]+$/i.test(input)) { return "Invalid hash"; } output += "Hash length: " + input.length + "\n" + - "Byte length: " + byte_length + "\n" + - "Bit length: " + bit_length + "\n\n" + + "Byte length: " + byteLength + "\n" + + "Bit length: " + bitLength + "\n\n" + "Based on the length, this hash could have been generated by one of the following hashing functions:\n"; - switch (bit_length) { + switch (bitLength) { case 4: - possible_hash_functions = [ + possibleHashFunctions = [ "Fletcher-4", "Luhn algorithm", "Verhoeff algorithm", ]; break; case 8: - possible_hash_functions = [ + possibleHashFunctions = [ "Fletcher-8", ]; break; case 16: - possible_hash_functions = [ + possibleHashFunctions = [ "BSD checksum", "CRC-16", "SYSV checksum", @@ -230,21 +272,21 @@ var Hash = { ]; break; case 32: - possible_hash_functions = [ + possibleHashFunctions = [ "CRC-32", "Fletcher-32", "Adler-32", ]; break; case 64: - possible_hash_functions = [ + possibleHashFunctions = [ "CRC-64", "RIPEMD-64", "SipHash", ]; break; case 128: - possible_hash_functions = [ + possibleHashFunctions = [ "MD5", "MD4", "MD2", @@ -255,7 +297,7 @@ var Hash = { ]; break; case 160: - possible_hash_functions = [ + possibleHashFunctions = [ "SHA-1", "SHA-0", "FSB-160", @@ -266,13 +308,13 @@ var Hash = { ]; break; case 192: - possible_hash_functions = [ + possibleHashFunctions = [ "Tiger", "HAVAL-192", ]; break; case 224: - possible_hash_functions = [ + possibleHashFunctions = [ "SHA-224", "SHA3-224", "ECOH-224", @@ -281,7 +323,7 @@ var Hash = { ]; break; case 256: - possible_hash_functions = [ + possibleHashFunctions = [ "SHA-256", "SHA3-256", "BLAKE-256", @@ -296,12 +338,12 @@ var Hash = { ]; break; case 320: - possible_hash_functions = [ + possibleHashFunctions = [ "RIPEMD-320", ]; break; case 384: - possible_hash_functions = [ + possibleHashFunctions = [ "SHA-384", "SHA3-384", "ECOH-384", @@ -309,7 +351,7 @@ var Hash = { ]; break; case 512: - possible_hash_functions = [ + possibleHashFunctions = [ "SHA-512", "SHA3-512", "BLAKE-512", @@ -324,18 +366,18 @@ var Hash = { ]; break; case 1024: - possible_hash_functions = [ + possibleHashFunctions = [ "Fowler-Noll-Vo", ]; break; default: - possible_hash_functions = [ + possibleHashFunctions = [ "Unknown" ]; break; } - return output + possible_hash_functions.join("\n"); + return output + possibleHashFunctions.join("\n"); }, }; diff --git a/src/js/operations/Hexdump.js b/src/js/operations/Hexdump.js index a4153811..fba95414 100755 --- a/src/js/operations/Hexdump.js +++ b/src/js/operations/Hexdump.js @@ -30,14 +30,14 @@ var Hexdump = { /** * To Hexdump operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {string} */ - run_to: function(input, args) { + runTo: function(input, args) { var length = args[0] || Hexdump.WIDTH; - var upper_case = args[1]; - var include_final_length = args[2]; + var upperCase = args[1]; + var includeFinalLength = args[2]; var output = "", padding = 2; for (var i = 0; i < input.length; i += length) { @@ -47,18 +47,18 @@ var Hexdump = { hexa += Utils.hex(buff[j], padding) + " "; } - var line_no = Utils.hex(i, 8); + var lineNo = Utils.hex(i, 8); - if (upper_case) { + if (upperCase) { hexa = hexa.toUpperCase(); - line_no = line_no.toUpperCase(); + lineNo = lineNo.toUpperCase(); } - output += line_no + " " + - Utils.pad_right(hexa, (length*(padding+1))) + - " |" + Utils.pad_right(Utils.printable(Utils.byte_array_to_chars(buff)), buff.length) + "|\n"; + output += lineNo + " " + + Utils.padRight(hexa, (length*(padding+1))) + + " |" + Utils.padRight(Utils.printable(Utils.byteArrayToChars(buff)), buff.length) + "|\n"; - if (include_final_length && i+buff.length === input.length) { + if (includeFinalLength && i+buff.length === input.length) { output += Utils.hex(i+buff.length, 8) + "\n"; } } @@ -72,15 +72,15 @@ var Hexdump = { * * @param {string} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_from: function(input, args) { + runFrom: function(input, args) { var output = [], regex = /^\s*(?:[\dA-F]{4,16}:?)?\s*((?:[\dA-F]{2}\s){1,8}(?:\s|[\dA-F]{2}-)(?:[\dA-F]{2}\s){1,8}|(?:[\dA-F]{2}\s|[\dA-F]{4}\s)+)/igm, block, line; while ((block = regex.exec(input))) { - line = Utils.from_hex(block[1].replace(/-/g, " ")); + line = Utils.fromHex(block[1].replace(/-/g, " ")); for (var i = 0; i < line.length; i++) { output.push(line[i]); } @@ -90,7 +90,7 @@ var Hexdump = { var w = (width - 13) / 4; // w should be the specified width of the hexdump and therefore a round number if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { - app.options.attempt_highlight = false; + app.options.attemptHighlight = false; } return output; }, @@ -105,7 +105,7 @@ var Hexdump = { * @param {Object[]} args * @returns {Object[]} pos */ - highlight_to: function(pos, args) { + highlightTo: function(pos, args) { // Calculate overall selection var w = args[0] || 16, width = 14 + (w*4), @@ -125,32 +125,32 @@ var Hexdump = { pos[0].end = line*width + 10 + offset*3 - 1; // Set up multiple selections for bytes - var start_line_num = Math.floor(pos[0].start / width); - var end_line_num = Math.floor(pos[0].end / width); + var startLineNum = Math.floor(pos[0].start / width); + var endLineNum = Math.floor(pos[0].end / width); - if (start_line_num === end_line_num) { + if (startLineNum === endLineNum) { pos.push(pos[0]); } else { start = pos[0].start; - end = (start_line_num+1) * width - w - 5; + end = (startLineNum+1) * width - w - 5; pos.push({ start: start, end: end }); while (end < pos[0].end) { - start_line_num++; - start = start_line_num * width + 10; - end = (start_line_num+1) * width - w - 5; + startLineNum++; + start = startLineNum * width + 10; + end = (startLineNum+1) * width - w - 5; if (end > pos[0].end) end = pos[0].end; pos.push({ start: start, end: end }); } } // Set up multiple selections for ASCII - var len = pos.length, line_num = 0; + var len = pos.length, lineNum = 0; start = 0; end = 0; for (var i = 1; i < len; i++) { - line_num = Math.floor(pos[i].start / width); - start = (((pos[i].start - (line_num * width)) - 10) / 3) + (width - w -2) + (line_num * width); - end = (((pos[i].end + 1 - (line_num * width)) - 10) / 3) + (width - w -2) + (line_num * width); + lineNum = Math.floor(pos[i].start / width); + start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); pos.push({ start: start, end: end }); } return pos; @@ -166,7 +166,7 @@ var Hexdump = { * @param {Object[]} args * @returns {Object[]} pos */ - highlight_from: function(pos, args) { + highlightFrom: function(pos, args) { var w = args[0] || 16; var width = 14 + (w*4); diff --git a/src/js/operations/IP.js b/src/js/operations/IP.js index 03155f84..122027b0 100755 --- a/src/js/operations/IP.js +++ b/src/js/operations/IP.js @@ -34,26 +34,26 @@ var IP = { * @param {Object[]} args * @returns {string} */ - run_parse_ip_range: function (input, args) { - var include_network_info = args[0], - enumerate_addresses = args[1], - allow_large_list = args[2]; + runParseIpRange: function (input, args) { + var includeNetworkInfo = args[0], + enumerateAddresses = args[1], + allowLargeList = args[2]; // Check what type of input we are looking at - var ipv4_cidr_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, - ipv4_range_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, - ipv6_cidr_regex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, - ipv6_range_regex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, + var ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, + ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, + ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, + ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, match; - if ((match = ipv4_cidr_regex.exec(input))) { - return IP._ipv4_cidr_range(match, include_network_info, enumerate_addresses, allow_large_list); - } else if ((match = ipv4_range_regex.exec(input))) { - return IP._ipv4_hyphenated_range(match, include_network_info, enumerate_addresses, allow_large_list); - } else if ((match = ipv6_cidr_regex.exec(input))) { - return IP._ipv6_cidr_range(match, include_network_info); - } else if ((match = ipv6_range_regex.exec(input))) { - return IP._ipv6_hyphenated_range(match, include_network_info); + if ((match = ipv4CidrRegex.exec(input))) { + return IP._ipv4CidrRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList); + } else if ((match = ipv4RangeRegex.exec(input))) { + return IP._ipv4HyphenatedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList); + } else if ((match = ipv6CidrRegex.exec(input))) { + return IP._ipv6CidrRange(match, includeNetworkInfo); + } else if ((match = ipv6RangeRegex.exec(input))) { + return IP._ipv6HyphenatedRange(match, includeNetworkInfo); } else { return "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported."; } @@ -64,12 +64,12 @@ var IP = { * @constant * @default */ - IPv4_REGEX: /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, + IPV4_REGEX: /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, /** * @constant * @default */ - IPv6_REGEX: /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, + IPV6_REGEX: /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, /** * Parse IPv6 address operation. @@ -78,14 +78,14 @@ var IP = { * @param {Object[]} args * @returns {string} */ - run_parse_ipv6: function (input, args) { + runParseIpv6: function (input, args) { var match, output = ""; - if ((match = IP.IPv6_REGEX.exec(input))) { - var ipv6 = IP._str_to_ipv6(match[1]), - longhand = IP._ipv6_to_str(ipv6), - shorthand = IP._ipv6_to_str(ipv6, true); + if ((match = IP.IPV6_REGEX.exec(input))) { + var ipv6 = IP._strToIpv6(match[1]), + longhand = IP._ipv6ToStr(ipv6), + shorthand = IP._ipv6ToStr(ipv6, true); output += "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n"; @@ -102,13 +102,13 @@ var IP = { ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) { // IPv4-mapped IPv6 address output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; - output += "\nMapped IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); + output += "\nMapped IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96"; } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) { // IPv4-translated address output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; - output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); + output += "\nTranslated IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96"; } else if (ipv6[0] === 0x100) { // Discard prefix per RFC 6666 @@ -118,50 +118,50 @@ var IP = { ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) { // IPv4/IPv6 translation per RFC 6052 output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details."; - output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); + output += "\nTranslated IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\n'Well-Known prefix range: 64:ff9b::/96"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0) { // Teredo tunneling output += "\nTeredo tunneling IPv6 address detected\n"; - var server_ipv4 = (ipv6[2] << 16) + ipv6[3], - udp_port = (~ipv6[5]) & 0xffff, - client_ipv4 = ~((ipv6[6] << 16) + ipv6[7]), - flag_cone = (ipv6[4] >>> 15) & 1, - flag_r = (ipv6[4] >>> 14) & 1, - flag_random1 = (ipv6[4] >>> 10) & 15, - flag_ug = (ipv6[4] >>> 8) & 3, - flag_random2 = ipv6[4] & 255; + var serverIpv4 = (ipv6[2] << 16) + ipv6[3], + udpPort = (~ipv6[5]) & 0xffff, + clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), + flagCone = (ipv6[4] >>> 15) & 1, + flagR = (ipv6[4] >>> 14) & 1, + flagRandom1 = (ipv6[4] >>> 10) & 15, + flagUg = (ipv6[4] >>> 8) & 3, + flagRandom2 = ipv6[4] & 255; - output += "\nServer IPv4 address: " + IP._ipv4_to_str(server_ipv4) + - "\nClient IPv4 address: " + IP._ipv4_to_str(client_ipv4) + - "\nClient UDP port: " + udp_port + + output += "\nServer IPv4 address: " + IP._ipv4ToStr(serverIpv4) + + "\nClient IPv4 address: " + IP._ipv4ToStr(clientIpv4) + + "\nClient UDP port: " + udpPort + "\nFlags:" + - "\n\tCone: " + flag_cone; + "\n\tCone: " + flagCone; - if (flag_cone) { + if (flagCone) { output += " (Client is behind a cone NAT)"; } else { output += " (Client is not behind a cone NAT)"; } - output += "\n\tR: " + flag_r; + output += "\n\tR: " + flagR; - if (flag_r) { + if (flagR) { output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380."; } - output += "\n\tRandom1: " + Utils.bin(flag_random1, 4) + - "\n\tUG: " + Utils.bin(flag_ug, 2); + output += "\n\tRandom1: " + Utils.bin(flagRandom1, 4) + + "\n\tUG: " + Utils.bin(flagUg, 2); - if (flag_ug) { + if (flagUg) { output += " Error: This flag should be set to 00. See RFC 4380."; } - output += "\n\tRandom2: " + Utils.bin(flag_random2, 8); + output += "\n\tRandom2: " + Utils.bin(flagRandom2, 8); - if (!flag_r && !flag_ug && flag_random1 && flag_random2) { + if (!flagR && !flagUg && flagRandom1 && flagRandom2) { output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991."; - } else if (!flag_r && !flag_ug) { + } else if (!flagR && !flagUg) { output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; } else { output += "\n\nThis is an invalid Teredo address."; @@ -187,15 +187,15 @@ var IP = { output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + "\n6to4 prefix range: 2002::/16"; - var v4_addr = IP._ipv4_to_str((ipv6[1] << 16) + ipv6[2]), - sla_id = ipv6[3], - interface_id_str = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), - interface_id = new BigInteger(interface_id_str, 16); + var v4Addr = IP._ipv4ToStr((ipv6[1] << 16) + ipv6[2]), + slaId = ipv6[3], + interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), + interfaceId = new BigInteger(interfaceIdStr, 16); - output += "\n\nEncapsulated IPv4 address: " + v4_addr + - "\nSLA ID: " + sla_id + - "\nInterface ID (base 16): " + interface_id_str + - "\nInterface ID (base 10): " + interface_id.toString(); + output += "\n\nEncapsulated IPv4 address: " + v4Addr + + "\nSLA ID: " + slaId + + "\nInterface ID (base 16): " + interfaceIdStr + + "\nInterface ID (base 10): " + interfaceId.toString(); } else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) { // Unique local address output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; @@ -229,9 +229,9 @@ var IP = { * @param {Object[]} args * @returns {string} */ - run_change_ip_format: function(input, args) { - var in_format = args[0], - out_format = args[1], + runChangeIpFormat: function(input, args) { + var inFormat = args[0], + outFormat = args[1], lines = input.split("\n"), output = "", j = 0; @@ -239,54 +239,54 @@ var IP = { for (var i = 0; i < lines.length; i++) { if (lines[i] === "") continue; - var ba_ip = []; + var baIp = []; - if (in_format === out_format) { + if (inFormat === outFormat) { output += lines[i] + "\n"; continue; } // Convert to byte array IP from input format - switch (in_format) { + switch (inFormat) { case "Dotted Decimal": var octets = lines[i].split("."); for (j = 0; j < octets.length; j++) { - ba_ip.push(parseInt(octets[j], 10)); + baIp.push(parseInt(octets[j], 10)); } break; case "Decimal": var decimal = lines[i].toString(); - ba_ip.push(decimal >> 24 & 255); - ba_ip.push(decimal >> 16 & 255); - ba_ip.push(decimal >> 8 & 255); - ba_ip.push(decimal & 255); + baIp.push(decimal >> 24 & 255); + baIp.push(decimal >> 16 & 255); + baIp.push(decimal >> 8 & 255); + baIp.push(decimal & 255); break; case "Hex": - ba_ip = Utils.hex_to_byte_array(lines[i]); + baIp = Utils.hexToByteArray(lines[i]); break; default: throw "Unsupported input IP format"; } // Convert byte array IP to output format - switch (out_format) { + switch (outFormat) { case "Dotted Decimal": - var dd_ip = ""; - for (j = 0; j < ba_ip.length; j++) { - dd_ip += ba_ip[j] + "."; + var ddIp = ""; + for (j = 0; j < baIp.length; j++) { + ddIp += baIp[j] + "."; } - output += dd_ip.slice(0, dd_ip.length-1) + "\n"; + output += ddIp.slice(0, ddIp.length-1) + "\n"; break; case "Decimal": - var dec_ip = ((ba_ip[0] << 24) | (ba_ip[1] << 16) | (ba_ip[2] << 8) | ba_ip[3]) >>> 0; - output += dec_ip.toString() + "\n"; + var decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; + output += decIp.toString() + "\n"; break; case "Hex": - var hex_ip = ""; - for (j = 0; j < ba_ip.length; j++) { - hex_ip += Utils.hex(ba_ip[j]); + var hexIp = ""; + for (j = 0; j < baIp.length; j++) { + hexIp += Utils.hex(baIp[j]); } - output += hex_ip + "\n"; + output += hexIp + "\n"; break; default: throw "Unsupported output IP format"; @@ -320,20 +320,20 @@ var IP = { * @param {Object[]} args * @returns {string} */ - run_group_ips: function(input, args) { - var delim = Utils.char_rep[args[0]], + runGroupIps: function(input, args) { + var delim = Utils.charRep[args[0]], cidr = args[1], - only_subnets = args[2], - ipv4_mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, - ipv6_mask = IP._gen_ipv6_mask(cidr), + onlySubnets = args[2], + ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, + ipv6Mask = IP._genIpv6Mask(cidr), ips = input.split(delim), - ipv4_networks = {}, - ipv6_networks = {}, + ipv4Networks = {}, + ipv6Networks = {}, match = null, output = "", ip = null, network = null, - network_str = ""; + networkStr = ""; if (cidr < 0 || cidr > 127) { return "CIDR must be less than 32 for IPv4 or 128 for IPv6"; @@ -341,57 +341,57 @@ var IP = { // Parse all IPs and add to network dictionary for (var i = 0; i < ips.length; i++) { - if ((match = IP.IPv4_REGEX.exec(ips[i]))) { - ip = IP._str_to_ipv4(match[1]) >>> 0; - network = ip & ipv4_mask; + if ((match = IP.IPV4_REGEX.exec(ips[i]))) { + ip = IP._strToIpv4(match[1]) >>> 0; + network = ip & ipv4Mask; - if (ipv4_networks.hasOwnProperty(network)) { - ipv4_networks[network].push(ip); + if (ipv4Networks.hasOwnProperty(network)) { + ipv4Networks[network].push(ip); } else { - ipv4_networks[network] = [ip]; + ipv4Networks[network] = [ip]; } - } else if ((match = IP.IPv6_REGEX.exec(ips[i]))) { - ip = IP._str_to_ipv6(match[1]); + } else if ((match = IP.IPV6_REGEX.exec(ips[i]))) { + ip = IP._strToIpv6(match[1]); network = []; - network_str = ""; + networkStr = ""; for (var j = 0; j < 8; j++) { - network.push(ip[j] & ipv6_mask[j]); + network.push(ip[j] & ipv6Mask[j]); } - network_str = IP._ipv6_to_str(network, true); + networkStr = IP._ipv6ToStr(network, true); - if (ipv6_networks.hasOwnProperty(network_str)) { - ipv6_networks[network_str].push(ip); + if (ipv6Networks.hasOwnProperty(networkStr)) { + ipv6Networks[networkStr].push(ip); } else { - ipv6_networks[network_str] = [ip]; + ipv6Networks[networkStr] = [ip]; } } } // Sort IPv4 network dictionaries and print - for (network in ipv4_networks) { - ipv4_networks[network] = ipv4_networks[network].sort(); + for (network in ipv4Networks) { + ipv4Networks[network] = ipv4Networks[network].sort(); - output += IP._ipv4_to_str(network) + "/" + cidr + "\n"; + output += IP._ipv4ToStr(network) + "/" + cidr + "\n"; - if (!only_subnets) { - for (i = 0; i < ipv4_networks[network].length; i++) { - output += " " + IP._ipv4_to_str(ipv4_networks[network][i]) + "\n"; + if (!onlySubnets) { + for (i = 0; i < ipv4Networks[network].length; i++) { + output += " " + IP._ipv4ToStr(ipv4Networks[network][i]) + "\n"; } output += "\n"; } } // Sort IPv6 network dictionaries and print - for (network_str in ipv6_networks) { - //ipv6_networks[network_str] = ipv6_networks[network_str].sort(); TODO + for (networkStr in ipv6Networks) { + //ipv6Networks[networkStr] = ipv6Networks[networkStr].sort(); TODO - output += network_str + "/" + cidr + "\n"; + output += networkStr + "/" + cidr + "\n"; - if (!only_subnets) { - for (i = 0; i < ipv6_networks[network_str].length; i++) { - output += " " + IP._ipv6_to_str(ipv6_networks[network_str][i], true) + "\n"; + if (!onlySubnets) { + for (i = 0; i < ipv6Networks[networkStr].length; i++) { + output += " " + IP._ipv6ToStr(ipv6Networks[networkStr][i], true) + "\n"; } output += "\n"; } @@ -413,35 +413,35 @@ var IP = { * * @private * @param {RegExp} cidr - * @param {boolean} include_network_info - * @param {boolean} enumerate_addresses - * @param {boolean} allow_large_list + * @param {boolean} includeNetworkInfo + * @param {boolean} enumerateAddresses + * @param {boolean} allowLargeList * @returns {string} */ - _ipv4_cidr_range: function(cidr, include_network_info, enumerate_addresses, allow_large_list) { + _ipv4CidrRange: function(cidr, includeNetworkInfo, enumerateAddresses, allowLargeList) { var output = "", - network = IP._str_to_ipv4(cidr[1]), - cidr_range = parseInt(cidr[2], 10); + network = IP._strToIpv4(cidr[1]), + cidrRange = parseInt(cidr[2], 10); - if (cidr_range < 0 || cidr_range > 31) { + if (cidrRange < 0 || cidrRange > 31) { return "IPv4 CIDR must be less than 32"; } - var mask = ~(0xFFFFFFFF >>> cidr_range), + var mask = ~(0xFFFFFFFF >>> cidrRange), ip1 = network & mask, ip2 = ip1 | ~mask; - if (include_network_info) { - output += "Network: " + IP._ipv4_to_str(network) + "\n"; - output += "CIDR: " + cidr_range + "\n"; - output += "Mask: " + IP._ipv4_to_str(mask) + "\n"; - output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n"; + if (includeNetworkInfo) { + output += "Network: " + IP._ipv4ToStr(network) + "\n"; + output += "CIDR: " + cidrRange + "\n"; + output += "Mask: " + IP._ipv4ToStr(mask) + "\n"; + output += "Range: " + IP._ipv4ToStr(ip1) + " - " + IP._ipv4ToStr(ip2) + "\n"; output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; } - if (enumerate_addresses) { - if (cidr_range >= 16 || allow_large_list) { - output += IP._generate_ipv4_range(ip1, ip2).join("\n"); + if (enumerateAddresses) { + if (cidrRange >= 16 || allowLargeList) { + output += IP._generateIpv4Range(ip1, ip2).join("\n"); } else { output += IP._LARGE_RANGE_ERROR; } @@ -455,42 +455,42 @@ var IP = { * * @private * @param {RegExp} cidr - * @param {boolean} include_network_info + * @param {boolean} includeNetworkInfo * @returns {string} */ - _ipv6_cidr_range: function(cidr, include_network_info) { + _ipv6CidrRange: function(cidr, includeNetworkInfo) { var output = "", - network = IP._str_to_ipv6(cidr[1]), - cidr_range = parseInt(cidr[cidr.length-1], 10); + network = IP._strToIpv6(cidr[1]), + cidrRange = parseInt(cidr[cidr.length-1], 10); - if (cidr_range < 0 || cidr_range > 127) { + if (cidrRange < 0 || cidrRange > 127) { return "IPv6 CIDR must be less than 128"; } - var mask = IP._gen_ipv6_mask(cidr_range), + var mask = IP._genIpv6Mask(cidrRange), ip1 = new Array(8), ip2 = new Array(8), - total_diff = "", + totalDiff = "", total = new Array(128); for (var i = 0; i < 8; i++) { ip1[i] = network[i] & mask[i]; ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF); - total_diff = (ip2[i] - ip1[i]).toString(2); + totalDiff = (ip2[i] - ip1[i]).toString(2); - if (total_diff !== "0") { - for (var n = 0; n < total_diff.length; n++) { - total[i*16 + 16-(total_diff.length-n)] = total_diff[n]; + if (totalDiff !== "0") { + for (var n = 0; n < totalDiff.length; n++) { + total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n]; } } } - if (include_network_info) { - output += "Network: " + IP._ipv6_to_str(network) + "\n"; - output += "Shorthand: " + IP._ipv6_to_str(network, true) + "\n"; - output += "CIDR: " + cidr_range + "\n"; - output += "Mask: " + IP._ipv6_to_str(mask) + "\n"; - output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n"; + if (includeNetworkInfo) { + output += "Network: " + IP._ipv6ToStr(network) + "\n"; + output += "Shorthand: " + IP._ipv6ToStr(network, true) + "\n"; + output += "CIDR: " + cidrRange + "\n"; + output += "Mask: " + IP._ipv6ToStr(mask) + "\n"; + output += "Range: " + IP._ipv6ToStr(ip1) + " - " + IP._ipv6ToStr(ip2) + "\n"; output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; } @@ -505,7 +505,7 @@ var IP = { * @param {number} cidr * @returns {number[]} */ - _gen_ipv6_mask: function(cidr) { + _genIpv6Mask: function(cidr) { var mask = new Array(8), shift; @@ -529,15 +529,15 @@ var IP = { * * @private * @param {RegExp} range - * @param {boolean} include_network_info - * @param {boolean} enumerate_addresses - * @param {boolean} allow_large_list + * @param {boolean} includeNetworkInfo + * @param {boolean} enumerateAddresses + * @param {boolean} allowLargeList * @returns {string} */ - _ipv4_hyphenated_range: function(range, include_network_info, enumerate_addresses, allow_large_list) { + _ipv4HyphenatedRange: function(range, includeNetworkInfo, enumerateAddresses, allowLargeList) { var output = "", - ip1 = IP._str_to_ipv4(range[1]), - ip2 = IP._str_to_ipv4(range[2]); + ip1 = IP._strToIpv4(range[1]), + ip2 = IP._strToIpv4(range[2]); // Calculate mask var diff = ip1 ^ ip2, @@ -552,23 +552,23 @@ var IP = { mask = ~mask >>> 0; var network = ip1 & mask, - sub_ip1 = network & mask, - sub_ip2 = sub_ip1 | ~mask; + subIp1 = network & mask, + subIp2 = subIp1 | ~mask; - if (include_network_info) { + if (includeNetworkInfo) { output += "Minimum subnet required to hold this range:\n"; - output += "\tNetwork: " + IP._ipv4_to_str(network) + "\n"; + output += "\tNetwork: " + IP._ipv4ToStr(network) + "\n"; output += "\tCIDR: " + cidr + "\n"; - output += "\tMask: " + IP._ipv4_to_str(mask) + "\n"; - output += "\tSubnet range: " + IP._ipv4_to_str(sub_ip1) + " - " + IP._ipv4_to_str(sub_ip2) + "\n"; - output += "\tTotal addresses in subnet: " + (((sub_ip2 - sub_ip1) >>> 0) + 1) + "\n\n"; - output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n"; + output += "\tMask: " + IP._ipv4ToStr(mask) + "\n"; + output += "\tSubnet range: " + IP._ipv4ToStr(subIp1) + " - " + IP._ipv4ToStr(subIp2) + "\n"; + output += "\tTotal addresses in subnet: " + (((subIp2 - subIp1) >>> 0) + 1) + "\n\n"; + output += "Range: " + IP._ipv4ToStr(ip1) + " - " + IP._ipv4ToStr(ip2) + "\n"; output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; } - if (enumerate_addresses) { - if (((ip2 - ip1) >>> 0) <= 65536 || allow_large_list) { - output += IP._generate_ipv4_range(ip1, ip2).join("\n"); + if (enumerateAddresses) { + if (((ip2 - ip1) >>> 0) <= 65536 || allowLargeList) { + output += IP._generateIpv4Range(ip1, ip2).join("\n"); } else { output += IP._LARGE_RANGE_ERROR; } @@ -582,13 +582,13 @@ var IP = { * * @private * @param {RegExp} range - * @param {boolean} include_network_info + * @param {boolean} includeNetworkInfo * @returns {string} */ - _ipv6_hyphenated_range: function(range, include_network_info) { + _ipv6HyphenatedRange: function(range, includeNetworkInfo) { var output = "", - ip1 = IP._str_to_ipv6(range[1]), - ip2 = IP._str_to_ipv6(range[14]); + ip1 = IP._strToIpv6(range[1]), + ip2 = IP._strToIpv6(range[14]); var t = "", total = new Array(128); @@ -606,9 +606,9 @@ var IP = { } } - if (include_network_info) { - output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n"; - output += "Shorthand range: " + IP._ipv6_to_str(ip1, true) + " - " + IP._ipv6_to_str(ip2, true) + "\n"; + if (includeNetworkInfo) { + output += "Range: " + IP._ipv6ToStr(ip1) + " - " + IP._ipv6ToStr(ip2) + "\n"; + output += "Shorthand range: " + IP._ipv6ToStr(ip1, true) + " - " + IP._ipv6ToStr(ip2, true) + "\n"; output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; } @@ -620,36 +620,36 @@ var IP = { * Converts an IPv4 address from string format to numerical format. * * @private - * @param {string} ip_str + * @param {string} ipStr * @returns {number} * * @example * // returns 168427520 - * IP._str_to_ipv4("10.10.0.0"); + * IP._strToIpv4("10.10.0.0"); */ - _str_to_ipv4: function (ip_str) { - var blocks = ip_str.split("."), - num_blocks = parse_blocks(blocks), + _strToIpv4: function (ipStr) { + var blocks = ipStr.split("."), + numBlocks = parseBlocks(blocks), result = 0; - result += num_blocks[0] << 24; - result += num_blocks[1] << 16; - result += num_blocks[2] << 8; - result += num_blocks[3]; + result += numBlocks[0] << 24; + result += numBlocks[1] << 16; + result += numBlocks[2] << 8; + result += numBlocks[3]; return result; - function parse_blocks(blocks) { + function parseBlocks(blocks) { if (blocks.length !== 4) throw "More than 4 blocks."; - var num_blocks = []; + var numBlocks = []; for (var i = 0; i < 4; i++) { - num_blocks[i] = parseInt(blocks[i], 10); - if (num_blocks[i] < 0 || num_blocks[i] > 255) + numBlocks[i] = parseInt(blocks[i], 10); + if (numBlocks[i] < 0 || numBlocks[i] > 255) throw "Block out of range."; } - return num_blocks; + return numBlocks; } }, @@ -658,18 +658,18 @@ var IP = { * Converts an IPv4 address from numerical format to string format. * * @private - * @param {number} ip_int + * @param {number} ipInt * @returns {string} * * @example * // returns "10.10.0.0" - * IP._ipv4_to_str(168427520); + * IP._ipv4ToStr(168427520); */ - _ipv4_to_str: function(ip_int) { - var blockA = (ip_int >> 24) & 255, - blockB = (ip_int >> 16) & 255, - blockC = (ip_int >> 8) & 255, - blockD = ip_int & 255; + _ipv4ToStr: function(ipInt) { + var blockA = (ipInt >> 24) & 255, + blockB = (ipInt >> 16) & 255, + blockC = (ipInt >> 8) & 255, + blockD = ipInt & 255; return blockA + "." + blockB + "." + blockC + "." + blockD; }, @@ -679,40 +679,40 @@ var IP = { * Converts an IPv6 address from string format to numerical array format. * * @private - * @param {string} ip_str + * @param {string} ipStr * @returns {number[]} * * @example * // returns [65280, 0, 0, 0, 0, 0, 4369, 8738] - * IP._str_to_ipv6("ff00::1111:2222"); + * IP._strToIpv6("ff00::1111:2222"); */ - _str_to_ipv6: function(ip_str) { - var blocks = ip_str.split(":"), - num_blocks = parse_blocks(blocks), + _strToIpv6: function(ipStr) { + var blocks = ipStr.split(":"), + numBlocks = parseBlocks(blocks), j = 0, ipv6 = new Array(8); for (var i = 0; i < 8; i++) { - if (isNaN(num_blocks[j])) { + if (isNaN(numBlocks[j])) { ipv6[i] = 0; - if (i === (8-num_blocks.slice(j).length)) j++; + if (i === (8-numBlocks.slice(j).length)) j++; } else { - ipv6[i] = num_blocks[j]; + ipv6[i] = numBlocks[j]; j++; } } return ipv6; - function parse_blocks(blocks) { + function parseBlocks(blocks) { if (blocks.length < 3 || blocks.length > 8) throw "Badly formatted IPv6 address."; - var num_blocks = []; + var numBlocks = []; for (var i = 0; i < blocks.length; i++) { - num_blocks[i] = parseInt(blocks[i], 16); - if (num_blocks[i] < 0 || num_blocks[i] > 65535) + numBlocks[i] = parseInt(blocks[i], 16); + if (numBlocks[i] < 0 || numBlocks[i] > 65535) throw "Block out of range."; } - return num_blocks; + return numBlocks; } }, @@ -727,12 +727,12 @@ var IP = { * * @example * // returns "ff00::1111:2222" - * IP._ipv6_to_str([65280, 0, 0, 0, 0, 0, 4369, 8738], true); + * IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], true); * * // returns "ff00:0000:0000:0000:0000:0000:1111:2222" - * IP._ipv6_to_str([65280, 0, 0, 0, 0, 0, 4369, 8738], false); + * IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], false); */ - _ipv6_to_str: function(ipv6, compact) { + _ipv6ToStr: function(ipv6, compact) { var output = "", i = 0; @@ -779,18 +779,18 @@ var IP = { * * @private * @param {number} ip - * @param {number} end_ip + * @param {number} endIp * @returns {string[]} * * @example * // returns ["0.0.0.1", "0.0.0.2", "0.0.0.3"] - * IP._generate_ipv4_range(1, 3); + * IP._generateIpv4Range(1, 3); */ - _generate_ipv4_range: function(ip, end_ip) { + _generateIpv4Range: function(ip, endIp) { var range = []; - if (end_ip >= ip) { - for (; ip <= end_ip; ip++) { - range.push(IP._ipv4_to_str(ip)); + if (endIp >= ip) { + for (; ip <= endIp; ip++) { + range.push(IP._ipv4ToStr(ip)); } } else { range[0] = "Second IP address smaller than first."; diff --git a/src/js/operations/JS.js b/src/js/operations/JS.js index 076c6321..0f109eee 100755 --- a/src/js/operations/JS.js +++ b/src/js/operations/JS.js @@ -44,19 +44,19 @@ var JS = { * @param {Object[]} args * @returns {string} */ - run_parse: function (input, args) { - var parse_loc = args[0], - parse_range = args[1], - parse_tokens = args[2], - parse_comment = args[3], - parse_tolerant = args[4], + runParse: function (input, args) { + var parseLoc = args[0], + parseRange = args[1], + parseTokens = args[2], + parseComment = args[3], + parseTolerant = args[4], result = {}, options = { - loc: parse_loc, - range: parse_range, - tokens: parse_tokens, - comment: parse_comment, - tolerant: parse_tolerant + loc: parseLoc, + range: parseRange, + tokens: parseTokens, + comment: parseComment, + tolerant: parseTolerant }; result = esprima.parse(input, options); @@ -92,11 +92,11 @@ var JS = { * @param {Object[]} args * @returns {string} */ - run_beautify: function(input, args) { - var beautify_indent = args[0] || JS.BEAUTIFY_INDENT, + runBeautify: function(input, args) { + var beautifyIndent = args[0] || JS.BEAUTIFY_INDENT, quotes = args[1].toLowerCase(), - beautify_semicolons = args[2], - beautify_comment = args[3], + beautifySemicolons = args[2], + beautifyComment = args[3], result = "", AST; @@ -110,12 +110,12 @@ var JS = { var options = { format: { indent: { - style: beautify_indent + style: beautifyIndent }, quotes: quotes, - semicolons: beautify_semicolons, + semicolons: beautifySemicolons, }, - comment: beautify_comment + comment: beautifyComment }; if (options.comment) @@ -137,13 +137,13 @@ var JS = { * @param {Object[]} args * @returns {string} */ - run_minify: function(input, args) { + runMinify: function(input, args) { var result = "", AST = esprima.parse(input), - optimised_AST = esmangle.optimize(AST, null), - mangled_AST = esmangle.mangle(optimised_AST); + optimisedAST = esmangle.optimize(AST, null), + mangledAST = esmangle.mangle(optimisedAST); - result = escodegen.generate(mangled_AST, { + result = escodegen.generate(mangledAST, { format: { renumber: true, hexadecimal: true, diff --git a/src/js/operations/MAC.js b/src/js/operations/MAC.js index 752304b3..8fdd0906 100755 --- a/src/js/operations/MAC.js +++ b/src/js/operations/MAC.js @@ -42,15 +42,15 @@ var MAC = { * @param {Object[]} args * @returns {string} */ - run_format: function(input, args) { + runFormat: function(input, args) { if (!input) return ""; - var output_case = args[0], - no_delim = args[1], - dash_delim = args[2], - colon_delim = args[3], - cisco_style = args[4], - output_list = [], + var outputCase = args[0], + noDelim = args[1], + dashDelim = args[2], + colonDelim = args[3], + ciscoStyle = args[4], + outputList = [], macs = input.toLowerCase().split(/[,\s\r\n]+/); macs.forEach(function(mac) { @@ -59,30 +59,30 @@ var MAC = { macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"), macCisco = cleanMac.replace(/(.{4}(?=.))/g, "$1."); - if (output_case === "Lower only") { - if (no_delim) output_list.push(cleanMac); - if (dash_delim) output_list.push(macHyphen); - if (colon_delim) output_list.push(macColon); - if (cisco_style) output_list.push(macCisco); - } else if (output_case === "Upper only") { - if (no_delim) output_list.push(cleanMac.toUpperCase()); - if (dash_delim) output_list.push(macHyphen.toUpperCase()); - if (colon_delim) output_list.push(macColon.toUpperCase()); - if (cisco_style) output_list.push(macCisco.toUpperCase()); + if (outputCase === "Lower only") { + if (noDelim) outputList.push(cleanMac); + if (dashDelim) outputList.push(macHyphen); + if (colonDelim) outputList.push(macColon); + if (ciscoStyle) outputList.push(macCisco); + } else if (outputCase === "Upper only") { + if (noDelim) outputList.push(cleanMac.toUpperCase()); + if (dashDelim) outputList.push(macHyphen.toUpperCase()); + if (colonDelim) outputList.push(macColon.toUpperCase()); + if (ciscoStyle) outputList.push(macCisco.toUpperCase()); } else { - if (no_delim) output_list.push(cleanMac, cleanMac.toUpperCase()); - if (dash_delim) output_list.push(macHyphen, macHyphen.toUpperCase()); - if (colon_delim) output_list.push(macColon, macColon.toUpperCase()); - if (cisco_style) output_list.push(macCisco, macCisco.toUpperCase()); + if (noDelim) outputList.push(cleanMac, cleanMac.toUpperCase()); + if (dashDelim) outputList.push(macHyphen, macHyphen.toUpperCase()); + if (colonDelim) outputList.push(macColon, macColon.toUpperCase()); + if (ciscoStyle) outputList.push(macCisco, macCisco.toUpperCase()); } - output_list.push( + outputList.push( "" // Empty line to delimit groups ); }); // Return the data as a string - return output_list.join("\n"); + return outputList.join("\n"); }, }; diff --git a/src/js/operations/OS.js b/src/js/operations/OS.js index 48cedeb4..6b89627a 100755 --- a/src/js/operations/OS.js +++ b/src/js/operations/OS.js @@ -16,7 +16,7 @@ var OS = { * @param {Object[]} args * @returns {string} */ - run_parse_unix_perms: function(input, args) { + runParseUnixPerms: function(input, args) { var perms = { d : false, // directory sl : false, // symbolic link @@ -158,12 +158,12 @@ var OS = { return "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; } - output += "Textual representation: " + OS._perms_to_str(perms); - output += "\nOctal representation: " + OS._perms_to_octal(perms); + output += "Textual representation: " + OS._permsToStr(perms); + output += "\nOctal representation: " + OS._permsToOctal(perms); // File type if (textual) { - output += "\nFile type: " + OS._ft_from_perms(perms); + output += "\nFile type: " + OS._ftFromPerms(perms); } // setuid, setgid @@ -201,7 +201,7 @@ var OS = { * @param {Object} perms * @returns {string} */ - _perms_to_str: function(perms) { + _permsToStr: function(perms) { var str = "", type = "-"; @@ -262,7 +262,7 @@ var OS = { * @param {Object} perms * @returns {string} */ - _perms_to_octal: function(perms) { + _permsToOctal: function(perms) { var d = 0, u = 0, g = 0, @@ -295,7 +295,7 @@ var OS = { * @param {Object} perms * @returns {string} */ - _ft_from_perms: function(perms) { + _ftFromPerms: function(perms) { if (perms.d) return "Directory"; if (perms.sl) return "Symbolic link"; if (perms.np) return "Named pipe"; diff --git a/src/js/operations/PublicKey.js b/src/js/operations/PublicKey.js index 96b13c27..d73ca286 100755 --- a/src/js/operations/PublicKey.js +++ b/src/js/operations/PublicKey.js @@ -24,15 +24,15 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_parse_x509: function (input, args) { + runParseX509: function (input, args) { var cert = new X509(), - input_format = args[0]; + inputFormat = args[0]; if (!input.length) { return "No input"; } - switch (input_format) { + switch (inputFormat) { case "DER Hex": input = input.replace(/\s/g, ""); cert.hex = input; @@ -43,11 +43,11 @@ var PublicKey = { cert.pem = input; break; case "Base64": - cert.hex = Utils.to_hex(Utils.from_base64(input, null, "byte_array"), ""); + cert.hex = Utils.toHex(Utils.fromBase64(input, null, "byteArray"), ""); cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE"); break; case "Raw": - cert.hex = Utils.to_hex(Utils.str_to_byte_array(input), ""); + cert.hex = Utils.toHex(Utils.strToByteArray(input), ""); cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE"); break; default: @@ -58,108 +58,108 @@ var PublicKey = { sn = cert.getSerialNumberHex(), algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))), issuer = cert.getIssuerString(), - not_before = cert.getNotBefore(), - not_after = cert.getNotAfter(), + notBefore = cert.getNotBefore(), + notAfter = cert.getNotAfter(), subject = cert.getSubjectString(), - pk_algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 6, 0, 0]))), + pkAlgorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 6, 0, 0]))), pk = X509.getPublicKeyFromCertPEM(cert.pem), - pk_fields = [], - pk_str = "", - cert_sig_alg = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [1, 0]))), - cert_sig = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [2]).substr(2), - sig_str = "", + pkFields = [], + pkStr = "", + certSigAlg = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [1, 0]))), + certSig = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [2]).substr(2), + sigStr = "", extensions = ASN1HEX.dump(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 7])); // Public Key fields if (pk.type === "EC") { // ECDSA - pk_fields.push({ + pkFields.push({ key: "Curve Name", value: pk.curveName }); - pk_fields.push({ + pkFields.push({ key: "Length", value: (((new BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits" }); - pk_fields.push({ + pkFields.push({ key: "pub", - value: PublicKey._format_byte_str(pk.pubKeyHex, 16, 18) + value: PublicKey._formatByteStr(pk.pubKeyHex, 16, 18) }); } else if (pk.type === "DSA") { // DSA - pk_fields.push({ + pkFields.push({ key: "pub", - value: PublicKey._format_byte_str(pk.y.toString(16), 16, 18) + value: PublicKey._formatByteStr(pk.y.toString(16), 16, 18) }); - pk_fields.push({ + pkFields.push({ key: "P", - value: PublicKey._format_byte_str(pk.p.toString(16), 16, 18) + value: PublicKey._formatByteStr(pk.p.toString(16), 16, 18) }); - pk_fields.push({ + pkFields.push({ key: "Q", - value: PublicKey._format_byte_str(pk.q.toString(16), 16, 18) + value: PublicKey._formatByteStr(pk.q.toString(16), 16, 18) }); - pk_fields.push({ + pkFields.push({ key: "G", - value: PublicKey._format_byte_str(pk.g.toString(16), 16, 18) + value: PublicKey._formatByteStr(pk.g.toString(16), 16, 18) }); } else if (pk.e) { // RSA - pk_fields.push({ + pkFields.push({ key: "Length", value: pk.n.bitLength() + " bits" }); - pk_fields.push({ + pkFields.push({ key: "Modulus", - value: PublicKey._format_byte_str(pk.n.toString(16), 16, 18) + value: PublicKey._formatByteStr(pk.n.toString(16), 16, 18) }); - pk_fields.push({ + pkFields.push({ key: "Exponent", value: pk.e + " (0x" + pk.e.toString(16) + ")" }); } else { - pk_fields.push({ + pkFields.push({ key: "Error", value: "Unknown Public Key type" }); } // Signature fields - if (ASN1HEX.dump(cert_sig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA - sig_str = " r: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [0]), 16, 18) + "\n" + - " s: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [1]), 16, 18) + "\n"; + if (ASN1HEX.dump(certSig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA + sigStr = " r: " + PublicKey._formatByteStr(ASN1HEX.getDecendantHexVByNthList(certSig, 0, [0]), 16, 18) + "\n" + + " s: " + PublicKey._formatByteStr(ASN1HEX.getDecendantHexVByNthList(certSig, 0, [1]), 16, 18) + "\n"; } else { // RSA - sig_str = " Signature: " + PublicKey._format_byte_str(cert_sig, 16, 18) + "\n"; + sigStr = " Signature: " + PublicKey._formatByteStr(certSig, 16, 18) + "\n"; } // Format Public Key fields - for (var i = 0; i < pk_fields.length; i++) { - pk_str += " " + pk_fields[i].key + ":" + - Utils.pad_left( - pk_fields[i].value + "\n", - 18 - (pk_fields[i].key.length + 3) + pk_fields[i].value.length + 1, + for (var i = 0; i < pkFields.length; i++) { + pkStr += " " + pkFields[i].key + ":" + + Utils.padLeft( + pkFields[i].value + "\n", + 18 - (pkFields[i].key.length + 3) + pkFields[i].value.length + 1, " " ); } - var issuer_str = PublicKey._format_dn_str(issuer, 2), - nb_date = PublicKey._format_date(not_before), - na_date = PublicKey._format_date(not_after), - subject_str = PublicKey._format_dn_str(subject, 2); + var issuerStr = PublicKey._formatDnStr(issuer, 2), + nbDate = PublicKey._formatDate(notBefore), + naDate = PublicKey._formatDate(notAfter), + subjectStr = PublicKey._formatDnStr(subject, 2); var output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" + "Serial number: " + new BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" + "Algorithm ID: " + algorithm + "\n" + "Validity\n" + - " Not Before: " + nb_date + " (dd-mm-yy hh:mm:ss) (" + not_before + ")\n" + - " Not After: " + na_date + " (dd-mm-yy hh:mm:ss) (" + not_after + ")\n" + + " Not Before: " + nbDate + " (dd-mm-yy hh:mm:ss) (" + notBefore + ")\n" + + " Not After: " + naDate + " (dd-mm-yy hh:mm:ss) (" + notAfter + ")\n" + "Issuer\n" + - issuer_str + + issuerStr + "Subject\n" + - subject_str + + subjectStr + "Public Key\n" + - " Algorithm: " + pk_algorithm + "\n" + - pk_str + + " Algorithm: " + pkAlgorithm + "\n" + + pkStr + "Certificate Signature\n" + - " Algorithm: " + cert_sig_alg + "\n" + - sig_str + + " Algorithm: " + certSigAlg + "\n" + + sigStr + "\nExtensions (parsed ASN.1)\n" + extensions; @@ -174,7 +174,7 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_pem_to_hex: function(input, args) { + runPemToHex: function(input, args) { if (input.indexOf("-----BEGIN") < 0) { // Add header so that the KEYUTIL function works input = "-----BEGIN CERTIFICATE-----" + input; @@ -200,7 +200,7 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_hex_to_pem: function(input, args) { + runHexToPem: function(input, args) { return KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]); }, @@ -212,7 +212,7 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_hex_to_object_identifier: function(input, args) { + runHexToObjectIdentifier: function(input, args) { return KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, "")); }, @@ -224,7 +224,7 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_object_identifier_to_hex: function(input, args) { + runObjectIdentifierToHex: function(input, args) { return KJUR.asn1.ASN1Util.oidIntToHex(input); }, @@ -242,11 +242,11 @@ var PublicKey = { * @param {Object[]} args * @returns {string} */ - run_parse_asn1_hex_string: function(input, args) { - var truncate_len = args[1], + runParseAsn1HexString: function(input, args) { + var truncateLen = args[1], index = args[0]; return ASN1HEX.dump(input.replace(/\s/g, ""), { - "ommit_long_octet": truncate_len + "ommitLongOctet": truncateLen }, index); }, @@ -255,14 +255,14 @@ var PublicKey = { * Formats Distinguished Name (DN) strings. * * @private - * @param {string} dn_str + * @param {string} dnStr * @param {number} indent * @returns {string} */ - _format_dn_str: function(dn_str, indent) { + _formatDnStr: function(dnStr, indent) { var output = "", - fields = dn_str.split(",/|"), - max_key_len = 0, + fields = dnStr.split(",/|"), + maxKeyLen = 0, key, value, str; @@ -272,7 +272,7 @@ var PublicKey = { key = fields[i].split("=")[0]; - max_key_len = key.length > max_key_len ? key.length : max_key_len; + maxKeyLen = key.length > maxKeyLen ? key.length : maxKeyLen; } for (i = 0; i < fields.length; i++) { @@ -280,9 +280,9 @@ var PublicKey = { key = fields[i].split("=")[0]; value = fields[i].split("=")[1]; - str = Utils.pad_right(key, max_key_len) + " = " + value + "\n"; + str = Utils.padRight(key, maxKeyLen) + " = " + value + "\n"; - output += Utils.pad_left(str, indent + str.length, " "); + output += Utils.padLeft(str, indent + str.length, " "); } return output; @@ -293,22 +293,22 @@ var PublicKey = { * Formats byte strings by adding line breaks and delimiters. * * @private - * @param {string} byte_str + * @param {string} byteStr * @param {number} length - Line width * @param {number} indent * @returns {string} */ - _format_byte_str: function(byte_str, length, indent) { - byte_str = Utils.to_hex(Utils.from_hex(byte_str), ":"); + _formatByteStr: function(byteStr, length, indent) { + byteStr = Utils.toHex(Utils.fromHex(byteStr), ":"); length = length * 3; var output = ""; - for (var i = 0; i < byte_str.length; i += length) { - var str = byte_str.slice(i, i + length) + "\n"; + for (var i = 0; i < byteStr.length; i += length) { + var str = byteStr.slice(i, i + length) + "\n"; if (i === 0) { output += str; } else { - output += Utils.pad_left(str, indent + str.length, " "); + output += Utils.padLeft(str, indent + str.length, " "); } } @@ -320,16 +320,16 @@ var PublicKey = { * Formats dates. * * @private - * @param {string} date_str + * @param {string} dateStr * @returns {string} */ - _format_date: function(date_str) { - return date_str[4] + date_str[5] + "/" + - date_str[2] + date_str[3] + "/" + - date_str[0] + date_str[1] + " " + - date_str[6] + date_str[7] + ":" + - date_str[8] + date_str[9] + ":" + - date_str[10] + date_str[11]; + _formatDate: function(dateStr) { + return dateStr[4] + dateStr[5] + "/" + + dateStr[2] + dateStr[3] + "/" + + dateStr[0] + dateStr[1] + " " + + dateStr[6] + dateStr[7] + ":" + + dateStr[8] + dateStr[9] + ":" + + dateStr[10] + dateStr[11]; }, }; @@ -388,9 +388,9 @@ X509.DN_ATTRHEX = { // "06032a864886f70d010104" : "md5withRSAEncryption", // "06032a864886f70d010105" : "SHA-1WithRSAEncryption", // "06032a8648ce380403" : "id-dsa-with-sha-1", - // "06032b06010505070302" : "id_kp_clientAuth", - // "06032b06010505070304" : "id_kp_securityemail", - "06032b06010505070201" : "id_certificatePolicies", + // "06032b06010505070302" : "idKpClientAuth", + // "06032b06010505070304" : "idKpSecurityemail", + "06032b06010505070201" : "idCertificatePolicies", "06036086480186f8420101" : "netscape-cert-type", "06036086480186f8420102" : "netscape-base-url", "06036086480186f8420103" : "netscape-revocation-url", @@ -867,25 +867,25 @@ X509.DN_ATTRHEX = { "06036086480186f8450107010101" : "Unknown Verisign policy qualifier", "06036086480186f8450107010102" : "Unknown Verisign policy qualifier", "0603678105" : "TCPA", - "060367810501" : "tcpa_specVersion", - "060367810502" : "tcpa_attribute", - "06036781050201" : "tcpa_at_tpmManufacturer", - "0603678105020a" : "tcpa_at_securityQualities", - "0603678105020b" : "tcpa_at_tpmProtectionProfile", - "0603678105020c" : "tcpa_at_tpmSecurityTarget", - "0603678105020d" : "tcpa_at_foundationProtectionProfile", - "0603678105020e" : "tcpa_at_foundationSecurityTarget", - "0603678105020f" : "tcpa_at_tpmIdLabel", - "06036781050202" : "tcpa_at_tpmModel", - "06036781050203" : "tcpa_at_tpmVersion", - "06036781050204" : "tcpa_at_platformManufacturer", - "06036781050205" : "tcpa_at_platformModel", - "06036781050206" : "tcpa_at_platformVersion", - "06036781050207" : "tcpa_at_componentManufacturer", - "06036781050208" : "tcpa_at_componentModel", - "06036781050209" : "tcpa_at_componentVersion", - "060367810503" : "tcpa_protocol", - "06036781050301" : "tcpa_prtt_tpmIdProtocol", + "060367810501" : "tcpaSpecVersion", + "060367810502" : "tcpaAttribute", + "06036781050201" : "tcpaAtTpmManufacturer", + "0603678105020a" : "tcpaAtSecurityQualities", + "0603678105020b" : "tcpaAtTpmProtectionProfile", + "0603678105020c" : "tcpaAtTpmSecurityTarget", + "0603678105020d" : "tcpaAtFoundationProtectionProfile", + "0603678105020e" : "tcpaAtFoundationSecurityTarget", + "0603678105020f" : "tcpaAtTpmIdLabel", + "06036781050202" : "tcpaAtTpmModel", + "06036781050203" : "tcpaAtTpmVersion", + "06036781050204" : "tcpaAtPlatformManufacturer", + "06036781050205" : "tcpaAtPlatformModel", + "06036781050206" : "tcpaAtPlatformVersion", + "06036781050207" : "tcpaAtComponentManufacturer", + "06036781050208" : "tcpaAtComponentModel", + "06036781050209" : "tcpaAtComponentVersion", + "060367810503" : "tcpaProtocol", + "06036781050301" : "tcpaPrttTpmIdProtocol", "0603672a00" : "contentType", "0603672a0000" : "PANData", "0603672a0001" : "PANToken", diff --git a/src/js/operations/Punycode.js b/src/js/operations/Punycode.js index cf58a8f1..edc1293a 100755 --- a/src/js/operations/Punycode.js +++ b/src/js/operations/Punycode.js @@ -24,7 +24,7 @@ var Punycode = { * @param {Object[]} args * @returns {string} */ - run_to_ascii: function(input, args) { + runToAscii: function(input, args) { var idn = args[0]; if (idn) { @@ -42,7 +42,7 @@ var Punycode = { * @param {Object[]} args * @returns {string} */ - run_to_unicode: function(input, args) { + runToUnicode: function(input, args) { var idn = args[0]; if (idn) { diff --git a/src/js/operations/QuotedPrintable.js b/src/js/operations/QuotedPrintable.js index 8dd9299e..7e3645e8 100755 --- a/src/js/operations/QuotedPrintable.js +++ b/src/js/operations/QuotedPrintable.js @@ -35,11 +35,11 @@ var QuotedPrintable = { /** * To Quoted Printable operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args * @returns {string} */ - run_to: function (input, args) { + runTo: function (input, args) { var mimeEncodedStr = QuotedPrintable.mimeEncode(input); // fix line breaks @@ -58,9 +58,9 @@ var QuotedPrintable = { * * @param {string} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_from: function (input, args) { + runFrom: function (input, args) { var str = input.replace(/\=(?:\r?\n|$)/g, ""); return QuotedPrintable.mimeDecode(str); }, @@ -70,7 +70,7 @@ var QuotedPrintable = { * Decodes mime-encoded data. * * @param {string} str - * @returns {byte_array} + * @returns {byteArray} */ mimeDecode: function(str) { var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length, @@ -96,7 +96,7 @@ var QuotedPrintable = { /** * Encodes mime data. * - * @param {byte_array} buffer + * @param {byteArray} buffer * @returns {string} */ mimeEncode: function(buffer) { @@ -130,7 +130,7 @@ var QuotedPrintable = { * * @private * @param {number} nr - * @param {byte_array[]} ranges + * @param {byteArray[]} ranges * @returns {bolean} */ _checkRanges: function(nr, ranges) { diff --git a/src/js/operations/Rotate.js b/src/js/operations/Rotate.js index 8b6edf54..4a423cae 100755 --- a/src/js/operations/Rotate.js +++ b/src/js/operations/Rotate.js @@ -26,10 +26,10 @@ var Rotate = { * Runs rotation operations across the input data. * * @private - * @param {byte_array} data + * @param {byteArray} data * @param {number} amount * @param {function} algo - The rotation operation to carry out - * @returns {byte_array} + * @returns {byteArray} */ _rot: function(data, amount, algo) { var result = []; @@ -47,13 +47,13 @@ var Rotate = { /** * Rotate right operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_rotr: function(input, args) { + runRotr: function(input, args) { if (args[1]) { - return Rotate._rotr_whole(input, args[0]); + return Rotate._rotrWhole(input, args[0]); } else { return Rotate._rot(input, args[0], Rotate._rotr); } @@ -63,13 +63,13 @@ var Rotate = { /** * Rotate left operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_rotl: function(input, args) { + runRotl: function(input, args) { if (args[1]) { - return Rotate._rotl_whole(input, args[0]); + return Rotate._rotlWhole(input, args[0]); } else { return Rotate._rot(input, args[0], Rotate._rotl); } @@ -95,16 +95,16 @@ var Rotate = { /** * ROT13 operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_rot13: function(input, args) { + runRot13: function(input, args) { var amount = args[2], output = input, chr, - rot13_lowercase = args[0], - rot13_upperacse = args[1]; + rot13Lowercase = args[0], + rot13Upperacse = args[1]; if (amount) { if (amount < 0) { @@ -113,10 +113,10 @@ var Rotate = { for (var i = 0; i < input.length; i++) { chr = input[i]; - if (rot13_upperacse && chr >= 65 && chr <= 90) { // Upper case + if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case chr = (chr - 65 + amount) % 26; output[i] = chr + 65; - } else if (rot13_lowercase && chr >= 97 && chr <= 122) { // Lower case + } else if (rot13Lowercase && chr >= 97 && chr <= 122) { // Lower case chr = (chr - 97 + amount) % 26; output[i] = chr + 97; } @@ -136,11 +136,11 @@ var Rotate = { * ROT47 operation. * * @author Matt C [matt@artemisbot.pw] - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_rot47: function(input, args) { + runRot47: function(input, args) { var amount = args[0], output = input, chr; @@ -193,23 +193,23 @@ var Rotate = { * from the end of the array to the beginning. * * @private - * @param {byte_array} data + * @param {byteArray} data * @param {number} amount - * @returns {byte_array} + * @returns {byteArray} */ - _rotr_whole: function(data, amount) { - var carry_bits = 0, - new_byte, + _rotrWhole: function(data, amount) { + var carryBits = 0, + newByte, result = []; amount = amount % 8; for (var i = 0; i < data.length; i++) { - var old_byte = data[i] >>> 0; - new_byte = (old_byte >> amount) | carry_bits; - carry_bits = (old_byte & (Math.pow(2, amount)-1)) << (8-amount); - result.push(new_byte); + var oldByte = data[i] >>> 0; + newByte = (oldByte >> amount) | carryBits; + carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount); + result.push(newByte); } - result[0] |= carry_bits; + result[0] |= carryBits; return result; }, @@ -219,23 +219,23 @@ var Rotate = { * from the beginning of the array to the end. * * @private - * @param {byte_array} data + * @param {byteArray} data * @param {number} amount - * @returns {byte_array} + * @returns {byteArray} */ - _rotl_whole: function(data, amount) { - var carry_bits = 0, - new_byte, + _rotlWhole: function(data, amount) { + var carryBits = 0, + newByte, result = []; amount = amount % 8; for (var i = data.length-1; i >= 0; i--) { - var old_byte = data[i]; - new_byte = ((old_byte << amount) | carry_bits) & 0xFF; - carry_bits = (old_byte >> (8-amount)) & (Math.pow(2, amount)-1); - result[i] = (new_byte); + var oldByte = data[i]; + newByte = ((oldByte << amount) | carryBits) & 0xFF; + carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1); + result[i] = (newByte); } - result[data.length-1] = result[data.length-1] | carry_bits; + result[data.length-1] = result[data.length-1] | carryBits; return result; }, diff --git a/src/js/operations/SeqUtils.js b/src/js/operations/SeqUtils.js index 40fc67f1..7100d5c5 100755 --- a/src/js/operations/SeqUtils.js +++ b/src/js/operations/SeqUtils.js @@ -32,21 +32,21 @@ var SeqUtils = { * @param {Object[]} args * @returns {string} */ - run_sort: function (input, args) { - var delim = Utils.char_rep[args[0]], - sort_reverse = args[1], + runSort: function (input, args) { + var delim = Utils.charRep[args[0]], + sortReverse = args[1], order = args[2], sorted = input.split(delim); if (order === "Alphabetical (case sensitive)") { sorted = sorted.sort(); } else if (order === "Alphabetical (case insensitive)") { - sorted = sorted.sort(SeqUtils._case_insensitive_sort); + sorted = sorted.sort(SeqUtils._caseInsensitiveSort); } else if (order === "IP address") { - sorted = sorted.sort(SeqUtils._ip_sort); + sorted = sorted.sort(SeqUtils._ipSort); } - if (sort_reverse) sorted.reverse(); + if (sortReverse) sorted.reverse(); return sorted.join(delim); }, @@ -58,8 +58,8 @@ var SeqUtils = { * @param {Object[]} args * @returns {string} */ - run_unique: function (input, args) { - var delim = Utils.char_rep[args[0]]; + runUnique: function (input, args) { + var delim = Utils.charRep[args[0]]; return input.split(delim).unique().join(delim); }, @@ -77,7 +77,7 @@ var SeqUtils = { * @param {Object[]} args * @returns {number} */ - run_count: function(input, args) { + runCount: function(input, args) { var search = args[0].string, type = args[0].option; @@ -91,7 +91,7 @@ var SeqUtils = { } } else if (search) { if (type.indexOf("Extended") === 0) { - search = Utils.parse_escaped_chars(search); + search = Utils.parseEscapedChars(search); } return input.count(search); } else { @@ -109,11 +109,11 @@ var SeqUtils = { /** * Reverse operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_reverse: function (input, args) { + runReverse: function (input, args) { if (args[0] === "Line") { var lines = [], line = [], @@ -146,7 +146,7 @@ var SeqUtils = { * @param {Object[]} args * @returns {string} */ - run_add_line_numbers: function(input, args) { + runAddLineNumbers: function(input, args) { var lines = input.split("\n"), output = "", width = lines.length.toString().length; @@ -165,7 +165,7 @@ var SeqUtils = { * @param {Object[]} args * @returns {string} */ - run_remove_line_numbers: function(input, args) { + runRemoveLineNumbers: function(input, args) { return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, ""); }, @@ -177,8 +177,8 @@ var SeqUtils = { * @param {Object[]} args * @returns {string} */ - run_expand_alph_range: function(input, args) { - return Utils.expand_alph_range(input).join(args[0]); + runExpandAlphRange: function(input, args) { + return Utils.expandAlphRange(input).join(args[0]); }, @@ -190,7 +190,7 @@ var SeqUtils = { * @param {string} b * @returns {number} */ - _case_insensitive_sort: function(a, b) { + _caseInsensitiveSort: function(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); }, @@ -203,7 +203,7 @@ var SeqUtils = { * @param {string} b * @returns {number} */ - _ip_sort: function(a, b) { + _ipSort: function(a, b) { var a_ = a.split("."), b_ = b.split("."); diff --git a/src/js/operations/StrUtils.js b/src/js/operations/StrUtils.js index e0d10105..8f13e28a 100755 --- a/src/js/operations/StrUtils.js +++ b/src/js/operations/StrUtils.js @@ -97,30 +97,30 @@ var StrUtils = { * @param {Object[]} args * @returns {html} */ - run_regex: function(input, args) { - var user_regex = args[1], + runRegex: function(input, args) { + var userRegex = args[1], i = args[2], m = args[3], - display_total = args[4], - output_format = args[5], + displayTotal = args[4], + outputFormat = args[5], modifiers = "g"; if (i) modifiers += "i"; if (m) modifiers += "m"; - if (user_regex && user_regex !== "^" && user_regex !== "$") { + if (userRegex && userRegex !== "^" && userRegex !== "$") { try { - var regex = new RegExp(user_regex, modifiers); + var regex = new RegExp(userRegex, modifiers); - switch (output_format) { + switch (outputFormat) { case "Highlight matches": - return StrUtils._regex_highlight(input, regex, display_total); + return StrUtils._regexHighlight(input, regex, displayTotal); case "List matches": - return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, false)); + return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, true, false)); case "List capture groups": - return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, false, true)); + return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, false, true)); case "List matches with capture groups": - return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, true)); + return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, true, true)); default: return "Error: Invalid output format"; } @@ -128,7 +128,7 @@ var StrUtils = { return "Invalid regex. Details: " + err.message; } } else { - return Utils.escape_html(input); + return Utils.escapeHtml(input); } }, @@ -146,7 +146,7 @@ var StrUtils = { * @param {Object[]} args * @returns {string} */ - run_upper: function (input, args) { + runUpper: function (input, args) { var scope = args[0]; switch (scope) { @@ -177,7 +177,7 @@ var StrUtils = { * @param {Object[]} args * @returns {string} */ - run_lower: function (input, args) { + runLower: function (input, args) { return input.toLowerCase(); }, @@ -210,7 +210,7 @@ var StrUtils = { * @param {Object[]} args * @returns {string} */ - run_find_replace: function(input, args) { + runFindReplace: function(input, args) { var find = args[0].string, type = args[0].option, replace = args[1], @@ -226,7 +226,7 @@ var StrUtils = { if (type === "Regex") { find = new RegExp(find, modifiers); } else if (type.indexOf("Extended") === 0) { - find = Utils.parse_escaped_chars(find); + find = Utils.parseEscapedChars(find); } return input.replace(find, replace, modifiers); @@ -254,12 +254,38 @@ var StrUtils = { * @param {Object[]} args * @returns {string} */ - run_split: function(input, args) { - var split_delim = args[0] || StrUtils.SPLIT_DELIM, - join_delim = Utils.char_rep[args[1]], - sections = input.split(split_delim); + runSplit: function(input, args) { + var splitDelim = args[0] || StrUtils.SPLIT_DELIM, + joinDelim = Utils.charRep[args[1]], + sections = input.split(splitDelim); - return sections.join(join_delim); + return sections.join(joinDelim); + }, + + + /** + * Filter operation. + * + * @author Mikescher (https://github.com/Mikescher | https://mikescher.com) + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runFilter: function(input, args) { + var delim = Utils.charRep[args[0]], + reverse = args[2]; + + try { + var regex = new RegExp(args[1]); + } catch (err) { + return "Invalid regex. Details: " + err.message; + } + + var regexFilter = function(value) { + return reverse ^ regex.test(value); + }; + + return input.split(delim).filter(regexFilter).join(delim); }, @@ -281,13 +307,13 @@ var StrUtils = { * @param {Object[]} args * @returns {html} */ - run_diff: function(input, args) { - var sample_delim = args[0], - diff_by = args[1], - show_added = args[2], - show_removed = args[3], - ignore_whitespace = args[4], - samples = input.split(sample_delim), + runDiff: function(input, args) { + var sampleDelim = args[0], + diffBy = args[1], + showAdded = args[2], + showRemoved = args[3], + ignoreWhitespace = args[4], + samples = input.split(sampleDelim), output = "", diff; @@ -295,19 +321,19 @@ var StrUtils = { return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"; } - switch (diff_by) { + switch (diffBy) { case "Character": diff = JsDiff.diffChars(samples[0], samples[1]); break; case "Word": - if (ignore_whitespace) { + if (ignoreWhitespace) { diff = JsDiff.diffWords(samples[0], samples[1]); } else { diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]); } break; case "Line": - if (ignore_whitespace) { + if (ignoreWhitespace) { diff = JsDiff.diffTrimmedLines(samples[0], samples[1]); } else { diff = JsDiff.diffLines(samples[0], samples[1]); @@ -328,11 +354,11 @@ var StrUtils = { for (var i = 0; i < diff.length; i++) { if (diff[i].added) { - if (show_added) output += "" + Utils.escape_html(diff[i].value) + ""; + if (showAdded) output += "" + Utils.escapeHtml(diff[i].value) + ""; } else if (diff[i].removed) { - if (show_removed) output += "" + Utils.escape_html(diff[i].value) + ""; + if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; } else { - output += Utils.escape_html(diff[i].value); + output += Utils.escapeHtml(diff[i].value); } } @@ -353,14 +379,14 @@ var StrUtils = { * @param {Object[]} args * @returns {html} */ - run_offset_checker: function(input, args) { - var sample_delim = args[0], - samples = input.split(sample_delim), + runOffsetChecker: function(input, args) { + var sampleDelim = args[0], + samples = input.split(sampleDelim), outputs = [], i = 0, s = 0, match = false, - in_match = false, + inMatch = false, chr; if (!samples || samples.length < 2) { @@ -389,34 +415,34 @@ var StrUtils = { // Write output for each sample for (s = 0; s < samples.length; s++) { if (samples[s].length <= i) { - if (in_match) outputs[s] += ""; - if (s === samples.length - 1) in_match = false; + if (inMatch) outputs[s] += ""; + if (s === samples.length - 1) inMatch = false; continue; } - if (match && !in_match) { - outputs[s] += "" + Utils.escape_html(samples[s][i]); + if (match && !inMatch) { + outputs[s] += "" + Utils.escapeHtml(samples[s][i]); if (samples[s].length === i + 1) outputs[s] += ""; - if (s === samples.length - 1) in_match = true; - } else if (!match && in_match) { - outputs[s] += "" + Utils.escape_html(samples[s][i]); - if (s === samples.length - 1) in_match = false; + if (s === samples.length - 1) inMatch = true; + } else if (!match && inMatch) { + outputs[s] += "" + Utils.escapeHtml(samples[s][i]); + if (s === samples.length - 1) inMatch = false; } else { - outputs[s] += Utils.escape_html(samples[s][i]); - if (in_match && samples[s].length === i + 1) { + outputs[s] += Utils.escapeHtml(samples[s][i]); + if (inMatch && samples[s].length === i + 1) { outputs[s] += ""; - if (samples[s].length - 1 !== i) in_match = false; + if (samples[s].length - 1 !== i) inMatch = false; } } if (samples[0].length - 1 === i) { - if (in_match) outputs[s] += ""; - outputs[s] += Utils.escape_html(samples[s].substring(i + 1)); + if (inMatch) outputs[s] += ""; + outputs[s] += Utils.escapeHtml(samples[s].substring(i + 1)); } } } - return outputs.join(sample_delim); + return outputs.join(sampleDelim); }, @@ -427,8 +453,8 @@ var StrUtils = { * @param {Object[]} args * @returns {string} */ - run_parse_escaped_string: function(input, args) { - return Utils.parse_escaped_chars(input); + runParseEscapedString: function(input, args) { + return Utils.parseEscapedChars(input); }, @@ -438,10 +464,10 @@ var StrUtils = { * @private * @param {string} input * @param {RegExp} regex - * @param {boolean} display_total + * @param {boolean} displayTotal * @returns {string} */ - _regex_highlight: function(input, regex, display_total) { + _regexHighlight: function(input, regex, displayTotal) { var output = "", m, hl = 1, @@ -450,10 +476,10 @@ var StrUtils = { while ((m = regex.exec(input))) { // Add up to match - output += Utils.escape_html(input.slice(i, m.index)); + output += Utils.escapeHtml(input.slice(i, m.index)); // Add match with highlighting - output += "" + Utils.escape_html(m[0]) + ""; + output += "" + Utils.escapeHtml(m[0]) + ""; // Switch highlight hl = hl === 1 ? 2 : 1; @@ -463,9 +489,9 @@ var StrUtils = { } // Add all after final match - output += Utils.escape_html(input.slice(i, input.length)); + output += Utils.escapeHtml(input.slice(i, input.length)); - if (display_total) + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output; @@ -478,12 +504,12 @@ var StrUtils = { * @private * @param {string} input * @param {RegExp} regex - * @param {boolean} display_total + * @param {boolean} displayTotal * @param {boolean} matches - Display full match - * @param {boolean} capture_groups - Display each of the capture groups separately + * @param {boolean} captureGroups - Display each of the capture groups separately * @returns {string} */ - _regex_list: function(input, regex, display_total, matches, capture_groups) { + _regexList: function(input, regex, displayTotal, matches, captureGroups) { var output = "", total = 0, match; @@ -493,7 +519,7 @@ var StrUtils = { if (matches) { output += match[0] + "\n"; } - if (capture_groups) { + if (captureGroups) { for (var i = 1; i < match.length; i++) { if (matches) { output += " Group " + i + ": "; @@ -503,7 +529,7 @@ var StrUtils = { } } - if (display_total) + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output; diff --git a/src/js/operations/Tidy.js b/src/js/operations/Tidy.js index a06f722a..8b708c89 100755 --- a/src/js/operations/Tidy.js +++ b/src/js/operations/Tidy.js @@ -47,21 +47,21 @@ var Tidy = { * @param {Object[]} args * @returns {string} */ - run_remove_whitespace: function (input, args) { - var remove_spaces = args[0], - remove_cariage_returns = args[1], - remove_line_feeds = args[2], - remove_tabs = args[3], - remove_form_feeds = args[4], - remove_full_stops = args[5], + runRemoveWhitespace: function (input, args) { + var removeSpaces = args[0], + removeCariageReturns = args[1], + removeLineFeeds = args[2], + removeTabs = args[3], + removeFormFeeds = args[4], + removeFullStops = args[5], data = input; - if (remove_spaces) data = data.replace(/ /g, ""); - if (remove_cariage_returns) data = data.replace(/\r/g, ""); - if (remove_line_feeds) data = data.replace(/\n/g, ""); - if (remove_tabs) data = data.replace(/\t/g, ""); - if (remove_form_feeds) data = data.replace(/\f/g, ""); - if (remove_full_stops) data = data.replace(/\./g, ""); + if (removeSpaces) data = data.replace(/ /g, ""); + if (removeCariageReturns) data = data.replace(/\r/g, ""); + if (removeLineFeeds) data = data.replace(/\n/g, ""); + if (removeTabs) data = data.replace(/\t/g, ""); + if (removeFormFeeds) data = data.replace(/\f/g, ""); + if (removeFullStops) data = data.replace(/\./g, ""); return data; }, @@ -69,11 +69,11 @@ var Tidy = { /** * Remove null bytes operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_remove_nulls: function (input, args) { + runRemoveNulls: function (input, args) { var output = []; for (var i = 0; i < input.length; i++) { if (input[i] !== 0) output.push(input[i]); @@ -101,19 +101,19 @@ var Tidy = { /** * Drop bytes operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_drop_bytes: function(input, args) { + runDropBytes: function(input, args) { var start = args[0], length = args[1], - apply_to_each_line = args[2]; + applyToEachLine = args[2]; if (start < 0 || length < 0) throw "Error: Invalid value"; - if (!apply_to_each_line) + if (!applyToEachLine) return input.slice(0, start).concat(input.slice(start+length, input.length)); // Split input into lines @@ -153,19 +153,19 @@ var Tidy = { /** * Take bytes operation. * - * @param {byte_array} input + * @param {byteArray} input * @param {Object[]} args - * @returns {byte_array} + * @returns {byteArray} */ - run_take_bytes: function(input, args) { + runTakeBytes: function(input, args) { var start = args[0], length = args[1], - apply_to_each_line = args[2]; + applyToEachLine = args[2]; if (start < 0 || length < 0) throw "Error: Invalid value"; - if (!apply_to_each_line) + if (!applyToEachLine) return input.slice(start, start+length); // Split input into lines @@ -214,7 +214,7 @@ var Tidy = { * @param {Object[]} args * @returns {string} */ - run_pad: function(input, args) { + runPad: function(input, args) { var position = args[0], len = args[1], chr = args[2], @@ -224,11 +224,11 @@ var Tidy = { if (position === "Start") { for (i = 0; i < lines.length; i++) { - output += Utils.pad_left(lines[i], lines[i].length+len, chr) + "\n"; + output += Utils.padLeft(lines[i], lines[i].length+len, chr) + "\n"; } } else if (position === "End") { for (i = 0; i < lines.length; i++) { - output += Utils.pad_right(lines[i], lines[i].length+len, chr) + "\n"; + output += Utils.padRight(lines[i], lines[i].length+len, chr) + "\n"; } } diff --git a/src/js/operations/URL.js b/src/js/operations/URL.js index 6c6dc03f..4ed0f923 100755 --- a/src/js/operations/URL.js +++ b/src/js/operations/URL.js @@ -25,9 +25,9 @@ var URL_ = { * @param {Object[]} args * @returns {string} */ - run_to: function(input, args) { - var encode_all = args[0]; - return encode_all ? URL_._encode_all_chars(input) : encodeURI(input); + runTo: function(input, args) { + var encodeAll = args[0]; + return encodeAll ? URL_._encodeAllChars(input) : encodeURI(input); }, @@ -38,7 +38,7 @@ var URL_ = { * @param {Object[]} args * @returns {string} */ - run_from: function(input, args) { + runFrom: function(input, args) { var data = input.replace(/\+/g, "%20"); try { return decodeURIComponent(data); @@ -55,7 +55,7 @@ var URL_ = { * @param {Object[]} args * @returns {string} */ - run_parse: function(input, args) { + runParse: function(input, args) { var a = document.createElement("a"); // Overwrite base href which will be the current CyberChef URL to reduce confusion. @@ -70,7 +70,7 @@ var URL_ = { if (a.port) output += "Port:\t\t" + a.port + "\n"; } - if (a.pathname) { + if (a.pathname && a.pathname !== window.location.pathname) { var pathname = a.pathname; if (pathname.indexOf(window.location.pathname) === 0) pathname = pathname.replace(window.location.pathname, ""); @@ -78,22 +78,22 @@ var URL_ = { output += "Path name:\t" + pathname + "\n"; } - if (a.hash) { + if (a.hash && a.hash !== window.location.hash) { output += "Hash:\t\t" + a.hash + "\n"; } - if (a.search) { + if (a.search && a.search !== window.location.search) { output += "Arguments:\n"; var args_ = (a.search.slice(1, a.search.length)).split("&"); - var split_args = [], padding = 0; + var splitArgs = [], padding = 0; for (var i = 0; i < args_.length; i++) { - split_args.push(args_[i].split("=")); - padding = (split_args[i][0].length > padding) ? split_args[i][0].length : padding; + splitArgs.push(args_[i].split("=")); + padding = (splitArgs[i][0].length > padding) ? splitArgs[i][0].length : padding; } - for (i = 0; i < split_args.length; i++) { - output += "\t" + Utils.pad_right(split_args[i][0], padding); - if (split_args[i].length > 1 && split_args[i][1].length) - output += " = " + split_args[i][1] + "\n"; + for (i = 0; i < splitArgs.length; i++) { + output += "\t" + Utils.padRight(splitArgs[i][0], padding); + if (splitArgs[i].length > 1 && splitArgs[i][1].length) + output += " = " + splitArgs[i][1] + "\n"; else output += "\n"; } } @@ -112,7 +112,7 @@ var URL_ = { * @param {string} str * @returns {string} */ - _encode_all_chars: function(str) { + _encodeAllChars: function(str) { //TODO Do this programatically return encodeURIComponent(str) .replace(/!/g, "%21") diff --git a/src/js/operations/UUID.js b/src/js/operations/UUID.js index c175f509..2248eb63 100755 --- a/src/js/operations/UUID.js +++ b/src/js/operations/UUID.js @@ -16,7 +16,7 @@ var UUID = { * @param {Object[]} args * @returns {string} */ - run_generate_v4: function(input, args) { + runGenerateV4: function(input, args) { if (typeof(window.crypto) !== "undefined" && typeof(window.crypto.getRandomValues) !== "undefined") { var buf = new Uint32Array(4), i = 0; diff --git a/src/js/operations/Unicode.js b/src/js/operations/Unicode.js index 6a850c0d..d93ed9e5 100755 --- a/src/js/operations/Unicode.js +++ b/src/js/operations/Unicode.js @@ -22,8 +22,8 @@ var Unicode = { * @param {Object[]} args * @returns {string} */ - run_unescape: function(input, args) { - var prefix = Unicode._prefix_to_regex[args[0]], + runUnescape: function(input, args) { + var prefix = Unicode._prefixToRegex[args[0]], regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"), output = "", m, @@ -53,7 +53,7 @@ var Unicode = { * @private * @constant */ - _prefix_to_regex: { + _prefixToRegex: { "\\u": "\\\\u", "%u": "%u", "U+": "U\\+" diff --git a/src/js/views/html/ControlsWaiter.js b/src/js/views/html/ControlsWaiter.js index c34e3150..aefa4292 100755 --- a/src/js/views/html/ControlsWaiter.js +++ b/src/js/views/html/ControlsWaiter.js @@ -19,15 +19,15 @@ var ControlsWaiter = function(app, manager) { * Adjusts the display properties of the control buttons so that they fit within the current width * without wrapping or overflowing. */ -ControlsWaiter.prototype.adjust_width = function() { - var controls = document.getElementById("controls"), - step = document.getElementById("step"), - clr_breaks = document.getElementById("clr-breaks"), - save_img = document.querySelector("#save img"), - load_img = document.querySelector("#load img"), - step_img = document.querySelector("#step img"), - clr_recip_img = document.querySelector("#clr-recipe img"), - clr_breaks_img = document.querySelector("#clr-breaks img"); +ControlsWaiter.prototype.adjustWidth = function() { + var controls = document.getElementById("controls"), + step = document.getElementById("step"), + clrBreaks = document.getElementById("clr-breaks"), + saveImg = document.querySelector("#save img"), + loadImg = document.querySelector("#load img"), + stepImg = document.querySelector("#step img"), + clrRecipImg = document.querySelector("#clr-recipe img"), + clrBreaksImg = document.querySelector("#clr-breaks img"); if (controls.clientWidth < 470) { step.childNodes[1].nodeValue = " Step"; @@ -36,23 +36,23 @@ ControlsWaiter.prototype.adjust_width = function() { } if (controls.clientWidth < 400) { - save_img.style.display = "none"; - load_img.style.display = "none"; - step_img.style.display = "none"; - clr_recip_img.style.display = "none"; - clr_breaks_img.style.display = "none"; + saveImg.style.display = "none"; + loadImg.style.display = "none"; + stepImg.style.display = "none"; + clrRecipImg.style.display = "none"; + clrBreaksImg.style.display = "none"; } else { - save_img.style.display = "inline"; - load_img.style.display = "inline"; - step_img.style.display = "inline"; - clr_recip_img.style.display = "inline"; - clr_breaks_img.style.display = "inline"; + saveImg.style.display = "inline"; + loadImg.style.display = "inline"; + stepImg.style.display = "inline"; + clrRecipImg.style.display = "inline"; + clrBreaksImg.style.display = "inline"; } if (controls.clientWidth < 330) { - clr_breaks.childNodes[1].nodeValue = " Clear breaks"; + clrBreaks.childNodes[1].nodeValue = " Clear breaks"; } else { - clr_breaks.childNodes[1].nodeValue = " Clear breakpoints"; + clrBreaks.childNodes[1].nodeValue = " Clear breakpoints"; } }; @@ -62,11 +62,11 @@ ControlsWaiter.prototype.adjust_width = function() { * * @param {boolean} value - The new value for Auto Bake. */ -ControlsWaiter.prototype.set_auto_bake = function(value) { - var auto_bake_checkbox = document.getElementById("auto-bake"); +ControlsWaiter.prototype.setAutoBake = function(value) { + var autoBakeCheckbox = document.getElementById("auto-bake"); - if (auto_bake_checkbox.checked !== value) { - auto_bake_checkbox.click(); + if (autoBakeCheckbox.checked !== value) { + autoBakeCheckbox.click(); } }; @@ -74,7 +74,7 @@ ControlsWaiter.prototype.set_auto_bake = function(value) { /** * Handler to trigger baking. */ -ControlsWaiter.prototype.bake_click = function() { +ControlsWaiter.prototype.bakeClick = function() { this.app.bake(); $("#output-text").selectRange(0); }; @@ -83,7 +83,7 @@ ControlsWaiter.prototype.bake_click = function() { /** * Handler for the 'Step through' command. Executes the next step of the recipe. */ -ControlsWaiter.prototype.step_click = function() { +ControlsWaiter.prototype.stepClick = function() { this.app.bake(true); $("#output-text").selectRange(0); }; @@ -92,18 +92,18 @@ ControlsWaiter.prototype.step_click = function() { /** * Handler for changes made to the Auto Bake checkbox. */ -ControlsWaiter.prototype.auto_bake_change = function() { - var auto_bake_label = document.getElementById("auto-bake-label"), - auto_bake_checkbox = document.getElementById("auto-bake"); +ControlsWaiter.prototype.autoBakeChange = function() { + var autoBakeLabel = document.getElementById("auto-bake-label"), + autoBakeCheckbox = document.getElementById("auto-bake"); - this.app.auto_bake_ = auto_bake_checkbox.checked; + this.app.autoBake_ = autoBakeCheckbox.checked; - if (auto_bake_checkbox.checked) { - auto_bake_label.classList.remove("btn-default"); - auto_bake_label.classList.add("btn-success"); + if (autoBakeCheckbox.checked) { + autoBakeLabel.classList.remove("btn-default"); + autoBakeLabel.classList.add("btn-success"); } else { - auto_bake_label.classList.remove("btn-success"); - auto_bake_label.classList.add("btn-default"); + autoBakeLabel.classList.remove("btn-success"); + autoBakeLabel.classList.add("btn-default"); } }; @@ -111,8 +111,8 @@ ControlsWaiter.prototype.auto_bake_change = function() { /** * Handler for the 'Clear recipe' command. Removes all operations from the recipe. */ -ControlsWaiter.prototype.clear_recipe_click = function() { - this.manager.recipe.clear_recipe(); +ControlsWaiter.prototype.clearRecipeClick = function() { + this.manager.recipe.clearRecipe(); }; @@ -120,8 +120,8 @@ ControlsWaiter.prototype.clear_recipe_click = function() { * Handler for the 'Clear breakpoints' command. Removes all breakpoints from operations in the * recipe. */ -ControlsWaiter.prototype.clear_breaks_click = function() { - var bps = document.querySelectorAll("#rec_list li.operation .breakpoint"); +ControlsWaiter.prototype.clearBreaksClick = function() { + var bps = document.querySelectorAll("#rec-list li.operation .breakpoint"); for (var i = 0; i < bps.length; i++) { bps[i].setAttribute("break", "false"); @@ -133,49 +133,49 @@ ControlsWaiter.prototype.clear_breaks_click = function() { /** * Populates the save disalog box with a URL incorporating the recipe and input. * - * @param {Object[]} [recipe_config] - The recipe configuration object array. + * @param {Object[]} [recipeConfig] - The recipe configuration object array. */ -ControlsWaiter.prototype.initialise_save_link = function(recipe_config) { - recipe_config = recipe_config || this.app.get_recipe_config(); +ControlsWaiter.prototype.initialiseSaveLink = function(recipeConfig) { + recipeConfig = recipeConfig || this.app.getRecipeConfig(); - var include_recipe = document.getElementById("save-link-recipe-checkbox").checked, - include_input = document.getElementById("save-link-input-checkbox").checked, - save_link_el = document.getElementById("save-link"), - save_link = this.generate_state_url(include_recipe, include_input, recipe_config); + var includeRecipe = document.getElementById("save-link-recipe-checkbox").checked, + includeInput = document.getElementById("save-link-input-checkbox").checked, + saveLinkEl = document.getElementById("save-link"), + saveLink = this.generateStateUrl(includeRecipe, includeInput, recipeConfig); - save_link_el.innerHTML = Utils.truncate(save_link, 120); - save_link_el.setAttribute("href", save_link); + saveLinkEl.innerHTML = Utils.truncate(saveLink, 120); + saveLinkEl.setAttribute("href", saveLink); }; /** * Generates a URL containing the current recipe and input state. * - * @param {boolean} include_recipe - Whether to include the recipe in the URL. - * @param {boolean} include_input - Whether to include the input in the URL. - * @param {Object[]} [recipe_config] - The recipe configuration object array. + * @param {boolean} includeRecipe - Whether to include the recipe in the URL. + * @param {boolean} includeInput - Whether to include the input in the URL. + * @param {Object[]} [recipeConfig] - The recipe configuration object array. * @returns {string} */ -ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_input, recipe_config) { - recipe_config = recipe_config || this.app.get_recipe_config(); +ControlsWaiter.prototype.generateStateUrl = function(includeRecipe, includeInput, recipeConfig) { + recipeConfig = recipeConfig || this.app.getRecipeConfig(); var link = window.location.protocol + "//" + window.location.host + window.location.pathname, - recipe_str = JSON.stringify(recipe_config), - input_str = Utils.to_base64(this.app.get_input(), "A-Za-z0-9+/"); // B64 alphabet with no padding + recipeStr = JSON.stringify(recipeConfig), + inputStr = Utils.toBase64(this.app.getInput(), "A-Za-z0-9+/"); // B64 alphabet with no padding - include_recipe = include_recipe && (recipe_config.length > 0); - include_input = include_input && (input_str.length > 0) && (input_str.length < 8000); + includeRecipe = includeRecipe && (recipeConfig.length > 0); + includeInput = includeInput && (inputStr.length > 0) && (inputStr.length < 8000); - if (include_recipe) { - link += "?recipe=" + encodeURIComponent(recipe_str); + if (includeRecipe) { + link += "?recipe=" + encodeURIComponent(recipeStr); } - if (include_recipe && include_input) { - link += "&input=" + encodeURIComponent(input_str); - } else if (include_input) { - link += "?input=" + encodeURIComponent(input_str); + if (includeRecipe && includeInput) { + link += "&input=" + encodeURIComponent(inputStr); + } else if (includeInput) { + link += "?input=" + encodeURIComponent(inputStr); } return link; @@ -185,10 +185,10 @@ ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_i /** * Handler for changes made to the save dialog text area. Re-initialises the save link. */ -ControlsWaiter.prototype.save_text_change = function() { +ControlsWaiter.prototype.saveTextChange = function() { try { - var recipe_config = JSON.parse(document.getElementById("save-text").value); - this.initialise_save_link(recipe_config); + var recipeConfig = JSON.parse(document.getElementById("save-text").value); + this.initialiseSaveLink(recipeConfig); } catch(err) {} }; @@ -196,12 +196,13 @@ ControlsWaiter.prototype.save_text_change = function() { /** * Handler for the 'Save' command. Pops up the save dialog box. */ -ControlsWaiter.prototype.save_click = function() { - var recipe_config = this.app.get_recipe_config(); - var recipe_str = JSON.stringify(recipe_config).replace(/},{/g, "},\n{"); - document.getElementById("save-text").value = recipe_str; +ControlsWaiter.prototype.saveClick = function() { + var recipeConfig = this.app.getRecipeConfig(), + recipeStr = JSON.stringify(recipeConfig).replace(/},{/g, "},\n{"); + + document.getElementById("save-text").value = recipeStr; - this.initialise_save_link(recipe_config); + this.initialiseSaveLink(recipeConfig); $("#save-modal").modal(); }; @@ -209,24 +210,24 @@ ControlsWaiter.prototype.save_click = function() { /** * Handler for the save link recipe checkbox change event. */ -ControlsWaiter.prototype.slr_check_change = function() { - this.initialise_save_link(); +ControlsWaiter.prototype.slrCheckChange = function() { + this.initialiseSaveLink(); }; /** * Handler for the save link input checkbox change event. */ -ControlsWaiter.prototype.sli_check_change = function() { - this.initialise_save_link(); +ControlsWaiter.prototype.sliCheckChange = function() { + this.initialiseSaveLink(); }; /** * Handler for the 'Load' command. Pops up the load dialog box. */ -ControlsWaiter.prototype.load_click = function() { - this.populate_load_recipes_list(); +ControlsWaiter.prototype.loadClick = function() { + this.populateLoadRecipesList(); $("#load-modal").modal(); }; @@ -234,88 +235,88 @@ ControlsWaiter.prototype.load_click = function() { /** * Saves the recipe specified in the save textarea to local storage. */ -ControlsWaiter.prototype.save_button_click = function() { - var recipe_name = document.getElementById("save-name").value, - recipe_str = document.getElementById("save-text").value; +ControlsWaiter.prototype.saveButtonClick = function() { + var recipeName = document.getElementById("save-name").value, + recipeStr = document.getElementById("save-text").value; - if (!recipe_name) { + if (!recipeName) { this.app.alert("Please enter a recipe name", "danger", 2000); return; } - var saved_recipes = localStorage.saved_recipes ? - JSON.parse(localStorage.saved_recipes) : [], - recipe_id = localStorage.recipe_id || 0; + var savedRecipes = localStorage.savedRecipes ? + JSON.parse(localStorage.savedRecipes) : [], + recipeId = localStorage.recipeId || 0; - saved_recipes.push({ - id: ++recipe_id, - name: recipe_name, - recipe: recipe_str + savedRecipes.push({ + id: ++recipeId, + name: recipeName, + recipe: recipeStr }); - localStorage.saved_recipes = JSON.stringify(saved_recipes); - localStorage.recipe_id = recipe_id; + localStorage.savedRecipes = JSON.stringify(savedRecipes); + localStorage.recipeId = recipeId; - this.app.alert("Recipe saved as \"" + recipe_name + "\".", "success", 2000); + this.app.alert("Recipe saved as \"" + recipeName + "\".", "success", 2000); }; /** * Populates the list of saved recipes in the load dialog box from local storage. */ -ControlsWaiter.prototype.populate_load_recipes_list = function() { - var load_name_el = document.getElementById("load-name"); +ControlsWaiter.prototype.populateLoadRecipesList = function() { + var loadNameEl = document.getElementById("load-name"); // Remove current recipes from select - var i = load_name_el.options.length; + var i = loadNameEl.options.length; while (i--) { - load_name_el.remove(i); + loadNameEl.remove(i); } // Add recipes to select - var saved_recipes = localStorage.saved_recipes ? - JSON.parse(localStorage.saved_recipes) : []; + var savedRecipes = localStorage.savedRecipes ? + JSON.parse(localStorage.savedRecipes) : []; - for (i = 0; i < saved_recipes.length; i++) { + for (i = 0; i < savedRecipes.length; i++) { var opt = document.createElement("option"); - opt.value = saved_recipes[i].id; - opt.innerHTML = saved_recipes[i].name; + opt.value = savedRecipes[i].id; + opt.innerHTML = savedRecipes[i].name; - load_name_el.appendChild(opt); + loadNameEl.appendChild(opt); } // Populate textarea with first recipe - document.getElementById("load-text").value = saved_recipes.length ? saved_recipes[0].recipe : ""; + document.getElementById("load-text").value = savedRecipes.length ? savedRecipes[0].recipe : ""; }; /** * Removes the currently selected recipe from local storage. */ -ControlsWaiter.prototype.load_delete_click = function() { - var id = document.getElementById("load-name").value, - saved_recipes = localStorage.saved_recipes ? - JSON.parse(localStorage.saved_recipes) : []; +ControlsWaiter.prototype.loadDeleteClick = function() { + var id = parseInt(document.getElementById("load-name").value, 10), + savedRecipes = localStorage.savedRecipes ? + JSON.parse(localStorage.savedRecipes) : []; - saved_recipes = saved_recipes.filter(function(r) { + savedRecipes = savedRecipes.filter(function(r) { return r.id !== id; }); - localStorage.saved_recipes = JSON.stringify(saved_recipes); - this.populate_load_recipes_list(); + localStorage.savedRecipes = JSON.stringify(savedRecipes); + this.populateLoadRecipesList(); }; /** * Displays the selected recipe in the load text box. */ -ControlsWaiter.prototype.load_name_change = function(e) { +ControlsWaiter.prototype.loadNameChange = function(e) { var el = e.target, - saved_recipes = localStorage.saved_recipes ? - JSON.parse(localStorage.saved_recipes) : [], + savedRecipes = localStorage.savedRecipes ? + JSON.parse(localStorage.savedRecipes) : [], id = parseInt(el.value, 10); - var recipe = saved_recipes.filter(function(r) { + var recipe = savedRecipes.filter(function(r) { return r.id === id; })[0]; @@ -326,12 +327,12 @@ ControlsWaiter.prototype.load_name_change = function(e) { /** * Loads the selected recipe and populates the Recipe with its operations. */ -ControlsWaiter.prototype.load_button_click = function() { +ControlsWaiter.prototype.loadButtonClick = function() { try { - var recipe_config = JSON.parse(document.getElementById("load-text").value); - this.app.set_recipe_config(recipe_config); + var recipeConfig = JSON.parse(document.getElementById("load-text").value); + this.app.setRecipeConfig(recipeConfig); - $("#rec_list [data-toggle=popover]").popover(); + $("#rec-list [data-toggle=popover]").popover(); } catch(e) { this.app.alert("Invalid recipe", "danger", 2000); } diff --git a/src/js/views/html/HTMLApp.js b/src/js/views/html/HTMLApp.js index 35ce01fe..b4930da4 100755 --- a/src/js/views/html/HTMLApp.js +++ b/src/js/views/html/HTMLApp.js @@ -11,22 +11,22 @@ * @constructor * @param {CatConf[]} categories - The list of categories and operations to be populated. * @param {Object.} operations - The list of operation configuration objects. - * @param {String[]} default_favourites - A list of default favourite operations. + * @param {String[]} defaultFavourites - A list of default favourite operations. * @param {Object} options - Default setting for app options. */ -var HTMLApp = function(categories, operations, default_favourites, default_options) { +var HTMLApp = function(categories, operations, defaultFavourites, defaultOptions) { this.categories = categories; this.operations = operations; - this.dfavourites = default_favourites; - this.doptions = default_options; - this.options = Utils.extend({}, default_options); + this.dfavourites = defaultFavourites; + this.doptions = defaultOptions; + this.options = Utils.extend({}, defaultOptions); this.chef = new Chef(); this.manager = new Manager(this); - this.auto_bake_ = false; + this.autoBake_ = false; this.progress = 0; - this.ing_id = 0; + this.ingId = 0; window.chef = this.chef; }; @@ -39,13 +39,13 @@ var HTMLApp = function(categories, operations, default_favourites, default_optio */ HTMLApp.prototype.setup = function() { document.dispatchEvent(this.manager.appstart); - this.initialise_splitter(); - this.load_local_storage(); - this.populate_operations_list(); + this.initialiseSplitter(); + this.loadLocalStorage(); + this.populateOperationsList(); this.manager.setup(); - this.reset_layout(); - this.set_compile_message(); - this.load_URI_params(); + this.resetLayout(); + this.setCompileMessage(); + this.loadURIParams(); }; @@ -54,10 +54,10 @@ HTMLApp.prototype.setup = function() { * * @param {Error} err */ -HTMLApp.prototype.handle_error = function(err) { +HTMLApp.prototype.handleError = function(err) { console.error(err); - var msg = err.display_str || err.toString(); - this.alert(msg, "danger", this.options.error_timeout, !this.options.show_errors); + var msg = err.displayStr || err.toString(); + this.alert(msg, "danger", this.options.errorTimeout, !this.options.showErrors); }; @@ -72,32 +72,32 @@ HTMLApp.prototype.bake = function(step) { try { response = this.chef.bake( - this.get_input(), // The user's input - this.get_recipe_config(), // The configuration of the recipe + this.getInput(), // The user's input + this.getRecipeConfig(), // The configuration of the recipe this.options, // Options set by the user this.progress, // The current position in the recipe step // Whether or not to take one step or execute the whole recipe ); } catch (err) { - this.handle_error(err); + this.handleError(err); } if (!response) return; if (response.error) { - this.handle_error(response.error); + this.handleError(response.error); } this.options = response.options; - this.dish_str = response.type === "html" ? Utils.strip_html_tags(response.result, true) : response.result; + this.dishStr = response.type === "html" ? Utils.stripHtmlTags(response.result, true) : response.result; this.progress = response.progress; - this.manager.recipe.update_breakpoint_indicator(response.progress); + this.manager.recipe.updateBreakpointIndicator(response.progress); this.manager.output.set(response.result, response.type, response.duration); // If baking took too long, disable auto-bake - if (response.duration > this.options.auto_bake_threshold && this.auto_bake_) { - this.manager.controls.set_auto_bake(false); - this.alert("Baking took longer than " + this.options.auto_bake_threshold + + if (response.duration > this.options.autoBakeThreshold && this.autoBake_) { + this.manager.controls.setAutoBake(false); + this.alert("Baking took longer than " + this.options.autoBakeThreshold + "ms, Auto Bake has been disabled.", "warning", 5000); } }; @@ -106,8 +106,8 @@ HTMLApp.prototype.bake = function(step) { /** * Runs Auto Bake if it is set. */ -HTMLApp.prototype.auto_bake = function() { - if (this.auto_bake_) { +HTMLApp.prototype.autoBake = function() { + if (this.autoBake_) { this.bake(); } }; @@ -122,15 +122,15 @@ HTMLApp.prototype.auto_bake = function() { * * @returns {number} - The number of miliseconds it took to run the silent bake. */ -HTMLApp.prototype.silent_bake = function() { - var start_time = new Date().getTime(), - recipe_config = this.get_recipe_config(); +HTMLApp.prototype.silentBake = function() { + var startTime = new Date().getTime(), + recipeConfig = this.getRecipeConfig(); - if (this.auto_bake_) { - this.chef.silent_bake(recipe_config); + if (this.autoBake_) { + this.chef.silentBake(recipeConfig); } - return new Date().getTime() - start_time; + return new Date().getTime() - startTime; }; @@ -139,11 +139,11 @@ HTMLApp.prototype.silent_bake = function() { * * @returns {string} */ -HTMLApp.prototype.get_input = function() { +HTMLApp.prototype.getInput = function() { var input = this.manager.input.get(); // Save to session storage in case we need to restore it later - sessionStorage.setItem("input_length", input.length); + sessionStorage.setItem("inputLength", input.length); sessionStorage.setItem("input", input); return input; @@ -155,8 +155,8 @@ HTMLApp.prototype.get_input = function() { * * @param {string} input - The string to set the input to */ -HTMLApp.prototype.set_input = function(input) { - sessionStorage.setItem("input_length", input.length); +HTMLApp.prototype.setInput = function(input) { + sessionStorage.setItem("inputLength", input.length); sessionStorage.setItem("input", input); this.manager.input.set(input); }; @@ -168,32 +168,32 @@ HTMLApp.prototype.set_input = function(input) { * * @fires Manager#oplistcreate */ -HTMLApp.prototype.populate_operations_list = function() { +HTMLApp.prototype.populateOperationsList = function() { // Move edit button away before we overwrite it document.body.appendChild(document.getElementById("edit-favourites")); var html = ""; for (var i = 0; i < this.categories.length; i++) { - var cat_conf = this.categories[i], + var catConf = this.categories[i], selected = i === 0, - cat = new HTMLCategory(cat_conf.name, selected); + cat = new HTMLCategory(catConf.name, selected); - for (var j = 0; j < cat_conf.ops.length; j++) { - var op_name = cat_conf.ops[j], - op = new HTMLOperation(op_name, this.operations[op_name], this, this.manager); - cat.add_operation(op); + for (var j = 0; j < catConf.ops.length; j++) { + var opName = catConf.ops[j], + op = new HTMLOperation(opName, this.operations[opName], this, this.manager); + cat.addOperation(op); } - html += cat.to_html(); + html += cat.toHtml(); } document.getElementById("categories").innerHTML = html; - var op_lists = document.querySelectorAll("#categories .op_list"); + var opLists = document.querySelectorAll("#categories .op-list"); - for (i = 0; i < op_lists.length; i++) { - op_lists[i].dispatchEvent(this.manager.oplistcreate); + for (i = 0; i < opLists.length; i++) { + opLists[i].dispatchEvent(this.manager.oplistcreate); } // Add edit button to first category (Favourites) @@ -204,20 +204,23 @@ HTMLApp.prototype.populate_operations_list = function() { /** * Sets up the adjustable splitter to allow the user to resize areas of the page. */ -HTMLApp.prototype.initialise_splitter = function() { - Split(["#operations", "#recipe", "#IO"], { +HTMLApp.prototype.initialiseSplitter = function() { + this.columnSplitter = Split(["#operations", "#recipe", "#IO"], { sizes: [20, 30, 50], - minSize: [240, 325, 500], + minSize: [240, 325, 440], gutterSize: 4, - onDrag: this.manager.controls.adjust_width.bind(this.manager.controls) + onDrag: function() { + this.manager.controls.adjustWidth(); + this.manager.output.adjustWidth(); + }.bind(this) }); - Split(["#input", "#output"], { + this.ioSplitter = Split(["#input", "#output"], { direction: "vertical", gutterSize: 4, }); - this.reset_layout(); + this.resetLayout(); }; @@ -225,16 +228,16 @@ HTMLApp.prototype.initialise_splitter = function() { * Loads the information previously saved to the HTML5 local storage object so that user options * and favourites can be restored. */ -HTMLApp.prototype.load_local_storage = function() { +HTMLApp.prototype.loadLocalStorage = function() { // Load options - var l_options; + var lOptions; if (localStorage.options !== undefined) { - l_options = JSON.parse(localStorage.options); + lOptions = JSON.parse(localStorage.options); } - this.manager.options.load(l_options); + this.manager.options.load(lOptions); // Load favourites - this.load_favourites(); + this.loadFavourites(); }; @@ -243,21 +246,21 @@ HTMLApp.prototype.load_local_storage = function() { * Favourites category with them. * If the user currently has no saved favourites, the defaults from the view constructor are used. */ -HTMLApp.prototype.load_favourites = function() { +HTMLApp.prototype.loadFavourites = function() { var favourites = localStorage.favourites && localStorage.favourites.length > 2 ? JSON.parse(localStorage.favourites) : this.dfavourites; - favourites = this.valid_favourites(favourites); - this.save_favourites(favourites); + favourites = this.validFavourites(favourites); + this.saveFavourites(favourites); - var fav_cat = this.categories.filter(function(c) { + var favCat = this.categories.filter(function(c) { return c.name === "Favourites"; })[0]; - if (fav_cat) { - fav_cat.ops = favourites; + if (favCat) { + favCat.ops = favourites; } else { this.categories.unshift({ name: "Favourites", @@ -274,17 +277,17 @@ HTMLApp.prototype.load_favourites = function() { * @param {string[]} favourites - A list of the user's favourite operations * @returns {string[]} A list of the valid favourites */ -HTMLApp.prototype.valid_favourites = function(favourites) { - var valid_favs = []; +HTMLApp.prototype.validFavourites = function(favourites) { + var validFavs = []; for (var i = 0; i < favourites.length; i++) { if (this.operations.hasOwnProperty(favourites[i])) { - valid_favs.push(favourites[i]); + validFavs.push(favourites[i]); } else { - this.alert("The operation \"" + Utils.escape_html(favourites[i]) + + this.alert("The operation \"" + Utils.escapeHtml(favourites[i]) + "\" is no longer available. It has been removed from your favourites.", "info"); } } - return valid_favs; + return validFavs; }; @@ -293,8 +296,8 @@ HTMLApp.prototype.valid_favourites = function(favourites) { * * @param {string[]} favourites - A list of the user's favourite operations */ -HTMLApp.prototype.save_favourites = function(favourites) { - localStorage.setItem("favourites", JSON.stringify(this.valid_favourites(favourites))); +HTMLApp.prototype.saveFavourites = function(favourites) { + localStorage.setItem("favourites", JSON.stringify(this.validFavourites(favourites))); }; @@ -302,11 +305,11 @@ HTMLApp.prototype.save_favourites = function(favourites) { * Resets favourite operations back to the default as specified in the view constructor and * refreshes the operation list. */ -HTMLApp.prototype.reset_favourites = function() { - this.save_favourites(this.dfavourites); - this.load_favourites(); - this.populate_operations_list(); - this.manager.recipe.initialise_operation_drag_n_drop(); +HTMLApp.prototype.resetFavourites = function() { + this.saveFavourites(this.dfavourites); + this.loadFavourites(); + this.populateOperationsList(); + this.manager.recipe.initialiseOperationDragNDrop(); }; @@ -315,7 +318,7 @@ HTMLApp.prototype.reset_favourites = function() { * * @param {string} name - The name of the operation */ -HTMLApp.prototype.add_favourite = function(name) { +HTMLApp.prototype.addFavourite = function(name) { var favourites = JSON.parse(localStorage.favourites); if (favourites.indexOf(name) >= 0) { @@ -324,19 +327,19 @@ HTMLApp.prototype.add_favourite = function(name) { } favourites.push(name); - this.save_favourites(favourites); - this.load_favourites(); - this.populate_operations_list(); - this.manager.recipe.initialise_operation_drag_n_drop(); + this.saveFavourites(favourites); + this.loadFavourites(); + this.populateOperationsList(); + this.manager.recipe.initialiseOperationDragNDrop(); }; /** * Checks for input and recipe in the URI parameters and loads them if present. */ -HTMLApp.prototype.load_URI_params = function() { +HTMLApp.prototype.loadURIParams = function() { // Load query string from URI - this.query_string = (function(a) { + this.queryString = (function(a) { if (a === "") return {}; var b = {}; for (var i = 0; i < a.length; i++) { @@ -351,46 +354,46 @@ HTMLApp.prototype.load_URI_params = function() { })(window.location.search.substr(1).split("&")); // Turn off auto-bake while loading - var auto_bake_val = this.auto_bake_; - this.auto_bake_ = false; + var autoBakeVal = this.autoBake_; + this.autoBake_ = false; // Read in recipe from query string - if (this.query_string.recipe) { + if (this.queryString.recipe) { try { - var recipe_config = JSON.parse(this.query_string.recipe); - this.set_recipe_config(recipe_config); + var recipeConfig = JSON.parse(this.queryString.recipe); + this.setRecipeConfig(recipeConfig); } catch(err) {} - } else if (this.query_string.op) { + } else if (this.queryString.op) { // If there's no recipe, look for single operations - this.manager.recipe.clear_recipe(); + this.manager.recipe.clearRecipe(); try { - this.manager.recipe.add_operation(this.query_string.op); + this.manager.recipe.addOperation(this.queryString.op); } catch(err) { // If no exact match, search for nearest match and add that - var matched_ops = this.manager.ops.filter_operations(this.query_string.op, false); - if (matched_ops.length) { - this.manager.recipe.add_operation(matched_ops[0].name); + var matchedOps = this.manager.ops.filterOperations(this.queryString.op, false); + if (matchedOps.length) { + this.manager.recipe.addOperation(matchedOps[0].name); } // Populate search with the string var search = document.getElementById("search"); - search.value = this.query_string.op; + search.value = this.queryString.op; search.dispatchEvent(new Event("search")); } } // Read in input data from query string - if (this.query_string.input) { + if (this.queryString.input) { try { - var input_data = Utils.from_base64(this.query_string.input); - this.set_input(input_data); + var inputData = Utils.fromBase64(this.queryString.input); + this.setInput(inputData); } catch(err) {} } // Restore auto-bake state - this.auto_bake_ = auto_bake_val; - this.auto_bake(); + this.autoBake_ = autoBakeVal; + this.autoBake(); }; @@ -399,8 +402,8 @@ HTMLApp.prototype.load_URI_params = function() { * * @returns {number} */ -HTMLApp.prototype.next_ing_id = function() { - return this.ing_id++; +HTMLApp.prototype.nextIngId = function() { + return this.ingId++; }; @@ -409,48 +412,48 @@ HTMLApp.prototype.next_ing_id = function() { * * @returns {Object[]} */ -HTMLApp.prototype.get_recipe_config = function() { - var recipe_config = this.manager.recipe.get_config(); - sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config)); - return recipe_config; +HTMLApp.prototype.getRecipeConfig = function() { + var recipeConfig = this.manager.recipe.getConfig(); + sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig)); + return recipeConfig; }; /** * Given a recipe configuration, sets the recipe to that configuration. * - * @param {Object[]} recipe_config - The recipe configuration + * @param {Object[]} recipeConfig - The recipe configuration */ -HTMLApp.prototype.set_recipe_config = function(recipe_config) { - sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config)); - document.getElementById("rec_list").innerHTML = null; +HTMLApp.prototype.setRecipeConfig = function(recipeConfig) { + sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig)); + document.getElementById("rec-list").innerHTML = null; - for (var i = 0; i < recipe_config.length; i++) { - var item = this.manager.recipe.add_operation(recipe_config[i].op); + for (var i = 0; i < recipeConfig.length; i++) { + var item = this.manager.recipe.addOperation(recipeConfig[i].op); // Populate arguments var args = item.querySelectorAll(".arg"); for (var j = 0; j < args.length; j++) { if (args[j].getAttribute("type") === "checkbox") { // checkbox - args[j].checked = recipe_config[i].args[j]; + args[j].checked = recipeConfig[i].args[j]; } else if (args[j].classList.contains("toggle-string")) { - // toggle_string - args[j].value = recipe_config[i].args[j].string; + // toggleString + args[j].value = recipeConfig[i].args[j].string; args[j].previousSibling.children[0].innerHTML = - Utils.escape_html(recipe_config[i].args[j].option) + + Utils.escapeHtml(recipeConfig[i].args[j].option) + " "; } else { // all others - args[j].value = recipe_config[i].args[j]; + args[j].value = recipeConfig[i].args[j]; } } // Set disabled and breakpoint - if (recipe_config[i].disabled) { + if (recipeConfig[i].disabled) { item.querySelector(".disable-icon").click(); } - if (recipe_config[i].breakpoint) { + if (recipeConfig[i].breakpoint) { item.querySelector(".breakpoint").click(); } @@ -462,33 +465,31 @@ HTMLApp.prototype.set_recipe_config = function(recipe_config) { /** * Resets the splitter positions to default. */ -HTMLApp.prototype.reset_layout = function() { - document.getElementById("operations").style.width = "calc(20% - 2px)"; - document.getElementById("recipe").style.width = "calc(30% - 4px)"; - document.getElementById("IO").style.width = "calc(50% - 2px)"; - document.getElementById("input").style.height = "calc(50% - 2px)"; - document.getElementById("output").style.height = "calc(50% - 2px)"; +HTMLApp.prototype.resetLayout = function() { + this.columnSplitter.setSizes([20, 30, 50]); + this.ioSplitter.setSizes([50, 50]); - this.manager.controls.adjust_width(); + this.manager.controls.adjustWidth(); + this.manager.output.adjustWidth(); }; /** * Sets the compile message. */ -HTMLApp.prototype.set_compile_message = function() { +HTMLApp.prototype.setCompileMessage = function() { // Display time since last build and compile message var now = new Date(), - time_since_compile = Utils.fuzzy_time(now.getTime() - window.compile_time), - compile_info = "Last build: " + - time_since_compile.substr(0, 1).toUpperCase() + time_since_compile.substr(1) + " ago"; + timeSinceCompile = Utils.fuzzyTime(now.getTime() - window.compileTime), + compileInfo = "Last build: " + + timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1) + " ago"; - if (window.compile_message !== "") { - compile_info += " - " + window.compile_message; + if (window.compileMessage !== "") { + compileInfo += " - " + window.compileMessage; } - compile_info += ""; - document.getElementById("notice").innerHTML = compile_info; + compileInfo += ""; + document.getElementById("notice").innerHTML = compileInfo; }; @@ -524,32 +525,32 @@ HTMLApp.prototype.alert = function(str, style, timeout, silent) { style = style || "danger"; timeout = timeout || 0; - var alert_el = document.getElementById("alert"), - alert_content = document.getElementById("alert-content"); + var alertEl = document.getElementById("alert"), + alertContent = document.getElementById("alert-content"); - alert_el.classList.remove("alert-danger"); - alert_el.classList.remove("alert-warning"); - alert_el.classList.remove("alert-info"); - alert_el.classList.remove("alert-success"); - alert_el.classList.add("alert-" + style); + alertEl.classList.remove("alert-danger"); + alertEl.classList.remove("alert-warning"); + alertEl.classList.remove("alert-info"); + alertEl.classList.remove("alert-success"); + alertEl.classList.add("alert-" + style); // If the box hasn't been closed, append to it rather than replacing - if (alert_el.style.display === "block") { - alert_content.innerHTML += + if (alertEl.style.display === "block") { + alertContent.innerHTML += "

          [" + time.toLocaleTimeString() + "] " + str; } else { - alert_content.innerHTML = + alertContent.innerHTML = "[" + time.toLocaleTimeString() + "] " + str; } // Stop the animation if it is in progress $("#alert").stop(); - alert_el.style.display = "block"; - alert_el.style.opacity = 1; + alertEl.style.display = "block"; + alertEl.style.opacity = 1; if (timeout > 0) { - clearTimeout(this.alert_timeout); - this.alert_timeout = setTimeout(function(){ + clearTimeout(this.alertTimeout); + this.alertTimeout = setTimeout(function(){ $("#alert").slideUp(100); }, timeout); } @@ -575,20 +576,20 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) { document.getElementById("confirm-body").innerHTML = body; document.getElementById("confirm-modal").style.display = "block"; - this.confirm_closed = false; + this.confirmClosed = false; $("#confirm-modal").modal() .one("show.bs.modal", function(e) { - this.confirm_closed = false; + this.confirmClosed = false; }.bind(this)) .one("click", "#confirm-yes", function() { - this.confirm_closed = true; + this.confirmClosed = true; callback.bind(scope)(true); $("#confirm-modal").modal("hide"); }.bind(this)) .one("hide.bs.modal", function(e) { - if (!this.confirm_closed) + if (!this.confirmClosed) callback.bind(scope)(false); - this.confirm_closed = true; + this.confirmClosed = true; }.bind(this)); }; @@ -597,7 +598,7 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) { * Handler for the alert close button click event. * Closes the alert box. */ -HTMLApp.prototype.alert_close_click = function() { +HTMLApp.prototype.alertCloseClick = function() { document.getElementById("alert").style.display = "none"; }; @@ -609,13 +610,13 @@ HTMLApp.prototype.alert_close_click = function() { * @listens Manager#statechange * @param {event} e */ -HTMLApp.prototype.state_change = function(e) { - this.auto_bake(); +HTMLApp.prototype.stateChange = function(e) { + this.autoBake(); // Update the current history state (not creating a new one) - if (this.options.update_url) { - this.last_state_url = this.manager.controls.generate_state_url(true, true); - window.history.replaceState({}, "CyberChef", this.last_state_url); + if (this.options.updateUrl) { + this.lastStateUrl = this.manager.controls.generateStateUrl(true, true); + window.history.replaceState({}, "CyberChef", this.lastStateUrl); } }; @@ -626,9 +627,9 @@ HTMLApp.prototype.state_change = function(e) { * * @param {event} e */ -HTMLApp.prototype.pop_state = function(e) { - if (window.location.href.split("#")[0] !== this.last_state_url) { - this.load_URI_params(); +HTMLApp.prototype.popState = function(e) { + if (window.location.href.split("#")[0] !== this.lastStateUrl) { + this.loadURIParams(); } }; @@ -636,11 +637,11 @@ HTMLApp.prototype.pop_state = function(e) { /** * Function to call an external API from this view. */ -HTMLApp.prototype.call_api = function(url, type, data, data_type, content_type) { +HTMLApp.prototype.callApi = function(url, type, data, dataType, contentType) { type = type || "POST"; data = data || {}; - data_type = data_type || undefined; - content_type = content_type || "application/json"; + dataType = dataType || undefined; + contentType = contentType || "application/json"; var response = null, success = false; @@ -650,8 +651,8 @@ HTMLApp.prototype.call_api = function(url, type, data, data_type, content_type) async: false, type: type, data: data, - dataType: data_type, - contentType: content_type, + dataType: dataType, + contentType: contentType, success: function(data) { success = true; response = data; diff --git a/src/js/views/html/HTMLCategory.js b/src/js/views/html/HTMLCategory.js index 83909d50..071d3b81 100755 --- a/src/js/views/html/HTMLCategory.js +++ b/src/js/views/html/HTMLCategory.js @@ -12,7 +12,7 @@ var HTMLCategory = function(name, selected) { this.name = name; this.selected = selected; - this.op_list = []; + this.opList = []; }; @@ -21,8 +21,8 @@ var HTMLCategory = function(name, selected) { * * @param {HTMLOperation} operation - The operation to add. */ -HTMLCategory.prototype.add_operation = function(operation) { - this.op_list.push(operation); +HTMLCategory.prototype.addOperation = function(operation) { + this.opList.push(operation); }; @@ -31,18 +31,18 @@ HTMLCategory.prototype.add_operation = function(operation) { * * @returns {string} */ -HTMLCategory.prototype.to_html = function() { - var cat_name = "cat" + this.name.replace(/[\s/-:_]/g, ""); +HTMLCategory.prototype.toHtml = function() { + var catName = "cat" + this.name.replace(/[\s/-:_]/g, ""); var html = "
          \ \ + data-parent='#categories' href='#" + catName + "'>\ " + this.name + "\ \ -
            "; +
              "; - for (var i = 0; i < this.op_list.length; i++) { - html += this.op_list[i].to_stub_html(); + for (var i = 0; i < this.opList.length; i++) { + html += this.opList[i].toStubHtml(); } html += "
          "; diff --git a/src/js/views/html/HTMLIngredient.js b/src/js/views/html/HTMLIngredient.js index 086a7089..909b16cd 100755 --- a/src/js/views/html/HTMLIngredient.js +++ b/src/js/views/html/HTMLIngredient.js @@ -18,11 +18,11 @@ var HTMLIngredient = function(config, app, manager) { this.type = config.type; this.value = config.value; this.disabled = config.disabled || false; - this.disable_args = config.disable_args || false; + this.disableArgs = config.disableArgs || false; this.placeholder = config.placeholder || false; this.target = config.target; - this.toggle_values = config.toggle_values; - this.id = "ing-" + this.app.next_ing_id(); + this.toggleValues = config.toggleValues; + this.id = "ing-" + this.app.nextIngId(); }; @@ -31,12 +31,12 @@ var HTMLIngredient = function(config, app, manager) { * * @returns {string} */ -HTMLIngredient.prototype.to_html = function() { +HTMLIngredient.prototype.toHtml = function() { var inline = (this.type === "boolean" || this.type === "number" || this.type === "option" || - this.type === "short_string" || - this.type === "binary_short_string"), + this.type === "shortString" || + this.type === "binaryShortString"), html = inline ? "" : "
           
          ", i, m; @@ -46,50 +46,50 @@ HTMLIngredient.prototype.to_html = function() { switch (this.type) { case "string": - case "binary_string": - case "byte_array": - html += ""; break; - case "short_string": - case "binary_short_string": + case "shortString": + case "binaryShortString": html += ""; break; - case "toggle_string": + case "toggleString": html += "
          \
          "; break; case "number": - html += ""; break; case "boolean": - html += ""; - if (this.disable_args) { - this.manager.add_dynamic_listener("#" + this.id, "click", this.toggle_disable_args, this); + if (this.disableArgs) { + this.manager.addDynamicListener("#" + this.id, "click", this.toggleDisableArgs, this); } break; case "option": - html += ""; break; - case "populate_option": - html += ""; - this.manager.add_dynamic_listener("#" + this.id, "change", this.populate_option_change, this); + this.manager.addDynamicListener("#" + this.id, "change", this.populateOptionChange, this); break; - case "editable_option": + case "editableOption": html += "
          "; html += ""; html += ""; html += "
          "; - this.manager.add_dynamic_listener("#sel-" + this.id, "change", this.editable_option_change, this); + this.manager.addDynamicListener("#sel-" + this.id, "change", this.editableOptionChange, this); break; case "text": - html += ""; @@ -153,18 +153,18 @@ HTMLIngredient.prototype.to_html = function() { /** * Handler for argument disable toggle. - * Toggles disabled state for all arguments in the disable_args list for this ingredient. + * Toggles disabled state for all arguments in the disableArgs list for this ingredient. * * @param {event} e */ -HTMLIngredient.prototype.toggle_disable_args = function(e) { +HTMLIngredient.prototype.toggleDisableArgs = function(e) { var el = e.target, op = el.parentNode.parentNode, args = op.querySelectorAll(".arg-group"), els; - for (var i = 0; i < this.disable_args.length; i++) { - els = args[this.disable_args[i]].querySelectorAll("input, select, button"); + for (var i = 0; i < this.disableArgs.length; i++) { + els = args[this.disableArgs[i]].querySelectorAll("input, select, button"); for (var j = 0; j < els.length; j++) { if (els[j].getAttribute("disabled")) { @@ -175,7 +175,7 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) { } } - this.manager.recipe.ing_change(); + this.manager.recipe.ingChange(); }; @@ -185,14 +185,14 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) { * * @param {event} e */ -HTMLIngredient.prototype.populate_option_change = function(e) { +HTMLIngredient.prototype.populateOptionChange = function(e) { var el = e.target, op = el.parentNode.parentNode, target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea"); target.value = el.childNodes[el.selectedIndex].getAttribute("populate-value"); - this.manager.recipe.ing_change(); + this.manager.recipe.ingChange(); }; @@ -202,11 +202,11 @@ HTMLIngredient.prototype.populate_option_change = function(e) { * * @param {event} e */ -HTMLIngredient.prototype.editable_option_change = function(e) { +HTMLIngredient.prototype.editableOptionChange = function(e) { var select = e.target, input = select.nextSibling; input.value = select.childNodes[select.selectedIndex].value; - this.manager.recipe.ing_change(); + this.manager.recipe.ingChange(); }; diff --git a/src/js/views/html/HTMLOperation.js b/src/js/views/html/HTMLOperation.js index 1bf9849d..48a33661 100755 --- a/src/js/views/html/HTMLOperation.js +++ b/src/js/views/html/HTMLOperation.js @@ -17,13 +17,13 @@ var HTMLOperation = function(name, config, app, manager) { this.name = name; this.description = config.description; - this.manual_bake = config.manual_bake || false; + this.manualBake = config.manualBake || false; this.config = config; - this.ing_list = []; + this.ingList = []; for (var i = 0; i < config.args.length; i++) { var ing = new HTMLIngredient(config.args[i], this.app, this.manager); - this.ing_list.push(ing); + this.ingList.push(ing); } }; @@ -43,7 +43,7 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl * * @returns {string} */ -HTMLOperation.prototype.to_stub_html = function(remove_icon) { +HTMLOperation.prototype.toStubHtml = function(removeIcon) { var html = "
        • "; } @@ -73,11 +73,11 @@ HTMLOperation.prototype.to_stub_html = function(remove_icon) { * * @returns {string} */ -HTMLOperation.prototype.to_full_html = function() { +HTMLOperation.prototype.toFullHtml = function() { var html = "
          " + this.name + "
          "; - for (var i = 0; i < this.ing_list.length; i++) { - html += this.ing_list[i].to_html(); + for (var i = 0; i < this.ingList.length; i++) { + html += this.ingList[i].toHtml(); } html += "
          \ @@ -95,20 +95,20 @@ HTMLOperation.prototype.to_full_html = function() { /** * Highlights the searched string in the name and description of the operation. * - * @param {string} search_str - * @param {number} name_pos - The position of the search string in the operation name - * @param {number} desc_pos - The position of the search string in the operation description + * @param {string} searchStr + * @param {number} namePos - The position of the search string in the operation name + * @param {number} descPos - The position of the search string in the operation description */ -HTMLOperation.prototype.highlight_search_string = function(search_str, name_pos, desc_pos) { - if (name_pos >= 0) { - this.name = this.name.slice(0, name_pos) + "" + - this.name.slice(name_pos, name_pos + search_str.length) + "" + - this.name.slice(name_pos + search_str.length); +HTMLOperation.prototype.highlightSearchString = function(searchStr, namePos, descPos) { + if (namePos >= 0) { + this.name = this.name.slice(0, namePos) + "" + + this.name.slice(namePos, namePos + searchStr.length) + "" + + this.name.slice(namePos + searchStr.length); } - if (this.description && desc_pos >= 0) { - this.description = this.description.slice(0, desc_pos) + "" + - this.description.slice(desc_pos, desc_pos + search_str.length) + "" + - this.description.slice(desc_pos + search_str.length); + if (this.description && descPos >= 0) { + this.description = this.description.slice(0, descPos) + "" + + this.description.slice(descPos, descPos + searchStr.length) + "" + + this.description.slice(descPos + searchStr.length); } }; diff --git a/src/js/views/html/HighlighterWaiter.js b/src/js/views/html/HighlighterWaiter.js index 26cb46c0..506b8175 100755 --- a/src/js/views/html/HighlighterWaiter.js +++ b/src/js/views/html/HighlighterWaiter.js @@ -11,8 +11,8 @@ var HighlighterWaiter = function(app) { this.app = app; - this.mouse_button_down = false; - this.mouse_target = null; + this.mouseButtonDown = false; + this.mouseTarget = null; }; @@ -37,7 +37,7 @@ HighlighterWaiter.OUTPUT = 1; * @private * @returns {boolean} */ -HighlighterWaiter.prototype._is_selection_backwards = function() { +HighlighterWaiter.prototype._isSelectionBackwards = function() { var backwards = false, sel = window.getSelection(); @@ -60,7 +60,7 @@ HighlighterWaiter.prototype._is_selection_backwards = function() { * @param {number} offset - The offset since the last HTML element. * @returns {number} */ -HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) { +HighlighterWaiter.prototype._getOutputHtmlOffset = function(node, offset) { var sel = window.getSelection(), range = document.createRange(); @@ -81,7 +81,7 @@ HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) { * @returns {number} pos.start * @returns {number} pos.end */ -HighlighterWaiter.prototype._get_output_html_selection_offsets = function() { +HighlighterWaiter.prototype._getOutputHtmlSelectionOffsets = function() { var sel = window.getSelection(), range, start = 0, @@ -90,9 +90,9 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() { if (sel.rangeCount) { range = sel.getRangeAt(sel.rangeCount - 1); - backwards = this._is_selection_backwards(); - start = this._get_output_html_offset(range.startContainer, range.startOffset); - end = this._get_output_html_offset(range.endContainer, range.endOffset); + backwards = this._isSelectionBackwards(); + start = this._getOutputHtmlOffset(range.startContainer, range.startOffset); + end = this._getOutputHtmlOffset(range.endContainer, range.endOffset); sel.removeAllRanges(); sel.addRange(range); @@ -117,7 +117,7 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() { * * @param {event} e */ -HighlighterWaiter.prototype.input_scroll = function(e) { +HighlighterWaiter.prototype.inputScroll = function(e) { var el = e.target; document.getElementById("input-highlighter").scrollTop = el.scrollTop; document.getElementById("input-highlighter").scrollLeft = el.scrollLeft; @@ -130,7 +130,7 @@ HighlighterWaiter.prototype.input_scroll = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_scroll = function(e) { +HighlighterWaiter.prototype.outputScroll = function(e) { var el = e.target; document.getElementById("output-highlighter").scrollTop = el.scrollTop; document.getElementById("output-highlighter").scrollLeft = el.scrollLeft; @@ -143,18 +143,18 @@ HighlighterWaiter.prototype.output_scroll = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.input_mousedown = function(e) { - this.mouse_button_down = true; - this.mouse_target = HighlighterWaiter.INPUT; - this.remove_highlights(); +HighlighterWaiter.prototype.inputMousedown = function(e) { + this.mouseButtonDown = true; + this.mouseTarget = HighlighterWaiter.INPUT; + this.removeHighlights(); var el = e.target, start = el.selectionStart, end = el.selectionEnd; if (start !== 0 || end !== 0) { - document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end); - this.highlight_output([{start: start, end: end}]); + document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end); + this.highlightOutput([{start: start, end: end}]); } }; @@ -165,18 +165,18 @@ HighlighterWaiter.prototype.input_mousedown = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_mousedown = function(e) { - this.mouse_button_down = true; - this.mouse_target = HighlighterWaiter.OUTPUT; - this.remove_highlights(); +HighlighterWaiter.prototype.outputMousedown = function(e) { + this.mouseButtonDown = true; + this.mouseTarget = HighlighterWaiter.OUTPUT; + this.removeHighlights(); var el = e.target, start = el.selectionStart, end = el.selectionEnd; if (start !== 0 || end !== 0) { - document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end); - this.highlight_input([{start: start, end: end}]); + document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end); + this.highlightInput([{start: start, end: end}]); } }; @@ -187,13 +187,13 @@ HighlighterWaiter.prototype.output_mousedown = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_html_mousedown = function(e) { - this.mouse_button_down = true; - this.mouse_target = HighlighterWaiter.OUTPUT; +HighlighterWaiter.prototype.outputHtmlMousedown = function(e) { + this.mouseButtonDown = true; + this.mouseTarget = HighlighterWaiter.OUTPUT; - var sel = this._get_output_html_selection_offsets(); + var sel = this._getOutputHtmlSelectionOffsets(); if (sel.start !== 0 || sel.end !== 0) { - document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end); + document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end); } }; @@ -203,8 +203,8 @@ HighlighterWaiter.prototype.output_html_mousedown = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.input_mouseup = function(e) { - this.mouse_button_down = false; +HighlighterWaiter.prototype.inputMouseup = function(e) { + this.mouseButtonDown = false; }; @@ -213,8 +213,8 @@ HighlighterWaiter.prototype.input_mouseup = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_mouseup = function(e) { - this.mouse_button_down = false; +HighlighterWaiter.prototype.outputMouseup = function(e) { + this.mouseButtonDown = false; }; @@ -223,8 +223,8 @@ HighlighterWaiter.prototype.output_mouseup = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_html_mouseup = function(e) { - this.mouse_button_down = false; +HighlighterWaiter.prototype.outputHtmlMouseup = function(e) { + this.mouseButtonDown = false; }; @@ -234,11 +234,11 @@ HighlighterWaiter.prototype.output_html_mouseup = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.input_mousemove = function(e) { +HighlighterWaiter.prototype.inputMousemove = function(e) { // Check that the left mouse button is pressed - if (!this.mouse_button_down || + if (!this.mouseButtonDown || e.which !== 1 || - this.mouse_target !== HighlighterWaiter.INPUT) + this.mouseTarget !== HighlighterWaiter.INPUT) return; var el = e.target, @@ -246,8 +246,8 @@ HighlighterWaiter.prototype.input_mousemove = function(e) { end = el.selectionEnd; if (start !== 0 || end !== 0) { - document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end); - this.highlight_output([{start: start, end: end}]); + document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end); + this.highlightOutput([{start: start, end: end}]); } }; @@ -258,11 +258,11 @@ HighlighterWaiter.prototype.input_mousemove = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_mousemove = function(e) { +HighlighterWaiter.prototype.outputMousemove = function(e) { // Check that the left mouse button is pressed - if (!this.mouse_button_down || + if (!this.mouseButtonDown || e.which !== 1 || - this.mouse_target !== HighlighterWaiter.OUTPUT) + this.mouseTarget !== HighlighterWaiter.OUTPUT) return; var el = e.target, @@ -270,8 +270,8 @@ HighlighterWaiter.prototype.output_mousemove = function(e) { end = el.selectionEnd; if (start !== 0 || end !== 0) { - document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end); - this.highlight_input([{start: start, end: end}]); + document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end); + this.highlightInput([{start: start, end: end}]); } }; @@ -282,16 +282,16 @@ HighlighterWaiter.prototype.output_mousemove = function(e) { * * @param {event} e */ -HighlighterWaiter.prototype.output_html_mousemove = function(e) { +HighlighterWaiter.prototype.outputHtmlMousemove = function(e) { // Check that the left mouse button is pressed - if (!this.mouse_button_down || + if (!this.mouseButtonDown || e.which !== 1 || - this.mouse_target !== HighlighterWaiter.OUTPUT) + this.mouseTarget !== HighlighterWaiter.OUTPUT) return; - var sel = this._get_output_html_selection_offsets(); + var sel = this._getOutputHtmlSelectionOffsets(); if (sel.start !== 0 || sel.end !== 0) { - document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end); + document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end); } }; @@ -304,21 +304,21 @@ HighlighterWaiter.prototype.output_html_mousemove = function(e) { * @param {number} end - The end offset. * @returns {string} */ -HighlighterWaiter.prototype.selection_info = function(start, end) { +HighlighterWaiter.prototype.selectionInfo = function(start, end) { var width = end.toString().length; width = width < 2 ? 2 : width; - var start_str = Utils.pad(start.toString(), width, " ").replace(/ /g, " "), - end_str = Utils.pad(end.toString(), width, " ").replace(/ /g, " "), - len_str = Utils.pad((end-start).toString(), width, " ").replace(/ /g, " "); + var startStr = Utils.pad(start.toString(), width, " ").replace(/ /g, " "), + endStr = Utils.pad(end.toString(), width, " ").replace(/ /g, " "), + lenStr = Utils.pad((end-start).toString(), width, " ").replace(/ /g, " "); - return "start: " + start_str + "
          end: " + end_str + "
          length: " + len_str; + return "start: " + startStr + "
          end: " + endStr + "
          length: " + lenStr; }; /** * Removes highlighting and selection information. */ -HighlighterWaiter.prototype.remove_highlights = function() { +HighlighterWaiter.prototype.removeHighlights = function() { document.getElementById("input-highlighter").innerHTML = ""; document.getElementById("output-highlighter").innerHTML = ""; document.getElementById("input-selection-info").innerHTML = ""; @@ -335,25 +335,25 @@ HighlighterWaiter.prototype.remove_highlights = function() { * @returns {function} highlights[].b * @returns {Object[]} highlights[].args */ -HighlighterWaiter.prototype.generate_highlight_list = function() { - var recipe_config = this.app.get_recipe_config(), +HighlighterWaiter.prototype.generateHighlightList = function() { + var recipeConfig = this.app.getRecipeConfig(), highlights = []; - for (var i = 0; i < recipe_config.length; i++) { - if (recipe_config[i].disabled) continue; + for (var i = 0; i < recipeConfig.length; i++) { + if (recipeConfig[i].disabled) continue; // If any breakpoints are set, do not attempt to highlight - if (recipe_config[i].breakpoint) return false; + if (recipeConfig[i].breakpoint) return false; - var op = this.app.operations[recipe_config[i].op]; + var op = this.app.operations[recipeConfig[i].op]; // If any of the operations do not support highlighting, fail immediately. if (op.highlight === false || op.highlight === undefined) return false; highlights.push({ f: op.highlight, - b: op.highlight_reverse, - args: recipe_config[i].args + b: op.highlightReverse, + args: recipeConfig[i].args }); } @@ -372,10 +372,10 @@ HighlighterWaiter.prototype.generate_highlight_list = function() { * @param {number} pos.start - The start offset. * @param {number} pos.end - The end offset. */ -HighlighterWaiter.prototype.highlight_output = function(pos) { - var highlights = this.generate_highlight_list(); +HighlighterWaiter.prototype.highlightOutput = function(pos) { + var highlights = this.generateHighlightList(); - if (!highlights || !this.app.auto_bake_) { + if (!highlights || !this.app.autoBake_) { return false; } @@ -388,7 +388,7 @@ HighlighterWaiter.prototype.highlight_output = function(pos) { } } - document.getElementById("output-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end); + document.getElementById("output-selection-info").innerHTML = this.selectionInfo(pos[0].start, pos[0].end); this.highlight( document.getElementById("output-text"), document.getElementById("output-highlighter"), @@ -407,10 +407,10 @@ HighlighterWaiter.prototype.highlight_output = function(pos) { * @param {number} pos.start - The start offset. * @param {number} pos.end - The end offset. */ -HighlighterWaiter.prototype.highlight_input = function(pos) { - var highlights = this.generate_highlight_list(); +HighlighterWaiter.prototype.highlightInput = function(pos) { + var highlights = this.generateHighlightList(); - if (!highlights || !this.app.auto_bake_) { + if (!highlights || !this.app.autoBake_) { return false; } @@ -423,7 +423,7 @@ HighlighterWaiter.prototype.highlight_input = function(pos) { } } - document.getElementById("input-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end); + document.getElementById("input-selection-info").innerHTML = this.selectionInfo(pos[0].start, pos[0].end); this.highlight( document.getElementById("input-text"), document.getElementById("input-highlighter"), @@ -442,17 +442,17 @@ HighlighterWaiter.prototype.highlight_input = function(pos) { * @param {number} pos.end - The end offset. */ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) { - if (!this.app.options.show_highlighter) return false; - if (!this.app.options.attempt_highlight) return false; + if (!this.app.options.showHighlighter) return false; + if (!this.app.options.attemptHighlight) return false; // Check if there is a carriage return in the output dish as this will not // be displayed by the HTML textarea and will mess up highlighting offsets. - if (!this.app.dish_str || this.app.dish_str.indexOf("\r") >= 0) return false; + if (!this.app.dishStr || this.app.dishStr.indexOf("\r") >= 0) return false; - var start_placeholder = "[start_highlight]", - start_placeholder_regex = /\[start_highlight\]/g, - end_placeholder = "[end_highlight]", - end_placeholder_regex = /\[end_highlight\]/g, + var startPlaceholder = "[startHighlight]", + startPlaceholderRegex = /\[startHighlight\]/g, + endPlaceholder = "[endHighlight]", + endPlaceholderRegex = /\[endHighlight\]/g, text = textarea.value; // Put placeholders in position @@ -461,33 +461,33 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) { if (pos.length === 1) { if (pos[0].end < pos[0].start) return; text = text.slice(0, pos[0].start) + - start_placeholder + text.slice(pos[0].start, pos[0].end) + end_placeholder + + startPlaceholder + text.slice(pos[0].start, pos[0].end) + endPlaceholder + text.slice(pos[0].end, text.length); } else { // O(n^2) - Can anyone improve this without overwriting placeholders? var result = "", - end_placed = true; + endPlaced = true; for (var i = 0; i < text.length; i++) { for (var j = 1; j < pos.length; j++) { if (pos[j].end < pos[j].start) continue; if (pos[j].start === i) { - result += start_placeholder; - end_placed = false; + result += startPlaceholder; + endPlaced = false; } if (pos[j].end === i) { - result += end_placeholder; - end_placed = true; + result += endPlaceholder; + endPlaced = true; } } result += text[i]; } - if (!end_placed) result += end_placeholder; + if (!endPlaced) result += endPlaceholder; text = result; } - var css_class = "hl1"; - //if (colour) css_class += "-"+colour; + var cssClass = "hl1"; + //if (colour) cssClass += "-"+colour; // Remove HTML tags text = text.replace(/&/g, "&") @@ -495,8 +495,8 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) { .replace(/>/g, ">") .replace(/\n/g, " ") // Convert placeholders to tags - .replace(start_placeholder_regex, "") - .replace(end_placeholder_regex, "") + " "; + .replace(startPlaceholderRegex, "") + .replace(endPlaceholderRegex, "") + " "; // Adjust width to allow for scrollbars highlighter.style.width = textarea.clientWidth + "px"; diff --git a/src/js/views/html/InputWaiter.js b/src/js/views/html/InputWaiter.js index 73cfe792..6ffc498f 100755 --- a/src/js/views/html/InputWaiter.js +++ b/src/js/views/html/InputWaiter.js @@ -14,7 +14,7 @@ var InputWaiter = function(app, manager) { this.manager = manager; // Define keys that don't change the input so we don't have to autobake when they are pressed - this.bad_keys = [ + this.badKeys = [ 16, //Shift 17, //Ctrl 18, //Alt @@ -62,14 +62,14 @@ InputWaiter.prototype.set = function(input) { * @param {number} length - The length of the current input string * @param {number} lines - The number of the lines in the current input string */ -InputWaiter.prototype.set_input_info = function(length, lines) { +InputWaiter.prototype.setInputInfo = function(length, lines) { var width = length.toString().length; width = width < 2 ? 2 : width; - var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, " "); - var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, " "); + var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, " "); + var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, " "); - document.getElementById("input-info").innerHTML = "length: " + length_str + "
          lines: " + lines_str; + document.getElementById("input-info").innerHTML = "length: " + lengthStr + "
          lines: " + linesStr; }; @@ -81,21 +81,21 @@ InputWaiter.prototype.set_input_info = function(length, lines) { * * @fires Manager#statechange */ -InputWaiter.prototype.input_change = function(e) { +InputWaiter.prototype.inputChange = function(e) { // Remove highlighting from input and output panes as the offsets might be different now - this.manager.highlighter.remove_highlights(); + this.manager.highlighter.removeHighlights(); // Reset recipe progress as any previous processing will be redundant now this.app.progress = 0; // Update the input metadata info - var input_text = this.get(), - lines = input_text.count("\n") + 1; + var inputText = this.get(), + lines = inputText.count("\n") + 1; - this.set_input_info(input_text.length, lines); + this.setInputInfo(inputText.length, lines); - if (this.bad_keys.indexOf(e.keyCode) < 0) { + if (this.badKeys.indexOf(e.keyCode) < 0) { // Fire the statechange event as the input has been modified window.dispatchEvent(this.manager.statechange); } @@ -108,7 +108,7 @@ InputWaiter.prototype.input_change = function(e) { * * @param {event} e */ -InputWaiter.prototype.input_dragover = function(e) { +InputWaiter.prototype.inputDragover = function(e) { // This will be set if we're dragging an operation if (e.dataTransfer.effectAllowed === "move") return false; @@ -125,7 +125,7 @@ InputWaiter.prototype.input_dragover = function(e) { * * @param {event} e */ -InputWaiter.prototype.input_dragleave = function(e) { +InputWaiter.prototype.inputDragleave = function(e) { e.stopPropagation(); e.preventDefault(); e.target.classList.remove("dropping-file"); @@ -138,7 +138,7 @@ InputWaiter.prototype.input_dragleave = function(e) { * * @param {event} e */ -InputWaiter.prototype.input_drop = function(e) { +InputWaiter.prototype.inputDrop = function(e) { // This will be set if we're dragging an operation if (e.dataTransfer.effectAllowed === "move") return false; @@ -150,29 +150,29 @@ InputWaiter.prototype.input_drop = function(e) { file = e.dataTransfer.files[0], text = e.dataTransfer.getData("Text"), reader = new FileReader(), - input_charcode = "", + inputCharcode = "", offset = 0, CHUNK_SIZE = 20480; // 20KB - var set_input = function() { - if (input_charcode.length > 100000 && this.app.auto_bake_) { - this.manager.controls.set_auto_bake(false); + var setInput = function() { + if (inputCharcode.length > 100000 && this.app.autoBake_) { + this.manager.controls.setAutoBake(false); this.app.alert("Turned off Auto Bake as the input is large", "warning", 5000); } - this.set(input_charcode); - var recipe_config = this.app.get_recipe_config(); - if (!recipe_config[0] || recipe_config[0].op !== "From Hex") { - recipe_config.unshift({op:"From Hex", args:["Space"]}); - this.app.set_recipe_config(recipe_config); + this.set(inputCharcode); + var recipeConfig = this.app.getRecipeConfig(); + if (!recipeConfig[0] || recipeConfig[0].op !== "From Hex") { + recipeConfig.unshift({op:"From Hex", args:["Space"]}); + this.app.setRecipeConfig(recipeConfig); } - el.classList.remove("loading_file"); + el.classList.remove("loadingFile"); }.bind(this); var seek = function() { if (offset >= file.size) { - set_input(); + setInput(); return; } el.value = "Processing... " + Math.round(offset / file.size * 100) + "%"; @@ -182,7 +182,7 @@ InputWaiter.prototype.input_drop = function(e) { reader.onload = function(e) { var data = new Uint8Array(reader.result); - input_charcode += Utils.to_hex_fast(data); + inputCharcode += Utils.toHexFast(data); offset += CHUNK_SIZE; seek(); }; @@ -191,7 +191,7 @@ InputWaiter.prototype.input_drop = function(e) { el.classList.remove("dropping-file"); if (file) { - el.classList.add("loading_file"); + el.classList.add("loadingFile"); seek(); } else if (text) { this.set(text); @@ -205,8 +205,8 @@ InputWaiter.prototype.input_drop = function(e) { * * @fires Manager#statechange */ -InputWaiter.prototype.clear_io_click = function() { - this.manager.highlighter.remove_highlights(); +InputWaiter.prototype.clearIoClick = function() { + this.manager.highlighter.removeHighlights(); document.getElementById("input-text").value = ""; document.getElementById("output-text").value = ""; document.getElementById("input-info").innerHTML = ""; diff --git a/src/js/views/html/Manager.js b/src/js/views/html/Manager.js index 4e8cd0e9..90a9b4cc 100755 --- a/src/js/views/html/Manager.js +++ b/src/js/views/html/Manager.js @@ -45,9 +45,9 @@ var Manager = function(app) { this.seasonal = new SeasonalWaiter(this.app, this); // Object to store dynamic handlers to fire on elements that may not exist yet - this.dynamic_handlers = {}; + this.dynamicHandlers = {}; - this.initialise_event_listeners(); + this.initialiseEventListeners(); }; @@ -55,8 +55,8 @@ var Manager = function(app) { * Sets up the various components and listeners. */ Manager.prototype.setup = function() { - this.recipe.initialise_operation_drag_n_drop(); - this.controls.auto_bake_change(); + this.recipe.initialiseOperationDragNDrop(); + this.controls.autoBakeChange(); this.seasonal.load(); }; @@ -64,86 +64,87 @@ Manager.prototype.setup = function() { /** * Main function to handle the creation of the event listeners. */ -Manager.prototype.initialise_event_listeners = function() { +Manager.prototype.initialiseEventListeners = function() { // Global - window.addEventListener("resize", this.window.window_resize.bind(this.window)); - window.addEventListener("blur", this.window.window_blur.bind(this.window)); - window.addEventListener("focus", this.window.window_focus.bind(this.window)); - window.addEventListener("statechange", this.app.state_change.bind(this.app)); - window.addEventListener("popstate", this.app.pop_state.bind(this.app)); + window.addEventListener("resize", this.window.windowResize.bind(this.window)); + window.addEventListener("blur", this.window.windowBlur.bind(this.window)); + window.addEventListener("focus", this.window.windowFocus.bind(this.window)); + window.addEventListener("statechange", this.app.stateChange.bind(this.app)); + window.addEventListener("popstate", this.app.popState.bind(this.app)); // Controls - document.getElementById("bake").addEventListener("click", this.controls.bake_click.bind(this.controls)); - document.getElementById("auto-bake").addEventListener("change", this.controls.auto_bake_change.bind(this.controls)); - document.getElementById("step").addEventListener("click", this.controls.step_click.bind(this.controls)); - document.getElementById("clr-recipe").addEventListener("click", this.controls.clear_recipe_click.bind(this.controls)); - document.getElementById("clr-breaks").addEventListener("click", this.controls.clear_breaks_click.bind(this.controls)); - document.getElementById("save").addEventListener("click", this.controls.save_click.bind(this.controls)); - document.getElementById("save-button").addEventListener("click", this.controls.save_button_click.bind(this.controls)); - document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slr_check_change.bind(this.controls)); - document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sli_check_change.bind(this.controls)); - document.getElementById("load").addEventListener("click", this.controls.load_click.bind(this.controls)); - document.getElementById("load-delete-button").addEventListener("click", this.controls.load_delete_click.bind(this.controls)); - document.getElementById("load-name").addEventListener("change", this.controls.load_name_change.bind(this.controls)); - document.getElementById("load-button").addEventListener("click", this.controls.load_button_click.bind(this.controls)); - this.add_multi_event_listener("#save-text", "keyup paste", this.controls.save_text_change, this.controls); + document.getElementById("bake").addEventListener("click", this.controls.bakeClick.bind(this.controls)); + document.getElementById("auto-bake").addEventListener("change", this.controls.autoBakeChange.bind(this.controls)); + document.getElementById("step").addEventListener("click", this.controls.stepClick.bind(this.controls)); + document.getElementById("clr-recipe").addEventListener("click", this.controls.clearRecipeClick.bind(this.controls)); + document.getElementById("clr-breaks").addEventListener("click", this.controls.clearBreaksClick.bind(this.controls)); + document.getElementById("save").addEventListener("click", this.controls.saveClick.bind(this.controls)); + document.getElementById("save-button").addEventListener("click", this.controls.saveButtonClick.bind(this.controls)); + document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slrCheckChange.bind(this.controls)); + document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sliCheckChange.bind(this.controls)); + document.getElementById("load").addEventListener("click", this.controls.loadClick.bind(this.controls)); + document.getElementById("load-delete-button").addEventListener("click", this.controls.loadDeleteClick.bind(this.controls)); + document.getElementById("load-name").addEventListener("change", this.controls.loadNameChange.bind(this.controls)); + document.getElementById("load-button").addEventListener("click", this.controls.loadButtonClick.bind(this.controls)); + this.addMultiEventListener("#save-text", "keyup paste", this.controls.saveTextChange, this.controls); // Operations - this.add_multi_event_listener("#search", "keyup paste search", this.ops.search_operations, this.ops); - this.add_dynamic_listener(".op_list li.operation", "dblclick", this.ops.operation_dblclick, this.ops); - document.getElementById("edit-favourites").addEventListener("click", this.ops.edit_favourites_click.bind(this.ops)); - document.getElementById("save-favourites").addEventListener("click", this.ops.save_favourites_click.bind(this.ops)); - document.getElementById("reset-favourites").addEventListener("click", this.ops.reset_favourites_click.bind(this.ops)); - this.add_dynamic_listener(".op_list .op-icon", "mouseover", this.ops.op_icon_mouseover, this.ops); - this.add_dynamic_listener(".op_list .op-icon", "mouseleave", this.ops.op_icon_mouseleave, this.ops); - this.add_dynamic_listener(".op_list", "oplistcreate", this.ops.op_list_create, this.ops); - this.add_dynamic_listener("li.operation", "operationadd", this.recipe.op_add.bind(this.recipe)); + this.addMultiEventListener("#search", "keyup paste search", this.ops.searchOperations, this.ops); + this.addDynamicListener(".op-list li.operation", "dblclick", this.ops.operationDblclick, this.ops); + document.getElementById("edit-favourites").addEventListener("click", this.ops.editFavouritesClick.bind(this.ops)); + document.getElementById("save-favourites").addEventListener("click", this.ops.saveFavouritesClick.bind(this.ops)); + document.getElementById("reset-favourites").addEventListener("click", this.ops.resetFavouritesClick.bind(this.ops)); + this.addDynamicListener(".op-list .op-icon", "mouseover", this.ops.opIconMouseover, this.ops); + this.addDynamicListener(".op-list .op-icon", "mouseleave", this.ops.opIconMouseleave, this.ops); + this.addDynamicListener(".op-list", "oplistcreate", this.ops.opListCreate, this.ops); + this.addDynamicListener("li.operation", "operationadd", this.recipe.opAdd.bind(this.recipe)); // Recipe - this.add_dynamic_listener(".arg", "keyup", this.recipe.ing_change, this.recipe); - this.add_dynamic_listener(".arg", "change", this.recipe.ing_change, this.recipe); - this.add_dynamic_listener(".disable-icon", "click", this.recipe.disable_click, this.recipe); - this.add_dynamic_listener(".breakpoint", "click", this.recipe.breakpoint_click, this.recipe); - this.add_dynamic_listener("#rec_list li.operation", "dblclick", this.recipe.operation_dblclick, this.recipe); - this.add_dynamic_listener("#rec_list li.operation > div", "dblclick", this.recipe.operation_child_dblclick, this.recipe); - this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a", "click", this.recipe.dropdown_toggle_click, this.recipe); - this.add_dynamic_listener("#rec_list", "operationremove", this.recipe.op_remove.bind(this.recipe)); + this.addDynamicListener(".arg", "keyup", this.recipe.ingChange, this.recipe); + this.addDynamicListener(".arg", "change", this.recipe.ingChange, this.recipe); + this.addDynamicListener(".disable-icon", "click", this.recipe.disableClick, this.recipe); + this.addDynamicListener(".breakpoint", "click", this.recipe.breakpointClick, this.recipe); + this.addDynamicListener("#rec-list li.operation", "dblclick", this.recipe.operationDblclick, this.recipe); + this.addDynamicListener("#rec-list li.operation > div", "dblclick", this.recipe.operationChildDblclick, this.recipe); + this.addDynamicListener("#rec-list .input-group .dropdown-menu a", "click", this.recipe.dropdownToggleClick, this.recipe); + this.addDynamicListener("#rec-list", "operationremove", this.recipe.opRemove.bind(this.recipe)); // Input - this.add_multi_event_listener("#input-text", "keyup paste", this.input.input_change, this.input); - document.getElementById("reset-layout").addEventListener("click", this.app.reset_layout.bind(this.app)); - document.getElementById("clr-io").addEventListener("click", this.input.clear_io_click.bind(this.input)); - document.getElementById("input-text").addEventListener("dragover", this.input.input_dragover.bind(this.input)); - document.getElementById("input-text").addEventListener("dragleave", this.input.input_dragleave.bind(this.input)); - document.getElementById("input-text").addEventListener("drop", this.input.input_drop.bind(this.input)); - document.getElementById("input-text").addEventListener("scroll", this.highlighter.input_scroll.bind(this.highlighter)); - document.getElementById("input-text").addEventListener("mouseup", this.highlighter.input_mouseup.bind(this.highlighter)); - document.getElementById("input-text").addEventListener("mousemove", this.highlighter.input_mousemove.bind(this.highlighter)); - this.add_multi_event_listener("#input-text", "mousedown dblclick select", this.highlighter.input_mousedown, this.highlighter); + this.addMultiEventListener("#input-text", "keyup paste", this.input.inputChange, this.input); + document.getElementById("reset-layout").addEventListener("click", this.app.resetLayout.bind(this.app)); + document.getElementById("clr-io").addEventListener("click", this.input.clearIoClick.bind(this.input)); + document.getElementById("input-text").addEventListener("dragover", this.input.inputDragover.bind(this.input)); + document.getElementById("input-text").addEventListener("dragleave", this.input.inputDragleave.bind(this.input)); + document.getElementById("input-text").addEventListener("drop", this.input.inputDrop.bind(this.input)); + document.getElementById("input-text").addEventListener("scroll", this.highlighter.inputScroll.bind(this.highlighter)); + document.getElementById("input-text").addEventListener("mouseup", this.highlighter.inputMouseup.bind(this.highlighter)); + document.getElementById("input-text").addEventListener("mousemove", this.highlighter.inputMousemove.bind(this.highlighter)); + this.addMultiEventListener("#input-text", "mousedown dblclick select", this.highlighter.inputMousedown, this.highlighter); // Output - document.getElementById("save-to-file").addEventListener("click", this.output.save_click.bind(this.output)); - document.getElementById("switch").addEventListener("click", this.output.switch_click.bind(this.output)); - document.getElementById("undo-switch").addEventListener("click", this.output.undo_switch_click.bind(this.output)); - document.getElementById("output-text").addEventListener("scroll", this.highlighter.output_scroll.bind(this.highlighter)); - document.getElementById("output-text").addEventListener("mouseup", this.highlighter.output_mouseup.bind(this.highlighter)); - document.getElementById("output-text").addEventListener("mousemove", this.highlighter.output_mousemove.bind(this.highlighter)); - document.getElementById("output-html").addEventListener("mouseup", this.highlighter.output_html_mouseup.bind(this.highlighter)); - document.getElementById("output-html").addEventListener("mousemove", this.highlighter.output_html_mousemove.bind(this.highlighter)); - this.add_multi_event_listener("#output-text", "mousedown dblclick select", this.highlighter.output_mousedown, this.highlighter); - this.add_multi_event_listener("#output-html", "mousedown dblclick select", this.highlighter.output_html_mousedown, this.highlighter); + document.getElementById("save-to-file").addEventListener("click", this.output.saveClick.bind(this.output)); + document.getElementById("switch").addEventListener("click", this.output.switchClick.bind(this.output)); + document.getElementById("undo-switch").addEventListener("click", this.output.undoSwitchClick.bind(this.output)); + document.getElementById("maximise-output").addEventListener("click", this.output.maximiseOutputClick.bind(this.output)); + document.getElementById("output-text").addEventListener("scroll", this.highlighter.outputScroll.bind(this.highlighter)); + document.getElementById("output-text").addEventListener("mouseup", this.highlighter.outputMouseup.bind(this.highlighter)); + document.getElementById("output-text").addEventListener("mousemove", this.highlighter.outputMousemove.bind(this.highlighter)); + document.getElementById("output-html").addEventListener("mouseup", this.highlighter.outputHtmlMouseup.bind(this.highlighter)); + document.getElementById("output-html").addEventListener("mousemove", this.highlighter.outputHtmlMousemove.bind(this.highlighter)); + this.addMultiEventListener("#output-text", "mousedown dblclick select", this.highlighter.outputMousedown, this.highlighter); + this.addMultiEventListener("#output-html", "mousedown dblclick select", this.highlighter.outputHtmlMousedown, this.highlighter); // Options - document.getElementById("options").addEventListener("click", this.options.options_click.bind(this.options)); - document.getElementById("reset-options").addEventListener("click", this.options.reset_options_click.bind(this.options)); - $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.switch_change.bind(this.options)); - $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.set_word_wrap.bind(this.options)); - this.add_dynamic_listener(".option-item input[type=number]", "keyup", this.options.number_change, this.options); - this.add_dynamic_listener(".option-item input[type=number]", "change", this.options.number_change, this.options); - this.add_dynamic_listener(".option-item select", "change", this.options.select_change, this.options); + document.getElementById("options").addEventListener("click", this.options.optionsClick.bind(this.options)); + document.getElementById("reset-options").addEventListener("click", this.options.resetOptionsClick.bind(this.options)); + $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.switchChange.bind(this.options)); + $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.setWordWrap.bind(this.options)); + this.addDynamicListener(".option-item input[type=number]", "keyup", this.options.numberChange, this.options); + this.addDynamicListener(".option-item input[type=number]", "change", this.options.numberChange, this.options); + this.addDynamicListener(".option-item select", "change", this.options.selectChange, this.options); // Misc - document.getElementById("alert-close").addEventListener("click", this.app.alert_close_click.bind(this.app)); + document.getElementById("alert-close").addEventListener("click", this.app.alertCloseClick.bind(this.app)); }; @@ -151,19 +152,19 @@ Manager.prototype.initialise_event_listeners = function() { * Adds an event listener to each element in the specified group. * * @param {string} selector - A selector string for the element group to add the event to, see - * this.get_all() - * @param {string} event_type - The event to listen for + * this.getAll() + * @param {string} eventType - The event to listen for * @param {function} callback - The function to execute when the event is triggered * @param {Object} [scope=this] - The object to bind to the callback function * * @example * // Calls the clickable function whenever any element with the .clickable class is clicked - * this.add_listeners(".clickable", "click", this.clickable, this); + * this.addListeners(".clickable", "click", this.clickable, this); */ -Manager.prototype.add_listeners = function(selector, event_type, callback, scope) { +Manager.prototype.addListeners = function(selector, eventType, callback, scope) { scope = scope || this; [].forEach.call(document.querySelectorAll(selector), function(el) { - el.addEventListener(event_type, callback.bind(scope)); + el.addEventListener(eventType, callback.bind(scope)); }); }; @@ -172,17 +173,17 @@ Manager.prototype.add_listeners = function(selector, event_type, callback, scope * Adds multiple event listeners to the specified element. * * @param {string} selector - A selector string for the element to add the events to - * @param {string} event_types - A space-separated string of all the event types to listen for + * @param {string} eventTypes - A space-separated string of all the event types to listen for * @param {function} callback - The function to execute when the events are triggered * @param {Object} [scope=this] - The object to bind to the callback function * * @example * // Calls the search function whenever the the keyup, paste or search events are triggered on the * // search element - * this.add_multi_event_listener("search", "keyup paste search", this.search, this); + * this.addMultiEventListener("search", "keyup paste search", this.search, this); */ -Manager.prototype.add_multi_event_listener = function(selector, event_types, callback, scope) { - var evs = event_types.split(" "); +Manager.prototype.addMultiEventListener = function(selector, eventTypes, callback, scope) { + var evs = eventTypes.split(" "); for (var i = 0; i < evs.length; i++) { document.querySelector(selector).addEventListener(evs[i], callback.bind(scope)); } @@ -193,19 +194,19 @@ Manager.prototype.add_multi_event_listener = function(selector, event_types, cal * Adds multiple event listeners to each element in the specified group. * * @param {string} selector - A selector string for the element group to add the events to - * @param {string} event_types - A space-separated string of all the event types to listen for + * @param {string} eventTypes - A space-separated string of all the event types to listen for * @param {function} callback - The function to execute when the events are triggered * @param {Object} [scope=this] - The object to bind to the callback function * * @example * // Calls the save function whenever the the keyup or paste events are triggered on any element * // with the .saveable class - * this.add_multi_event_listener(".saveable", "keyup paste", this.save, this); + * this.addMultiEventListener(".saveable", "keyup paste", this.save, this); */ -Manager.prototype.add_multi_event_listeners = function(selector, event_types, callback, scope) { - var evs = event_types.split(" "); +Manager.prototype.addMultiEventListeners = function(selector, eventTypes, callback, scope) { + var evs = eventTypes.split(" "); for (var i = 0; i < evs.length; i++) { - this.add_listeners(selector, evs[i], callback, scope); + this.addListeners(selector, evs[i], callback, scope); } }; @@ -215,28 +216,28 @@ Manager.prototype.add_multi_event_listeners = function(selector, event_types, ca * may not exist in the DOM yet. * * @param {string} selector - A selector string for the element(s) to add the event to - * @param {string} event_type - The event(s) to listen for + * @param {string} eventType - The event(s) to listen for * @param {function} callback - The function to execute when the event(s) is/are triggered * @param {Object} [scope=this] - The object to bind to the callback function * * @example * // Pops up an alert whenever any button is clicked, even if it is added to the DOM after this * // listener is created - * this.add_dynamic_listener("button", "click", alert, this); + * this.addDynamicListener("button", "click", alert, this); */ -Manager.prototype.add_dynamic_listener = function(selector, event_type, callback, scope) { - var event_config = { +Manager.prototype.addDynamicListener = function(selector, eventType, callback, scope) { + var eventConfig = { selector: selector, callback: callback.bind(scope || this) }; - if (this.dynamic_handlers.hasOwnProperty(event_type)) { + if (this.dynamicHandlers.hasOwnProperty(eventType)) { // Listener already exists, add new handler to the appropriate list - this.dynamic_handlers[event_type].push(event_config); + this.dynamicHandlers[eventType].push(eventConfig); } else { - this.dynamic_handlers[event_type] = [event_config]; + this.dynamicHandlers[eventType] = [eventConfig]; // Set up listener for this new type - document.addEventListener(event_type, this.dynamic_listener_handler.bind(this)); + document.addEventListener(eventType, this.dynamicListenerHandler.bind(this)); } }; @@ -247,8 +248,8 @@ Manager.prototype.add_dynamic_listener = function(selector, event_type, callback * * @param {Event} e - The event to be handled */ -Manager.prototype.dynamic_listener_handler = function(e) { - var handlers = this.dynamic_handlers[e.type], +Manager.prototype.dynamicListenerHandler = function(e) { + var handlers = this.dynamicHandlers[e.type], matches = e.target.matches || e.target.webkitMatchesSelector || e.target.mozMatchesSelector || diff --git a/src/js/views/html/OperationsWaiter.js b/src/js/views/html/OperationsWaiter.js index 11d7aa7f..3b9b4e2d 100755 --- a/src/js/views/html/OperationsWaiter.js +++ b/src/js/views/html/OperationsWaiter.js @@ -16,7 +16,7 @@ var OperationsWaiter = function(app, manager) { this.manager = manager; this.options = {}; - this.remove_intent = false; + this.removeIntent = false; }; @@ -26,17 +26,17 @@ var OperationsWaiter = function(app, manager) { * * @param {event} e */ -OperationsWaiter.prototype.search_operations = function(e) { +OperationsWaiter.prototype.searchOperations = function(e) { var ops, selected; if (e.type === "search") { // Search e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { - selected = this.get_selected_op(ops); + selected = this.getSelectedOp(ops); if (selected > -1) { - this.manager.recipe.add_operation(ops[selected].innerHTML); - this.app.auto_bake(); + this.manager.recipe.addOperation(ops[selected].innerHTML); + this.app.autoBake(); } } } @@ -47,7 +47,7 @@ OperationsWaiter.prototype.search_operations = function(e) { e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { - selected = this.get_selected_op(ops); + selected = this.getSelectedOp(ops); if (selected > -1) { ops[selected].classList.remove("selected-op"); } @@ -58,7 +58,7 @@ OperationsWaiter.prototype.search_operations = function(e) { e.preventDefault(); ops = document.querySelectorAll("#search-results li"); if (ops.length) { - selected = this.get_selected_op(ops); + selected = this.getSelectedOp(ops); if (selected > -1) { ops[selected].classList.remove("selected-op"); } @@ -66,26 +66,26 @@ OperationsWaiter.prototype.search_operations = function(e) { ops[selected-1].classList.add("selected-op"); } } else { - var search_results_el = document.getElementById("search-results"), + var searchResultsEl = document.getElementById("search-results"), el = e.target, str = el.value; - while (search_results_el.firstChild) { - $(search_results_el.firstChild).popover("destroy"); - search_results_el.removeChild(search_results_el.firstChild); + while (searchResultsEl.firstChild) { + $(searchResultsEl.firstChild).popover("destroy"); + searchResultsEl.removeChild(searchResultsEl.firstChild); } $("#categories .in").collapse("hide"); if (str) { - var matched_ops = this.filter_operations(str, true), - matched_ops_html = ""; + var matchedOps = this.filterOperations(str, true), + matchedOpsHtml = ""; - for (var i = 0; i < matched_ops.length; i++) { - matched_ops_html += matched_ops[i].to_stub_html(); + for (var i = 0; i < matchedOps.length; i++) { + matchedOpsHtml += matchedOps[i].toStubHtml(); } - search_results_el.innerHTML = matched_ops_html; - search_results_el.dispatchEvent(this.manager.oplistcreate); + searchResultsEl.innerHTML = matchedOpsHtml; + searchResultsEl.dispatchEvent(this.manager.oplistcreate); } } }; @@ -94,37 +94,37 @@ OperationsWaiter.prototype.search_operations = function(e) { /** * Filters operations based on the search string and returns the matching ones. * - * @param {string} search_str + * @param {string} searchStr * @param {boolean} highlight - Whether or not to highlight the matching string in the operation * name and description * @returns {string[]} */ -OperationsWaiter.prototype.filter_operations = function(search_str, highlight) { - var matched_ops = [], - matched_descs = []; +OperationsWaiter.prototype.filterOperations = function(searchStr, highlight) { + var matchedOps = [], + matchedDescs = []; - search_str = search_str.toLowerCase(); + searchStr = searchStr.toLowerCase(); - for (var op_name in this.app.operations) { - var op = this.app.operations[op_name], - name_pos = op_name.toLowerCase().indexOf(search_str), - desc_pos = op.description.toLowerCase().indexOf(search_str); + for (var opName in this.app.operations) { + var op = this.app.operations[opName], + namePos = opName.toLowerCase().indexOf(searchStr), + descPos = op.description.toLowerCase().indexOf(searchStr); - if (name_pos >= 0 || desc_pos >= 0) { - var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); + if (namePos >= 0 || descPos >= 0) { + var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); if (highlight) { - operation.highlight_search_string(search_str, name_pos, desc_pos); + operation.highlightSearchString(searchStr, namePos, descPos); } - if (name_pos < 0) { - matched_ops.push(operation); + if (namePos < 0) { + matchedOps.push(operation); } else { - matched_descs.push(operation); + matchedDescs.push(operation); } } } - return matched_descs.concat(matched_ops); + return matchedDescs.concat(matchedOps); }; @@ -135,7 +135,7 @@ OperationsWaiter.prototype.filter_operations = function(search_str, highlight) { * @param {element[]} ops * @returns {number} */ -OperationsWaiter.prototype.get_selected_op = function(ops) { +OperationsWaiter.prototype.getSelectedOp = function(ops) { for (var i = 0; i < ops.length; i++) { if (ops[i].classList.contains("selected-op")) { return i; @@ -151,8 +151,8 @@ OperationsWaiter.prototype.get_selected_op = function(ops) { * @listens Manager#oplistcreate * @param {event} e */ -OperationsWaiter.prototype.op_list_create = function(e) { - this.manager.recipe.create_sortable_seed_list(e.target); +OperationsWaiter.prototype.opListCreate = function(e) { + this.manager.recipe.createSortableSeedList(e.target); $("[data-toggle=popover]").popover(); }; @@ -163,11 +163,11 @@ OperationsWaiter.prototype.op_list_create = function(e) { * * @param {event} e */ -OperationsWaiter.prototype.operation_dblclick = function(e) { +OperationsWaiter.prototype.operationDblclick = function(e) { var li = e.target; - this.manager.recipe.add_operation(li.textContent); - this.app.auto_bake(); + this.manager.recipe.addOperation(li.textContent); + this.app.autoBake(); }; @@ -177,46 +177,46 @@ OperationsWaiter.prototype.operation_dblclick = function(e) { * * @param {event} e */ -OperationsWaiter.prototype.edit_favourites_click = function(e) { +OperationsWaiter.prototype.editFavouritesClick = function(e) { e.preventDefault(); e.stopPropagation(); // Add favourites to modal - var fav_cat = this.app.categories.filter(function(c) { + var favCat = this.app.categories.filter(function(c) { return c.name === "Favourites"; })[0]; var html = ""; - for (var i = 0; i < fav_cat.ops.length; i++) { - var op_name = fav_cat.ops[i]; - var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); - html += operation.to_stub_html(true); + for (var i = 0; i < favCat.ops.length; i++) { + var opName = favCat.ops[i]; + var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); + html += operation.toStubHtml(true); } - var edit_favourites_list = document.getElementById("edit-favourites-list"); - edit_favourites_list.innerHTML = html; - this.remove_intent = false; + var editFavouritesList = document.getElementById("edit-favourites-list"); + editFavouritesList.innerHTML = html; + this.removeIntent = false; - var editable_list = Sortable.create(edit_favourites_list, { + var editableList = Sortable.create(editFavouritesList, { filter: ".remove-icon", onFilter: function (evt) { - var el = editable_list.closest(evt.item); + var el = editableList.closest(evt.item); if (el) { $(el).popover("destroy"); el.parentNode.removeChild(el); } }, onEnd: function(evt) { - if (this.remove_intent) evt.item.remove(); + if (this.removeIntent) evt.item.remove(); }.bind(this), }); - Sortable.utils.on(edit_favourites_list, "dragleave", function() { - this.remove_intent = true; + Sortable.utils.on(editFavouritesList, "dragleave", function() { + this.removeIntent = true; }.bind(this)); - Sortable.utils.on(edit_favourites_list, "dragover", function() { - this.remove_intent = false; + Sortable.utils.on(editFavouritesList, "dragover", function() { + this.removeIntent = false; }.bind(this)); $("#edit-favourites-list [data-toggle=popover]").popover(); @@ -228,18 +228,18 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) { * Handler for save favourites click events. * Saves the selected favourites and reloads them. */ -OperationsWaiter.prototype.save_favourites_click = function() { - var favourites_list = [], +OperationsWaiter.prototype.saveFavouritesClick = function() { + var favouritesList = [], favs = document.querySelectorAll("#edit-favourites-list li"); for (var i = 0; i < favs.length; i++) { - favourites_list.push(favs[i].textContent); + favouritesList.push(favs[i].textContent); } - this.app.save_favourites(favourites_list); - this.app.load_favourites(); - this.app.populate_operations_list(); - this.manager.recipe.initialise_operation_drag_n_drop(); + this.app.saveFavourites(favouritesList); + this.app.loadFavourites(); + this.app.populateOperationsList(); + this.manager.recipe.initialiseOperationDragNDrop(); }; @@ -247,37 +247,37 @@ OperationsWaiter.prototype.save_favourites_click = function() { * Handler for reset favourites click events. * Resets favourites to their defaults. */ -OperationsWaiter.prototype.reset_favourites_click = function() { - this.app.reset_favourites(); +OperationsWaiter.prototype.resetFavouritesClick = function() { + this.app.resetFavourites(); }; /** - * Handler for op_icon mouseover events. + * Handler for opIcon mouseover events. * Hides any popovers already showing on the operation so that there aren't two at once. * * @param {event} e */ -OperationsWaiter.prototype.op_icon_mouseover = function(e) { - var op_el = e.target.parentNode; +OperationsWaiter.prototype.opIconMouseover = function(e) { + var opEl = e.target.parentNode; if (e.target.getAttribute("data-toggle") === "popover") { - $(op_el).popover("hide"); + $(opEl).popover("hide"); } }; /** - * Handler for op_icon mouseleave events. + * Handler for opIcon mouseleave events. * If this icon created a popover and we're moving back to the operation element, display the * operation popover again. * * @param {event} e */ -OperationsWaiter.prototype.op_icon_mouseleave = function(e) { - var op_el = e.target.parentNode, - to_el = e.toElement || e.relatedElement; +OperationsWaiter.prototype.opIconMouseleave = function(e) { + var opEl = e.target.parentNode, + toEl = e.toElement || e.relatedElement; - if (e.target.getAttribute("data-toggle") === "popover" && to_el === op_el) { - $(op_el).popover("show"); + if (e.target.getAttribute("data-toggle") === "popover" && toEl === opEl) { + $(opEl).popover("show"); } }; diff --git a/src/js/views/html/OptionsWaiter.js b/src/js/views/html/OptionsWaiter.js index 05d80185..3650fce5 100755 --- a/src/js/views/html/OptionsWaiter.js +++ b/src/js/views/html/OptionsWaiter.js @@ -52,7 +52,7 @@ OptionsWaiter.prototype.load = function(options) { * Handler for options click events. * Dispays the options pane. */ -OptionsWaiter.prototype.options_click = function() { +OptionsWaiter.prototype.optionsClick = function() { $("#options-modal").modal(); }; @@ -61,7 +61,7 @@ OptionsWaiter.prototype.options_click = function() { * Handler for reset options click events. * Resets options back to their default values. */ -OptionsWaiter.prototype.reset_options_click = function() { +OptionsWaiter.prototype.resetOptionsClick = function() { this.load(this.app.doptions); }; @@ -73,7 +73,7 @@ OptionsWaiter.prototype.reset_options_click = function() { * @param {event} e * @param {boolean} state */ -OptionsWaiter.prototype.switch_change = function(e, state) { +OptionsWaiter.prototype.switchChange = function(e, state) { var el = e.target, option = el.getAttribute("option"); @@ -88,7 +88,7 @@ OptionsWaiter.prototype.switch_change = function(e, state) { * * @param {event} e */ -OptionsWaiter.prototype.number_change = function(e) { +OptionsWaiter.prototype.numberChange = function(e) { var el = e.target, option = el.getAttribute("option"); @@ -103,7 +103,7 @@ OptionsWaiter.prototype.number_change = function(e) { * * @param {event} e */ -OptionsWaiter.prototype.select_change = function(e) { +OptionsWaiter.prototype.selectChange = function(e) { var el = e.target, option = el.getAttribute("option"); @@ -113,16 +113,16 @@ OptionsWaiter.prototype.select_change = function(e) { /** - * Sets or unsets word wrap on the input and output depending on the word_wrap option value. + * Sets or unsets word wrap on the input and output depending on the wordWrap option value. */ -OptionsWaiter.prototype.set_word_wrap = function() { +OptionsWaiter.prototype.setWordWrap = function() { document.getElementById("input-text").classList.remove("word-wrap"); document.getElementById("output-text").classList.remove("word-wrap"); document.getElementById("output-html").classList.remove("word-wrap"); document.getElementById("input-highlighter").classList.remove("word-wrap"); document.getElementById("output-highlighter").classList.remove("word-wrap"); - if (!this.app.options.word_wrap) { + if (!this.app.options.wordWrap) { document.getElementById("input-text").classList.add("word-wrap"); document.getElementById("output-text").classList.add("word-wrap"); document.getElementById("output-html").classList.add("word-wrap"); diff --git a/src/js/views/html/OutputWaiter.js b/src/js/views/html/OutputWaiter.js index ddf952e4..b7bb3d74 100755 --- a/src/js/views/html/OutputWaiter.js +++ b/src/js/views/html/OutputWaiter.js @@ -28,47 +28,47 @@ OutputWaiter.prototype.get = function() { /** * Sets the output in the output textarea. * - * @param {string} data_str - The output string/HTML + * @param {string} dataStr - The output string/HTML * @param {string} type - The data type of the output * @param {number} duration - The length of time (ms) it took to generate the output */ -OutputWaiter.prototype.set = function(data_str, type, duration) { - var output_text = document.getElementById("output-text"), - output_html = document.getElementById("output-html"), - output_highlighter = document.getElementById("output-highlighter"), - input_highlighter = document.getElementById("input-highlighter"); +OutputWaiter.prototype.set = function(dataStr, type, duration) { + var outputText = document.getElementById("output-text"), + outputHtml = document.getElementById("output-html"), + outputHighlighter = document.getElementById("output-highlighter"), + inputHighlighter = document.getElementById("input-highlighter"); if (type === "html") { - output_text.style.display = "none"; - output_html.style.display = "block"; - output_highlighter.display = "none"; - input_highlighter.display = "none"; + outputText.style.display = "none"; + outputHtml.style.display = "block"; + outputHighlighter.display = "none"; + inputHighlighter.display = "none"; - output_text.value = ""; - output_html.innerHTML = data_str; + outputText.value = ""; + outputHtml.innerHTML = dataStr; // Execute script sections - var script_elements = output_html.querySelectorAll("script"); - for (var i = 0; i < script_elements.length; i++) { + var scriptElements = outputHtml.querySelectorAll("script"); + for (var i = 0; i < scriptElements.length; i++) { try { - eval(script_elements[i].innerHTML); // eslint-disable-line no-eval + eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval } catch (err) { console.error(err); } } } else { - output_text.style.display = "block"; - output_html.style.display = "none"; - output_highlighter.display = "block"; - input_highlighter.display = "block"; + outputText.style.display = "block"; + outputHtml.style.display = "none"; + outputHighlighter.display = "block"; + inputHighlighter.display = "block"; - output_text.value = Utils.printable(data_str, true); - output_html.innerHTML = ""; + outputText.value = Utils.printable(dataStr, true); + outputHtml.innerHTML = ""; } - this.manager.highlighter.remove_highlights(); - var lines = data_str.count("\n") + 1; - this.set_output_info(data_str.length, lines, duration); + this.manager.highlighter.removeHighlights(); + var lines = dataStr.count("\n") + 1; + this.setOutputInfo(dataStr.length, lines, duration); }; @@ -79,28 +79,54 @@ OutputWaiter.prototype.set = function(data_str, type, duration) { * @param {number} lines - The number of the lines in the current output string * @param {number} duration - The length of time (ms) it took to generate the output */ -OutputWaiter.prototype.set_output_info = function(length, lines, duration) { +OutputWaiter.prototype.setOutputInfo = function(length, lines, duration) { var width = length.toString().length; width = width < 4 ? 4 : width; - var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, " "); - var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, " "); - var time_str = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, " "); + var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, " "); + var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, " "); + var timeStr = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, " "); - document.getElementById("output-info").innerHTML = "time: " + time_str + - "
          length: " + length_str + - "
          lines: " + lines_str; + document.getElementById("output-info").innerHTML = "time: " + timeStr + + "
          length: " + lengthStr + + "
          lines: " + linesStr; document.getElementById("input-selection-info").innerHTML = ""; document.getElementById("output-selection-info").innerHTML = ""; }; +/** + * Adjusts the display properties of the output buttons so that they fit within the current width + * without wrapping or overflowing. + */ +OutputWaiter.prototype.adjustWidth = function() { + var output = document.getElementById("output"), + saveToFile = document.getElementById("save-to-file"), + switchIO = document.getElementById("switch"), + undoSwitch = document.getElementById("undo-switch"), + maximiseOutput = document.getElementById("maximise-output"); + + if (output.clientWidth < 680) { + saveToFile.childNodes[1].nodeValue = ""; + switchIO.childNodes[1].nodeValue = ""; + undoSwitch.childNodes[1].nodeValue = ""; + maximiseOutput.childNodes[1].nodeValue = ""; + } else { + saveToFile.childNodes[1].nodeValue = " Save to file"; + switchIO.childNodes[1].nodeValue = " Move output to input"; + undoSwitch.childNodes[1].nodeValue = " Undo"; + maximiseOutput.childNodes[1].nodeValue = + maximiseOutput.getAttribute("title") === "Maximise" ? " Max" : " Restore"; + } +}; + + /** * Handler for save click events. * Saves the current output to a file, downloaded as a URL octet stream. */ -OutputWaiter.prototype.save_click = function() { - var data = Utils.to_base64(this.app.dish_str), +OutputWaiter.prototype.saveClick = function() { + var data = Utils.toBase64(this.app.dishStr), filename = window.prompt("Please enter a filename:", "download.dat"); if (filename) { @@ -122,10 +148,10 @@ OutputWaiter.prototype.save_click = function() { * Handler for switch click events. * Moves the current output into the input textarea. */ -OutputWaiter.prototype.switch_click = function() { - this.switch_orig_data = this.manager.input.get(); +OutputWaiter.prototype.switchClick = function() { + this.switchOrigData = this.manager.input.get(); document.getElementById("undo-switch").disabled = false; - this.app.set_input(this.app.dish_str); + this.app.setInput(this.app.dishStr); }; @@ -133,7 +159,30 @@ OutputWaiter.prototype.switch_click = function() { * Handler for undo switch click events. * Removes the output from the input and replaces the input that was removed. */ -OutputWaiter.prototype.undo_switch_click = function() { - this.app.set_input(this.switch_orig_data); +OutputWaiter.prototype.undoSwitchClick = function() { + this.app.setInput(this.switchOrigData); document.getElementById("undo-switch").disabled = true; }; + + +/** + * Handler for maximise output click events. + * Resizes the output frame to be as large as possible, or restores it to its original size. + */ +OutputWaiter.prototype.maximiseOutputClick = function(e) { + var el = e.target.id === "maximise-output" ? e.target : e.target.parentNode; + + if (el.getAttribute("title") === "Maximise") { + this.app.columnSplitter.collapse(0); + this.app.columnSplitter.collapse(1); + this.app.ioSplitter.collapse(0); + + el.setAttribute("title", "Restore"); + el.innerHTML = " Restore"; + this.adjustWidth(); + } else { + el.setAttribute("title", "Maximise"); + el.innerHTML = " Max"; + this.app.resetLayout(); + } +}; diff --git a/src/js/views/html/RecipeWaiter.js b/src/js/views/html/RecipeWaiter.js index 3d59c84e..1d259474 100755 --- a/src/js/views/html/RecipeWaiter.js +++ b/src/js/views/html/RecipeWaiter.js @@ -14,79 +14,79 @@ var RecipeWaiter = function(app, manager) { this.app = app; this.manager = manager; - this.remove_intent = false; + this.removeIntent = false; }; /** * Sets up the drag and drop capability for operations in the operations and recipe areas. */ -RecipeWaiter.prototype.initialise_operation_drag_n_drop = function() { - var rec_list = document.getElementById("rec_list"); +RecipeWaiter.prototype.initialiseOperationDragNDrop = function() { + var recList = document.getElementById("rec-list"); // Recipe list - Sortable.create(rec_list, { + Sortable.create(recList, { group: "recipe", sort: true, animation: 0, delay: 0, filter: ".arg-input,.arg", // Relies on commenting out a line in Sortable.js which calls evt.preventDefault() - setData: function(dataTransfer, drag_el) { - dataTransfer.setData("Text", drag_el.querySelector(".arg-title").textContent); + setData: function(dataTransfer, dragEl) { + dataTransfer.setData("Text", dragEl.querySelector(".arg-title").textContent); }, onEnd: function(evt) { - if (this.remove_intent) { + if (this.removeIntent) { evt.item.remove(); evt.target.dispatchEvent(this.manager.operationremove); } }.bind(this) }); - Sortable.utils.on(rec_list, "dragover", function() { - this.remove_intent = false; + Sortable.utils.on(recList, "dragover", function() { + this.removeIntent = false; }.bind(this)); - Sortable.utils.on(rec_list, "dragleave", function() { - this.remove_intent = true; + Sortable.utils.on(recList, "dragleave", function() { + this.removeIntent = true; this.app.progress = 0; }.bind(this)); - Sortable.utils.on(rec_list, "touchend", function(e) { + Sortable.utils.on(recList, "touchend", function(e) { var loc = e.changedTouches[0], target = document.elementFromPoint(loc.clientX, loc.clientY); - this.remove_intent = !rec_list.contains(target); + this.removeIntent = !recList.contains(target); }.bind(this)); // Favourites category - document.querySelector("#categories a").addEventListener("dragover", this.fav_dragover.bind(this)); - document.querySelector("#categories a").addEventListener("dragleave", this.fav_dragleave.bind(this)); - document.querySelector("#categories a").addEventListener("drop", this.fav_drop.bind(this)); + document.querySelector("#categories a").addEventListener("dragover", this.favDragover.bind(this)); + document.querySelector("#categories a").addEventListener("dragleave", this.favDragleave.bind(this)); + document.querySelector("#categories a").addEventListener("drop", this.favDrop.bind(this)); }; /** * Creates a drag-n-droppable seed list of operations. * - * @param {element} list_el - The list the initialise + * @param {element} listEl - The list the initialise */ -RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) { - Sortable.create(list_el, { +RecipeWaiter.prototype.createSortableSeedList = function(listEl) { + Sortable.create(listEl, { group: { name: "recipe", pull: "clone", put: false }, sort: false, - setData: function(dataTransfer, drag_el) { - dataTransfer.setData("Text", drag_el.textContent); + setData: function(dataTransfer, dragEl) { + dataTransfer.setData("Text", dragEl.textContent); }, onStart: function(evt) { $(evt.item).popover("destroy"); evt.item.setAttribute("data-toggle", "popover-disabled"); }, - onEnd: this.op_sort_end.bind(this) + onEnd: this.opSortEnd.bind(this) }); }; @@ -99,9 +99,9 @@ RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) { * @fires Manager#operationadd * @param {event} evt */ -RecipeWaiter.prototype.op_sort_end = function(evt) { - if (this.remove_intent) { - if (evt.item.parentNode.id === "rec_list") { +RecipeWaiter.prototype.opSortEnd = function(evt) { + if (this.removeIntent) { + if (evt.item.parentNode.id === "rec-list") { evt.item.remove(); } return; @@ -112,11 +112,11 @@ RecipeWaiter.prototype.op_sort_end = function(evt) { $(evt.clone).popover(); $(evt.clone).children("[data-toggle=popover]").popover(); - if (evt.item.parentNode.id !== "rec_list") { + if (evt.item.parentNode.id !== "rec-list") { return; } - this.build_recipe_operation(evt.item); + this.buildRecipeOperation(evt.item); evt.item.dispatchEvent(this.manager.operationadd); }; @@ -128,7 +128,7 @@ RecipeWaiter.prototype.op_sort_end = function(evt) { * * @param {event} e */ -RecipeWaiter.prototype.fav_dragover = function(e) { +RecipeWaiter.prototype.favDragover = function(e) { if (e.dataTransfer.effectAllowed !== "move") return false; @@ -153,7 +153,7 @@ RecipeWaiter.prototype.fav_dragover = function(e) { * * @param {event} e */ -RecipeWaiter.prototype.fav_dragleave = function(e) { +RecipeWaiter.prototype.favDragleave = function(e) { e.stopPropagation(); e.preventDefault(); document.querySelector("#categories a").classList.remove("favourites-hover"); @@ -166,13 +166,13 @@ RecipeWaiter.prototype.fav_dragleave = function(e) { * * @param {event} e */ -RecipeWaiter.prototype.fav_drop = function(e) { +RecipeWaiter.prototype.favDrop = function(e) { e.stopPropagation(); e.preventDefault(); e.target.classList.remove("favourites-hover"); - var op_name = e.dataTransfer.getData("Text"); - this.app.add_favourite(op_name); + var opName = e.dataTransfer.getData("Text"); + this.app.addFavourite(opName); }; @@ -181,7 +181,7 @@ RecipeWaiter.prototype.fav_drop = function(e) { * * @fires Manager#statechange */ -RecipeWaiter.prototype.ing_change = function() { +RecipeWaiter.prototype.ingChange = function() { window.dispatchEvent(this.manager.statechange); }; @@ -193,7 +193,7 @@ RecipeWaiter.prototype.ing_change = function() { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.disable_click = function(e) { +RecipeWaiter.prototype.disableClick = function(e) { var icon = e.target; if (icon.getAttribute("disabled") === "false") { @@ -218,7 +218,7 @@ RecipeWaiter.prototype.disable_click = function(e) { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.breakpoint_click = function(e) { +RecipeWaiter.prototype.breakpointClick = function(e) { var bp = e.target; if (bp.getAttribute("break") === "false") { @@ -240,7 +240,7 @@ RecipeWaiter.prototype.breakpoint_click = function(e) { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.operation_dblclick = function(e) { +RecipeWaiter.prototype.operationDblclick = function(e) { e.target.remove(); window.dispatchEvent(this.manager.statechange); }; @@ -253,7 +253,7 @@ RecipeWaiter.prototype.operation_dblclick = function(e) { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.operation_child_dblclick = function(e) { +RecipeWaiter.prototype.operationChildDblclick = function(e) { e.target.parentNode.remove(); window.dispatchEvent(this.manager.statechange); }; @@ -262,31 +262,31 @@ RecipeWaiter.prototype.operation_child_dblclick = function(e) { /** * Generates a configuration object to represent the current recipe. * - * @returns {recipe_config} + * @returns {recipeConfig} */ -RecipeWaiter.prototype.get_config = function() { - var config = [], ingredients, ing_list, disabled, bp, item, - operations = document.querySelectorAll("#rec_list li.operation"); +RecipeWaiter.prototype.getConfig = function() { + var config = [], ingredients, ingList, disabled, bp, item, + operations = document.querySelectorAll("#rec-list li.operation"); for (var i = 0; i < operations.length; i++) { ingredients = []; disabled = operations[i].querySelector(".disable-icon"); bp = operations[i].querySelector(".breakpoint"); - ing_list = operations[i].querySelectorAll(".arg"); + ingList = operations[i].querySelectorAll(".arg"); - for (var j = 0; j < ing_list.length; j++) { - if (ing_list[j].getAttribute("type") === "checkbox") { + for (var j = 0; j < ingList.length; j++) { + if (ingList[j].getAttribute("type") === "checkbox") { // checkbox - ingredients[j] = ing_list[j].checked; - } else if (ing_list[j].classList.contains("toggle-string")) { - // toggle_string + ingredients[j] = ingList[j].checked; + } else if (ingList[j].classList.contains("toggle-string")) { + // toggleString ingredients[j] = { - option: ing_list[j].previousSibling.children[0].textContent.slice(0, -1), - string: ing_list[j].value + option: ingList[j].previousSibling.children[0].textContent.slice(0, -1), + string: ingList[j].value }; } else { // all others - ingredients[j] = ing_list[j].value; + ingredients[j] = ingList[j].value; } } @@ -315,8 +315,8 @@ RecipeWaiter.prototype.get_config = function() { * * @param {number} position */ -RecipeWaiter.prototype.update_breakpoint_indicator = function(position) { - var operations = document.querySelectorAll("#rec_list li.operation"); +RecipeWaiter.prototype.updateBreakpointIndicator = function(position) { + var operations = document.querySelectorAll("#rec-list li.operation"); for (var i = 0; i < operations.length; i++) { if (i === position) { operations[i].classList.add("break"); @@ -333,19 +333,19 @@ RecipeWaiter.prototype.update_breakpoint_indicator = function(position) { * * @param {element} el - The operation stub element from the operations pane */ -RecipeWaiter.prototype.build_recipe_operation = function(el) { - var op_name = el.textContent; - var op = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); - el.innerHTML = op.to_full_html(); +RecipeWaiter.prototype.buildRecipeOperation = function(el) { + var opName = el.textContent; + var op = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); + el.innerHTML = op.toFullHtml(); - if (this.app.operations[op_name].flow_control) { + if (this.app.operations[opName].flowControl) { el.classList.add("flow-control-op"); } // Disable auto-bake if this is a manual op - this should be moved to the 'operationadd' // handler after event restructuring - if (op.manual_bake && this.app.auto_bake_) { - this.manager.controls.set_auto_bake(false); + if (op.manualBake && this.app.autoBake_) { + this.manager.controls.setAutoBake(false); this.app.alert("Auto-Bake is disabled by default when using this operation.", "info", 5000); } }; @@ -357,13 +357,13 @@ RecipeWaiter.prototype.build_recipe_operation = function(el) { * @param {string} name - The name of the operation to add * @returns {element} */ -RecipeWaiter.prototype.add_operation = function(name) { +RecipeWaiter.prototype.addOperation = function(name) { var item = document.createElement("li"); item.classList.add("operation"); item.innerHTML = name; - this.build_recipe_operation(item); - document.getElementById("rec_list").appendChild(item); + this.buildRecipeOperation(item); + document.getElementById("rec-list").appendChild(item); item.dispatchEvent(this.manager.operationadd); return item; @@ -375,27 +375,27 @@ RecipeWaiter.prototype.add_operation = function(name) { * * @fires Manager#operationremove */ -RecipeWaiter.prototype.clear_recipe = function() { - var rec_list = document.getElementById("rec_list"); - while (rec_list.firstChild) { - rec_list.removeChild(rec_list.firstChild); +RecipeWaiter.prototype.clearRecipe = function() { + var recList = document.getElementById("rec-list"); + while (recList.firstChild) { + recList.removeChild(recList.firstChild); } - rec_list.dispatchEvent(this.manager.operationremove); + recList.dispatchEvent(this.manager.operationremove); }; /** - * Handler for operation dropdown events from toggle_string arguments. + * Handler for operation dropdown events from toggleString arguments. * Sets the selected option as the name of the button. * * @param {event} e */ -RecipeWaiter.prototype.dropdown_toggle_click = function(e) { +RecipeWaiter.prototype.dropdownToggleClick = function(e) { var el = e.target, button = el.parentNode.parentNode.previousSibling; button.innerHTML = el.textContent + " "; - this.ing_change(); + this.ingChange(); }; @@ -406,7 +406,7 @@ RecipeWaiter.prototype.dropdown_toggle_click = function(e) { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.op_add = function(e) { +RecipeWaiter.prototype.opAdd = function(e) { window.dispatchEvent(this.manager.statechange); }; @@ -418,6 +418,6 @@ RecipeWaiter.prototype.op_add = function(e) { * @fires Manager#statechange * @param {event} e */ -RecipeWaiter.prototype.op_remove = function(e) { +RecipeWaiter.prototype.opRemove = function(e) { window.dispatchEvent(this.manager.statechange); }; diff --git a/src/js/views/html/SeasonalWaiter.js b/src/js/views/html/SeasonalWaiter.js index d480b521..a4e6cecf 100755 --- a/src/js/views/html/SeasonalWaiter.js +++ b/src/js/views/html/SeasonalWaiter.js @@ -24,22 +24,22 @@ SeasonalWaiter.prototype.load = function() { // Snowfall if (now.getMonth() === 11 && now.getDate() > 12) { // Dec 13 -> Dec 31 this.app.options.snow = false; - this.create_snow_option(); - $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox[option='snow']", this.let_it_snow.bind(this)); - window.addEventListener("resize", this.let_it_snow.bind(this)); - this.manager.add_listeners(".btn", "click", this.shake_off_snow, this); - if (now.getDate() === 25) this.let_it_snow(); + this.createSnowOption(); + $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox[option='snow']", this.letItSnow.bind(this)); + window.addEventListener("resize", this.letItSnow.bind(this)); + this.manager.addListeners(".btn", "click", this.shakeOffSnow, this); + if (now.getDate() === 25) this.letItSnow(); } // SpiderChef // if (now.getMonth() === 3 && now.getDate() === 1) { // Apr 1 - // this.insert_spider_icons(); - // this.insert_spider_text(); + // this.insertSpiderIcons(); + // this.insertSpiderText(); // } // Konami code this.kkeys = []; - window.addEventListener("keydown", this.konami_code_listener.bind(this)); + window.addEventListener("keydown", this.konamiCodeListener.bind(this)); }; @@ -47,7 +47,7 @@ SeasonalWaiter.prototype.load = function() { * Replaces chef icons with spider icons. * #spiderchef */ -SeasonalWaiter.prototype.insert_spider_icons = function() { +SeasonalWaiter.prototype.insertSpiderIcons = function() { var spider16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC", spider32 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC", spider64 = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJZUlEQVR42u1ZaXMU1xXlJ+gHpFITOy5sAcnIYCi2aIL2bTSSZrSP1NpHK41kISQBHgFaQIJBCMwi4TFUGYcPzggwEMcxHVGxQaag5QR/np/QP+Hmnsdr0hpmtEACwulb9aq7p7d3zz333Pt61q2zzTbbbLPNNttss80222yzzTbbVmu7MzKcJRWVkXjntqam6jyURPeGQqeTpqbOqp+evxC5dGlam5m5rE3PzGi8Hzx/4aLzbXDe09HdYxwZHaPc4mLFXVoW9pRXGNv3pDngeHlNLfE2Ljjj4xPOUGjSYKfpq6/+TLdv36bbX39Nt27epGvXvqSLl6bp3LlPtdOnz7jWrPNZ7kLCKCovp5bOTmP/4EHq6vmYMtzuSKbbbQCAHE8Rxd47MjrmuHjxkjF3/z4tLCzQkyc6PX78mB49ekQPHjygub/P0d27f6FrX/6JpqbO0YkT48E1R/sCr9cYHZ+gqrp64mPq+riXcoqKKC0vP9q6VyV/fQOiH+LrsPVY7z82PBKZnb1Bd+7cpfn5eQbgCT1hAADC/MN5uj83R99881eanZ2lL5gN/nrxjihAXwvOJ7l9vuiBQ4dF9LEtLC0V+2rv/ijTX6luaCS3rxT57wADAMTBQ4c9PIIDg4PBwYOHaHhklM5MnSWkwLff/o0+v3qVHv34Iz344QEDc4d8VVXUEAhQXXMzVdQqzKweKq6oABARzOGNOZ+Wl6fD6T25ubQrPT0E5xF93o82tbdjkkZ+iZfAAgbD6fZ6o339A8S0p7HjJ2h4eIQOHf6EujlV9nX3UOj0JDXzfXje+KlTdOPGDeF0T1+fGHg+2JSen08tHZ0CiPySEoPn8vq1IaOgIAzneQK0UzjcQd6qaqrlCVfV1+tpubnRnv5+2p2ZqYMF/oZGPTh0xLhy5Sr9wLn9j++/p5nLn9FxBoLZQJ1dKrkys6iYNeTExEnx3PqWFuF4W9deKq2upkEGCyzyMBC709MFC7r391Fjayv9MSdHZyCU1xJ5FjrNdN6VnU1KS4CjU4Yoh/m8CsezCguFJgAMV05ueP+BfhF5OL+gL9A/f/qJ7t3TaPLMFB09eoy6mTkMGg2PjTELOsS20OcTACgMKqJugqA0NtE7ycn0202b6A+ZmYIVAAKApGZlgRHB/0lqQPAqFEVE9hntM0R0ZblTzeswWdCeU8HAtYW+Uu0AUx+0f/jwoXD+56c/073v7tHU2XMiFbrUfVTNAtfL10FIAQL2QftsBrOEnavld5kg7E7PoF+99x79ev162rJrV9RMi6a2dvKUlQsR5uAgII7/ivMsbEE4g2hggjzC7LQL1OftovoO0WJKUn0gYEAn2hmMXo4QHIXQIfLfsfOXPwuLvB86cpQqamooyEzg1BLMwv04RkoE+B3B4BBBMHEcCwIP0N+ByJdUVhpgBJ7j4WvdANDjeTUglOaWEChfJF7uJzPX2HEPaj1vg7EAbHO5QnAeIPgqKvUB7gtAdbBgcvKMqOnc/NAIVwCcq21qElFnCgvaI9cBBFKhlSPbPzBIbbzduGULpWzfLkDAdZs++sgEwSlZqoIJMg2CzFSNGzODwdBfOi26+w4YTCm9LhDQwQDzdzguFf4FALjciTws8/u1yyx2N2/dovPnL9DRY8PkZ204xtuhoSM0wI7V8DEiirQCCHD+99u2CUdx3Lmvmz7kfemoGDgPEDr4HNKAf1MlAC4wgMGLWFJXQUrklZSEX6rLE2rOyDIQGlhgBUAyYFEZkm2vAGVi4qQ+x83M0389pevXr6OToy07d4qcR+krr/KzqpeJ/IfjGO+npDx3FCKHVPjd1q2LAMBI3ryZ9vL7U56BEzLfD80ACFba876OlGCQV9dAcT0Pyw7PgWij6zPP5Xt9EYgg+n3LosdVzdfz5CI8KY1LH31+5Yro9KanZwjHmPzmHTsoOeVDemfDBuE8dGVnWpqx3unUrE4CDLCAG64XAHB88IFgQV5xMY7DFmc16A6CZvnNBYYVcW+yKj0A/VHTsQ8dwMPNc6X+Gg0VIGbVpzYGWundjRujmGQWi9Eol7+TJ0/R2Nhx2sNlM9YJRPDdDRsM5DGPJB4KHOIhngHhAwixAGAAuDZ2lsuiYnFWBQOYrdEYNochilyiV6YHoH+rRNJkAG+fUw31PzU7Z1EFKPD69CIuQ1Bm6URoh8tFmVym3nc6rZOPyi0cD8HxeHPg3x2InNrbS79JTsYzNXmPuBclsO3ZvKwAOJEGsmI5rT0M+gSf3y9K5LIA1LUEIlL1k0AhCYBH5r9TCqBqib4D+c/1PyInGOThkvuaHCYALhlpbQWBMGR/4IpzTqlpbKQyf0045vdoe0zATHagSYMeWFMkbscnHRYPZjoFJaIiUkz9EJy15j/X3qCsAIqMcFjSWrNE1Iygg0fEmrtLzEUTdT/OhBFht9fHDVCbEUt3LJxi08B8Xj6vTDESriq9lVWqBECgHujqiqAUmufb1X3cfRXoluhjZWiwkOnSUcUS6ZD8LUmmhks6b5j1ezkAkAKZBe5QvPPcNBnoCawMwT66Qxk0R2xwwRAui2iSDGuaPDcubzo3EJq8wcx/9Vmk3QryH42QBQCFF0UagIiJtjX6DskIXTLEucJSHIIIMuO0BOcjn3A3ybU/lu5RCUBc5qA0Ih0Q2EWiCPRk7VfMNhjLW1zETic1tLYZDMKyuSsdfh5l6bwho5+0il4kyA0VohlNcF5FP8DlWo/VB16HYB2hJ0pzgIe2mcXxP2IOumPRY17U0tll8KIkZNb+sppafOxYkQPSaYfchyYoL9GMqWYpTLRIq1QUcT4O3aPQgqVqPwIOIMwDhzX6mQUFIQAgo+9MzcrWrML3mj6+YIKiFCZyhL87RqVQKrEskF+P1BUvfLCAkfRwoPUtq6l5o5+lZb5SolJo6oT8avTCl+c9OTmat6pKW8mLkvBpGzlvsiGuQr4ZEEwA1EQgoR/gNtxIxKBluz+OtMJiF31jHxqXBiAqAUj4WRxpADFM0DCFlv1khvX7Wol4vF4AIldVVxdZqlrIfiCYQPHDy6bAGv7nKYRVY6JewExZVAP+ey5Rv+Ba97aaUHMW5NauLmMZFkegBb/EP14d6NoS9QLWFSzWBmuZza8CQmSpXsAqmGtVy14VALWuuYWWy+W3OteXa4jwceQX6+BKG6J1/8+2VCNkm2222WabbbbZZpttttlmm22rt38DCdA0vq3bcAkAAAAASUVORK5CYII="; @@ -67,12 +67,12 @@ SeasonalWaiter.prototype.insert_spider_icons = function() { * Replaces all instances of the word "cyber" with "spider". * #spiderchef */ -SeasonalWaiter.prototype.insert_spider_text = function() { +SeasonalWaiter.prototype.insertSpiderText = function() { // Title document.title = document.title.replace(/Cyber/g, "Spider"); // Body - SeasonalWaiter.tree_walk(document.body, function(node) { + SeasonalWaiter.treeWalk(document.body, function(node) { // process only text nodes if (node.nodeType === 3) { node.nodeValue = node.nodeValue.replace(/Cyber/g, "Spider"); @@ -80,7 +80,7 @@ SeasonalWaiter.prototype.insert_spider_text = function() { }, true); // Bake button - SeasonalWaiter.tree_walk(document.getElementById("bake-group"), function(node) { + SeasonalWaiter.treeWalk(document.getElementById("bake-group"), function(node) { // process only text nodes if (node.nodeType === 3) { node.nodeValue = node.nodeValue.replace(/Bake/g, "Spin"); @@ -96,15 +96,15 @@ SeasonalWaiter.prototype.insert_spider_text = function() { * Adds an option to make it snow. * #letitsnow */ -SeasonalWaiter.prototype.create_snow_option = function() { - var options_body = document.getElementById("options-body"), - option_item = document.createElement("div"); +SeasonalWaiter.prototype.createSnowOption = function() { + var optionsBody = document.getElementById("options-body"), + optionItem = document.createElement("div"); - option_item.className = "option-item"; - option_item.innerHTML = + optionItem.className = "option-item"; + optionItem.innerHTML = "\ Let it snow"; - options_body.appendChild(option_item); + optionsBody.appendChild(optionItem); this.manager.options.load(); }; @@ -114,14 +114,14 @@ SeasonalWaiter.prototype.create_snow_option = function() { * Initialises a snowstorm. * #letitsnow */ -SeasonalWaiter.prototype.let_it_snow = function() { +SeasonalWaiter.prototype.letItSnow = function() { $(document).snowfall("clear"); if (!this.app.options.snow) return; var options = {}, - firefox_version = navigator.userAgent.match(/Firefox\/(\d\d?)/); + firefoxVersion = navigator.userAgent.match(/Firefox\/(\d\d?)/); - if (firefox_version && parseInt(firefox_version[1], 10) < 30) { + if (firefoxVersion && parseInt(firefoxVersion[1], 10) < 30) { // Firefox < 30 options = { flakeCount: 10, @@ -163,12 +163,12 @@ SeasonalWaiter.prototype.let_it_snow = function() { * When a button is clicked, shake the snow off that button. * #letitsnow */ -SeasonalWaiter.prototype.shake_off_snow = function(e) { +SeasonalWaiter.prototype.shakeOffSnow = function(e) { var el = e.target, rect = el.getBoundingClientRect(), canvases = document.querySelectorAll("canvas.snowfall-canvas"), canvas = null, - remove_func = function() { + removeFunc = function() { ctx.clearRect(0, 0, canvas.width, canvas.height); $(this).fadeIn(); }; @@ -178,7 +178,7 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) { if (canvas.style.left === rect.left + "px" && canvas.style.top === (rect.top - 20) + "px") { var ctx = canvas.getContext("2d"); - $(canvas).fadeOut("slow", remove_func); + $(canvas).fadeOut("slow", removeFunc); break; } } @@ -190,7 +190,7 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) { * sequence. * #konamicode */ -SeasonalWaiter.prototype.konami_code_listener = function(e) { +SeasonalWaiter.prototype.konamiCodeListener = function(e) { this.kkeys.push(e.keyCode); var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; for (var i = 0; i < this.kkeys.length; i++) { @@ -212,20 +212,20 @@ SeasonalWaiter.prototype.konami_code_listener = function(e) { * @static * @param {element} parent - The DOM node to start from * @param {Function} fn - The callback function to operate on each node - * @param {booleam} all_nodes - Whether to operate on every node or not + * @param {booleam} allNodes - Whether to operate on every node or not */ -SeasonalWaiter.tree_walk = (function() { +SeasonalWaiter.treeWalk = (function() { // Create closure for constants var skipTags = { "SCRIPT": true, "IFRAME": true, "OBJECT": true, "EMBED": true, "STYLE": true, "LINK": true, "META": true }; - return function(parent, fn, all_nodes) { + return function(parent, fn, allNodes) { var node = parent.firstChild; while (node && node !== parent) { - if (all_nodes || node.nodeType === 1) { + if (allNodes || node.nodeType === 1) { if (fn(node) === false) { return(false); } diff --git a/src/js/views/html/WindowWaiter.js b/src/js/views/html/WindowWaiter.js index 3f905b62..6c3b427b 100755 --- a/src/js/views/html/WindowWaiter.js +++ b/src/js/views/html/WindowWaiter.js @@ -18,9 +18,9 @@ var WindowWaiter = function(app) { * Resets the layout of CyberChef's panes after 200ms (so that continuous resizing doesn't cause * continuous resetting). */ -WindowWaiter.prototype.window_resize = function() { - clearTimeout(this.reset_layout_timeout); - this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200); +WindowWaiter.prototype.windowResize = function() { + clearTimeout(this.resetLayoutTimeout); + this.resetLayoutTimeout = setTimeout(this.app.resetLayout.bind(this.app), 200); }; @@ -29,8 +29,8 @@ WindowWaiter.prototype.window_resize = function() { * Saves the current time so that we can calculate how long the window was unfocussed for when * focus is returned. */ -WindowWaiter.prototype.window_blur = function() { - this.window_blur_time = new Date().getTime(); +WindowWaiter.prototype.windowBlur = function() { + this.windowBlurTime = new Date().getTime(); }; @@ -44,9 +44,9 @@ WindowWaiter.prototype.window_blur = function() { * This will stop baking taking a long time when the CyberChef browser tab has been unfocused for * a long time and the browser has swapped out all its memory. */ -WindowWaiter.prototype.window_focus = function() { - var unfocused_time = new Date().getTime() - this.window_blur_time; - if (unfocused_time > 60000) { - this.app.silent_bake(); +WindowWaiter.prototype.windowFocus = function() { + var unfocusedTime = new Date().getTime() - this.windowBlurTime; + if (unfocusedTime > 60000) { + this.app.silentBake(); } }; diff --git a/src/js/views/html/main.js b/src/js/views/html/main.js index 71cbb7ad..dbe6e342 100755 --- a/src/js/views/html/main.js +++ b/src/js/views/html/main.js @@ -10,7 +10,7 @@ * Main function used to build the CyberChef web app. */ var main = function() { - var default_favourites = [ + var defaultFavourites = [ "To Base64", "From Base64", "To Hex", @@ -23,27 +23,27 @@ var main = function() { "Fork" ]; - var default_options = { - update_url : true, - show_highlighter : true, - treat_as_utf8 : true, - word_wrap : true, - show_errors : true, - error_timeout : 4000, - auto_bake_threshold : 200, - attempt_highlight : true, - snow : false, + var defaultOptions = { + updateUrl : true, + showHighlighter : true, + treatAsUtf8 : true, + wordWrap : true, + showErrors : true, + errorTimeout : 4000, + autoBakeThreshold : 200, + attemptHighlight : true, + snow : false, }; document.removeEventListener("DOMContentLoaded", main, false); - window.app = new HTMLApp(Categories, OperationConfig, default_favourites, default_options); + window.app = new HTMLApp(Categories, OperationConfig, defaultFavourites, defaultOptions); window.app.setup(); }; // Fix issues with browsers that don't support console.log() window.console = console || {log: function() {}, error: function() {}}; -window.compile_time = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf(); -window.compile_message = "<%= compile_msg %>"; +window.compileTime = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf(); +window.compileMessage = "<%= compileMsg %>"; document.addEventListener("DOMContentLoaded", main, false); diff --git a/src/static/images/fork_me.png b/src/static/images/fork_me.png new file mode 100644 index 00000000..6e0c3a78 Binary files /dev/null and b/src/static/images/fork_me.png differ diff --git a/src/static/images/maximise-16x16.png b/src/static/images/maximise-16x16.png new file mode 100755 index 00000000..be47e6ee Binary files /dev/null and b/src/static/images/maximise-16x16.png differ diff --git a/src/static/images/restore-16x16.png b/src/static/images/restore-16x16.png new file mode 100755 index 00000000..10ca13dd Binary files /dev/null and b/src/static/images/restore-16x16.png differ diff --git a/src/static/stats.txt b/src/static/stats.txt index 977d4d88..1267b20c 100644 --- a/src/static/stats.txt +++ b/src/static/stats.txt @@ -1,3 +1,4 @@ +<<<<<<< HEAD 203 source files <<<<<<< HEAD <<<<<<< HEAD @@ -23,14 +24,24 @@ 95316 lines 3.4M size >>>>>>> master +======= +211 source files +114840 lines +4.3M size -78 third party JavaScript source files -76377 lines -2.7M size +141 JavaScript source files +105680 lines +3.7M size +>>>>>>> master + +83 third party JavaScript source files +86258 lines +3.0M size 58 first party JavaScript source files <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD 18934 lines 729K size ======= @@ -41,9 +52,13 @@ 18939 lines 724K size >>>>>>> master +======= +19422 lines +732K size +>>>>>>> master -3.2M uncompressed JavaScript size -1.7M compressed JavaScript size +3.4M uncompressed JavaScript size +1.9M compressed JavaScript size 15 categories -155 operations +165 operations