├── requirements.txt
├── .gitignore
├── src
├── lexical
│ ├── __init__.py
│ ├── commom.py
│ ├── lexical.py
│ └── tokrules.py
├── semantic
│ ├── __init__.py
│ ├── scope.py
│ ├── checktype.py
│ ├── myexceptions.py
│ └── semantic.py
├── syntactic
│ ├── __init__.py
│ ├── ast.py
│ └── syntactic.py
└── __init__.py
├── static
├── img
│ └── approved.jpg
└── css
│ └── bootstrap.min.css
├── examples
├── hello-world.cl
├── hello.cl
├── if_example.cl
├── print-cool.cl
├── let_example.cl
├── while_example.cl
├── case_example.cl
├── inhritance_example.cl
├── hs.cl
├── new-complex.cl
├── readme.txt
├── cells.cl
├── primes.cl
├── atoi.cl
├── sort-list.cl
├── list.cl
└── arith.cl
├── templates
├── index.html
├── base.html
├── syntactic.html
└── lexico.html
├── compiler.py
├── README.md
├── LICENSE
└── app.py
/requirements.txt:
--------------------------------------------------------------------------------
1 | Flask==0.10.1
2 | ply==3.8
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | env/
2 | *.pyc
3 | parser.out
4 | parsetab.py
--------------------------------------------------------------------------------
/src/lexical/__init__.py:
--------------------------------------------------------------------------------
1 | from .lexical import MyLex
2 |
--------------------------------------------------------------------------------
/src/semantic/__init__.py:
--------------------------------------------------------------------------------
1 | from .semantic import Semant
2 |
--------------------------------------------------------------------------------
/src/syntactic/__init__.py:
--------------------------------------------------------------------------------
1 | from .syntactic import syntactic
2 |
--------------------------------------------------------------------------------
/static/img/approved.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/delete/cool-compiler/master/static/img/approved.jpg
--------------------------------------------------------------------------------
/src/__init__.py:
--------------------------------------------------------------------------------
1 | from syntactic import syntactic
2 | from semantic import Semant
3 | from lexical import MyLex as lex
--------------------------------------------------------------------------------
/examples/hello-world.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | a : Int <- 1;
3 | main() : Object {
4 | {
5 | out_string("Hello, world.\n");
6 | out_int(a);
7 | }
8 | };
9 | };
--------------------------------------------------------------------------------
/examples/hello.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | main() : Object {
3 | out_string("Hello \
4 | world")
5 | a : Int;
6 | a <- 5;
7 | out_int(a);
8 | (* teste
9 | example*)
10 | } ;
11 | } ;
--------------------------------------------------------------------------------
/examples/if_example.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | c : Int <- 1;
3 | flag : Bool <- true;
4 | main() : Object {
5 | if 0 < c then
6 | true
7 | else
8 | false
9 | fi
10 | };
11 | };
12 |
--------------------------------------------------------------------------------
/examples/print-cool.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | main() : SELF_TYPE {
3 | {
4 | out_string((new Object).type_name().substr(4,1)).
5 | out_string((isvoid self).type_name().substr(1,3));
6 | out_string("\n");
7 | }
8 | };
9 | };
10 |
--------------------------------------------------------------------------------
/src/lexical/commom.py:
--------------------------------------------------------------------------------
1 | # Compute column.
2 | # input is the input text string
3 | # token is a token instance
4 | def find_column(input, token):
5 | last_cr = input.rfind('\n', 0, token.lexpos)
6 | if last_cr < 0:
7 | # Not found
8 | last_cr = 0
9 | column = (token.lexpos - last_cr) + 1
10 | return column
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 | {% block content %}
5 |
6 |
7 |
A ~cool~ web compiler
8 |
for Cool Language, written in Python using the framework PLY.
9 |
Source code
10 |
11 |
12 | {% endblock %}
--------------------------------------------------------------------------------
/examples/let_example.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | c : Int <- 1;
3 | main() : Object {
4 | {
5 | out_string("Hello, world.\n");
6 | out_int(c);
7 | let b : Int <- 1,
8 | a : String <- "A" in
9 | {
10 | out_string(a);
11 | out_string("==");
12 | out_int(b);
13 | };
14 | }
15 | };
16 | };
--------------------------------------------------------------------------------
/examples/while_example.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | c : Int <- 1;
3 | flag : Bool <- true;
4 | main() : Object {
5 | {
6 | out_string("Hello, world.\n");
7 | (let countdown : Int <- 20 in
8 | while flag loop
9 | {
10 | countdown <- countdown - 1;
11 | out_int(c);
12 | }
13 | pool
14 | );
15 | }
16 | };
17 | };
18 |
--------------------------------------------------------------------------------
/examples/case_example.cl:
--------------------------------------------------------------------------------
1 | class A {};
2 | class B inherits A {};
3 | class C inherits B {};
4 |
5 | class D {};
6 |
7 | class Main inherits IO {
8 | var : B <- (new B);
9 |
10 | class_type(var : Object) : SELF_TYPE {
11 | case var of
12 | a : A => out_string("Class type is now A\n");
13 | b : B => out_string("Class type is now B\n");
14 | c : C => out_string("Class type is now C\n");
15 | o : Object => out_string("Oooops\n");
16 | esac
17 | };
18 |
19 | main() : Object {
20 | {
21 | class_type(var);
22 | }
23 | };
24 | };
25 |
26 |
27 |
--------------------------------------------------------------------------------
/examples/inhritance_example.cl:
--------------------------------------------------------------------------------
1 | class A inherits IO {
2 | a : Int <- 2;
3 | hello(x: Int) : Int {
4 | {
5 | out_int(x);
6 | 0;
7 | }
8 | };
9 | };
10 |
11 | class B inherits A {
12 | do() : String {
13 | {
14 | hello(2);
15 | out_int(a);
16 | "do nothing";
17 | }
18 | };
19 | };
20 |
21 | class Main inherits IO {
22 | i : Int <- 1;
23 | b : B <- new B;
24 | main() : Object {
25 | {
26 | out_string("Hello, world.\n");
27 | out_int(i);
28 | b.do();
29 | b.hello(3);
30 | }
31 | };
32 | };
33 |
--------------------------------------------------------------------------------
/compiler.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | from src import syntactic
4 | from src import Semant
5 | from src import lex
6 |
7 | DEBUG = False
8 |
9 | if __name__ == '__main__':
10 | if len(sys.argv) != 2:
11 | print('Choose a cool file to read.')
12 | sys.exit(1)
13 |
14 | with open(sys.argv[1]) as file:
15 | code = file.read()
16 |
17 | l = lex()
18 | llex, lerror = l.tokenize(code)
19 | if lerror:
20 | print('Lex - EROOR')
21 | print(lerror)
22 | sys.exit(1)
23 |
24 | ast = syntactic(code)
25 | if ast[0] is None:
26 | print("Sintatic - ERROR")
27 | sys.exit(1)
28 |
29 | if DEBUG:
30 | print('\n\n====== DEBUGGING ======\n\n')
31 | s = Semant(ast[0])
32 | s.build()
33 |
34 | if DEBUG:
35 | print('\n\n====== CLASSES ======\n\n')
36 | print(s.classes)
37 | print('\n\n====== PARENTS ======\n\n')
38 | print(s.parents)
39 | print('\n\n====== AST ======\n\n')
40 | print(ast[0])
41 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Cool Language Compiler (working in progress)
2 | > Compiler for [Cool Language](http://theory.stanford.edu/~aiken/software/cool/cool.html) created for compilers' class from my Computer Science degrees at Fluminense Federal University.
3 |
4 | 
5 |
6 | ## Installation
7 |
8 | Clone the project:
9 |
10 | ```
11 | $ git clone https://github.com/delete/cool-compiler.git
12 | $ cd cool-compiler/
13 | ```
14 |
15 | Install the requirements packages:
16 |
17 | > See [here](https://pip.pypa.io/en/stable/installing/) how to install pip.
18 |
19 | `$ pip install -r requirements.txt`
20 |
21 |
22 | ## Usage example
23 |
24 | Web app:
25 |
26 | > Only lexical and syntatic analyzers are working on web app for now, if you want use semantic, please, run from terminal.
27 |
28 | `$ python2 app.py`
29 |
30 | Access:
31 | `http://127.0.0.1:5000/`
32 |
33 | Run from the terminal:
34 |
35 | `$ python2 compiler.py examples/hello-world.cl`
36 |
37 | > If no message appear, then everything is fine.
38 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 | Copyright (c) 2016 Fellipe Pinheiro
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5 |
6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7 |
8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | from flask import Flask
2 | from flask import render_template, request
3 |
4 | from src.lexical import MyLex
5 | from src.syntactic import syntactic as syn
6 |
7 |
8 | app = Flask(__name__)
9 |
10 |
11 | @app.route("/")
12 | def index():
13 | return render_template('index.html')
14 |
15 |
16 | @app.route("/lexico", methods=['GET', 'POST'])
17 | def lexico():
18 | llex = ()
19 | lerror = ()
20 | code = ''
21 |
22 | if request.method == 'POST':
23 | code = request.form['code']
24 | l = MyLex()
25 | llex, lerror = l.tokenize(code)
26 |
27 | return render_template(
28 | 'lexico.html', llex=llex, lerror=lerror, code=code
29 | )
30 |
31 |
32 | @app.route("/sintatico", methods=['GET', 'POST'])
33 | def syntactic():
34 | code = ''
35 | result = []
36 | serror = []
37 |
38 | if request.method == 'POST':
39 | code = request.form['code']
40 | result, serror = syn(code)
41 |
42 | return render_template(
43 | 'syntactic.html', result=result, serror=serror, code=code
44 | )
45 |
46 | if __name__ == "__main__":
47 | app.run(debug=True)
48 |
--------------------------------------------------------------------------------
/templates/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
30 |
31 |
32 |
33 | {% block content %}
34 | {% endblock %}
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/semantic/scope.py:
--------------------------------------------------------------------------------
1 | class Scope():
2 | """
3 | List of dictionaries to save name->type.
4 | This class represents a stack of environments.
5 | Each dictionary represents an environment.
6 | """
7 |
8 | def __init__(self):
9 | self.store = [dict()]
10 |
11 | def get(self, key):
12 | for item in self.store[::-1]:
13 | if key in item:
14 | return item[key]
15 | raise KeyError(key)
16 |
17 | def add(self, key, value):
18 | self.store[-1][key] = value
19 |
20 | def remove(self, key):
21 | del self.store[-1][key]
22 |
23 | def new(self):
24 | self.store.append(dict())
25 |
26 | def destroy(self):
27 | del self.store[-1]
28 |
29 | def exists(self, key):
30 | try:
31 | self.get(key)
32 | return True
33 | except KeyError:
34 | return False
35 |
36 |
37 | if __name__ == '__main__':
38 | scope = Scope()
39 | scope.add('Main', ('Int', 'Int'))
40 | print(scope.store)
41 | scope.remove('Main')
42 | print(scope.store)
43 | scope.new()
44 | print(scope.store)
45 | scope.destroy()
46 | print(scope.store)
47 |
--------------------------------------------------------------------------------
/src/syntactic/ast.py:
--------------------------------------------------------------------------------
1 | from collections import namedtuple
2 |
3 | # Used to create abstract syntax tree
4 | Class = namedtuple("Class", "name, parent, feature_list")
5 | Attr = namedtuple("Attr", "name, type, body")
6 | Method = namedtuple(
7 | "Method", "name, formal_list, return_type, body"
8 | )
9 | Object = namedtuple("Object", "name")
10 | Int = namedtuple("Int", "content")
11 | Bool = namedtuple("Bool", "content")
12 | Str = namedtuple("Str", "content")
13 | Block = namedtuple("Block", "body")
14 | Assign = namedtuple("Assign", "name, body")
15 | Dispatch = namedtuple("Dispatch", "body, method, expr_list")
16 | StaticDispatch = namedtuple(
17 | "StaticDispatch", "body, type, method, expr_list"
18 | )
19 | Plus = namedtuple("Plus", "first, second")
20 | Sub = namedtuple("Sub", "first, second")
21 | Mult = namedtuple("Mult", "first, second")
22 | Div = namedtuple("Div", "first, second")
23 | Lt = namedtuple("Lt", "first, second")
24 | Le = namedtuple("Le", "first, second")
25 | Eq = namedtuple("Eq", "first, second")
26 | If = namedtuple("If", "predicate, then_body, else_body")
27 | While = namedtuple("While", "predicate, body")
28 | Case = namedtuple("Case", "expr, case_list")
29 | New = namedtuple("New", "type")
30 | Isvoid = namedtuple("Isvoid", "body")
31 | Neg = namedtuple("Neg", "body")
32 | Not = namedtuple("Not", "body")
33 | Let = namedtuple("Let", "object, type, init, body")
34 |
--------------------------------------------------------------------------------
/examples/hs.cl:
--------------------------------------------------------------------------------
1 | (* hairy . . .*)
2 |
3 | class Foo inherits Bazz {
4 | a : Razz <- case self of
5 | n : Razz => (new Bar);
6 | n : Foo => (new Razz);
7 | n : Bar => n;
8 | esac;
9 |
10 | b : Int <- a.doh() + g.doh() + doh() + printh();
11 |
12 | doh() : Int { (let i : Int <- h in { h <- h + 2; i; } ) };
13 |
14 | };
15 |
16 | class Bar inherits Razz {
17 |
18 | c : Int <- doh();
19 |
20 | d : Object <- printh();
21 | };
22 |
23 |
24 | class Razz inherits Foo {
25 |
26 | e : Bar <- case self of
27 | n : Razz => (new Bar);
28 | n : Bar => n;
29 | esac;
30 |
31 | f : Int <- a@Bazz.doh() + g.doh() + e.doh() + doh() + printh();
32 |
33 | };
34 |
35 | class Bazz inherits IO {
36 |
37 | h : Int <- 1;
38 |
39 | g : Foo <- case self of
40 | n : Bazz => (new Foo);
41 | n : Razz => (new Bar);
42 | n : Foo => (new Razz);
43 | n : Bar => n;
44 | esac;
45 |
46 | i : Object <- printh();
47 |
48 | printh() : Int { { out_int(h); 0; } };
49 |
50 | doh() : Int { (let i: Int <- h in { h <- h + 1; i; } ) };
51 | };
52 |
53 | (* scary . . . *)
54 | class Main inherits IO {
55 | a : Bazz <- new Bazz;
56 | b : Foo <- new Foo;
57 | c : Razz <- new Razz;
58 | d : Bar <- new Bar;
59 |
60 | main(): String { { out_string("\n") ; "do nothing" ; } };
61 | };
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/src/lexical/lexical.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 | import sys
3 |
4 | import ply.lex as lex
5 |
6 | from commom import find_column
7 | import tokrules
8 |
9 |
10 | class MyLex(object):
11 |
12 | def __init__(self, module=tokrules):
13 | self.module = module
14 | self.lexer = None
15 | self.llex = []
16 |
17 | self._build_lexer()
18 |
19 | def _build_lexer(self):
20 | self.lexer = lex.lex(module=self.module)
21 |
22 | def tokenize(self, newString):
23 | self.lexer.input(str(newString))
24 |
25 | while True:
26 | tok = self.lexer.token()
27 | if not tok:
28 | break
29 | lt = (tok.type, tok.value, tok.lineno, find_column(newString, tok))
30 | self.llex.append(lt)
31 |
32 | return tuple(self.llex), tuple(tokrules.lerror)
33 |
34 |
35 | if __name__ == '__main__':
36 | codigo = '''class Main inherits IO {
37 | main() : Object {
38 | out_string("Hello, world.\n")
39 | -- comentario
40 | a : Int;
41 | a <- 5;
42 | out_int(2=2)
43 | };
44 | };
45 | '''
46 | if len(sys.argv) != 2:
47 | print('Choose a cool file to read.')
48 | sys.exit(1)
49 |
50 | with open(sys.argv[1]) as file:
51 | codigo = file.read()
52 | l = MyLex()
53 | llex, lerror = l.tokenize(codigo)
54 |
55 | for l in llex:
56 | print(l)
57 |
58 | print('ERROR')
59 | for e in lerror:
60 | print(e)
61 |
--------------------------------------------------------------------------------
/examples/new-complex.cl:
--------------------------------------------------------------------------------
1 | class Main inherits IO {
2 | main() : SELF_TYPE {
3 | (let c : Complex <- (new Complex).init(1, 1) in
4 | {
5 | -- trivially equal (see CoolAid)
6 | if c.reflect_X() = c.reflect_0()
7 | then out_string("passed\n")
8 | else out_string("failed\n")
9 | fi;
10 | -- equal
11 | if c.reflect_X().reflect_Y().equal(c.reflect_0())
12 | then out_string("passed\n")
13 | else out_string("failed\n")
14 | fi;
15 | }
16 | )
17 | };
18 | };
19 |
20 | class Complex inherits IO {
21 | x : Int;
22 | y : Int;
23 |
24 | init(a : Int, b : Int) : Complex {
25 | {
26 | x <- a;
27 | y <- b;
28 | self;
29 | }
30 | };
31 |
32 | print() : Object {
33 | if y = 0
34 | then out_int(x)
35 | else out_int(x).out_string("+").out_int(y).out_string("I")
36 | fi
37 | };
38 |
39 | reflect_0() : Complex {
40 | {
41 | x <- ~x;
42 | y <- ~y;
43 | self;
44 | }
45 | };
46 |
47 | reflect_X() : Complex {
48 | {
49 | y <- ~y;
50 | self;
51 | }
52 | };
53 |
54 | reflect_Y() : Complex {
55 | {
56 | x <- ~x;
57 | self;
58 | }
59 | };
60 |
61 | equal(d : Complex) : Bool {
62 | if x = d.x_value()
63 | then
64 | if y = d.y_value()
65 | then true
66 | else false
67 | fi
68 | else false
69 | fi
70 | };
71 |
72 | x_value() : Int {
73 | x
74 | };
75 |
76 | y_value() : Int {
77 | y
78 | };
79 | };
80 |
--------------------------------------------------------------------------------
/src/semantic/checktype.py:
--------------------------------------------------------------------------------
1 | from ..syntactic.ast import *
2 | from myexceptions import SemantError
3 |
4 |
5 | def returned_type(feature, _class):
6 | """
7 | Returns the type of the feature.
8 |
9 | There is a difference between attribute and method.
10 | Attributes has "type" attribute and
11 | method has "return_type" attribute.
12 | """
13 | try:
14 | # For Attribute
15 | _type = feature.type
16 | except AttributeError:
17 | # For Method
18 | _type = feature.return_type
19 |
20 | if _type == 'SELF_TYPE':
21 | _type = _class.name
22 |
23 | return _type
24 |
25 |
26 | def get_expression_type(expression, _class, scope):
27 | """
28 | Returns the type of the expression.
29 |
30 | If the type is self, then returns the name of the
31 | class.
32 | """
33 | if isinstance(expression, Str):
34 | return 'String'
35 |
36 | elif isinstance(expression, Object):
37 | if expression.name == "self":
38 | return _class.name
39 |
40 | if not scope.exists(expression.name):
41 | raise SemantError(
42 | "Variable %s is not in scope" % expression.name
43 | )
44 |
45 | return scope.get(expression.name)
46 |
47 | elif isinstance(expression, Int):
48 | return "Int"
49 |
50 | elif isinstance(expression, Bool):
51 | return "Bool"
52 |
53 | elif isinstance(expression, New):
54 | return returned_type(expression, _class)
55 |
56 |
57 | def isMethod(feature):
58 | return isinstance(feature, Method)
59 |
60 |
61 | def isAttribute(feature):
62 | return isinstance(feature, Attr)
63 |
--------------------------------------------------------------------------------
/templates/syntactic.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 | {% block content %}
5 |
6 |
7 |
16 |
17 | {% if serror or result %}
18 |
19 |
20 |
21 |
Análise
22 |
Resultado da análise sintática:
23 |
24 | {% if serror %}
25 |
26 |
27 |
28 |
29 | | Token |
30 | Lexema |
31 | Linha |
32 |
33 |
34 |
35 | {% for error in serror %}
36 |
37 | | {{ error.0 }} |
38 | {{ error.1 }} |
39 | {{ error.2 }} |
40 |
41 |
42 | {% endfor %}
43 |
44 |
45 | {% endif %}
46 |
47 | {% if result %}
48 |
49 |
50 |
51 | {% endif %}
52 |
53 |
54 |
55 |
56 | {% endif %}
57 |
58 | {% endblock %}
--------------------------------------------------------------------------------
/examples/readme.txt:
--------------------------------------------------------------------------------
1 | CS 415 - Programming Languages - Wes Weimer
2 | Version 1.00 - Sat Jan 6 12:08:02 EST 2007
3 |
4 | This package contains a few simple Cool programs to help you get started.
5 | These are useful both for understanding Cool and as basic testcases
6 | for your scanner, parser, type checker and interpreter.
7 |
8 | These are all positive test cases. That is, they should all scan, parse, type
9 | check and execute correctly. You will have to construct your own negative test
10 | cases to exercise failure modes. We have many held-out testcases, both
11 | positive and negative, that are not present in this set.
12 |
13 | You are welcome to incorporate any of this code in your own assignments (e.g.,
14 | in PA1). However, you *must* properly credit the inclusion in your readme.
15 |
16 | The files are:
17 |
18 | hello-world.cl prints "Hello, world.\n" to standard output
19 |
20 | atoi.cl an integer-to-string and string-to-integer class for Cool
21 |
22 | list.cl a well-commented linked list example
23 |
24 | sort-list.cl another linked list example; this one includes sorting
25 |
26 | arith.cl a "menu-driven" interactive desktop calculator
27 | (includes an inlined version of atoi)
28 |
29 | cells.cl simple cellular automaton simulator
30 |
31 | primes.cl a "methodless" program that enumerates all of the primes
32 | between 2 and 500. It is not a good example of object-oriented
33 | style, but it does show off some corner cases of Cool.
34 |
35 | print-cool.cl a more complicated hello-world that prints "cool\n"
36 |
37 | new-complex.cl a complex arithmetic and equality regression test
38 |
39 | hs.cl "hairy-scary" is a torture regression test
40 |
41 | That's it!
42 |
--------------------------------------------------------------------------------
/src/lexical/tokrules.py:
--------------------------------------------------------------------------------
1 | # Reserved words
2 | reserved = [
3 | 'class', 'in', 'inherits', 'isvoid', 'let', 'new', 'of', 'not',
4 | 'loop', 'pool', 'case', 'esac', 'if', 'then', 'else', 'fi', 'while'
5 | ]
6 |
7 | tokens = [
8 | 'COMMENTINLINE', 'DARROW', 'CLASS', 'IN', 'INHERITS', 'ISVOID', 'LET',
9 | 'NEW', 'OF', 'NOT', 'LOOP', 'POOL', 'CASE', 'ESAC', 'IF', 'THEN', 'ELSE',
10 | 'FI', 'WHILE', 'ASSIGN', 'LE', 'PLUS', 'MINUS', 'MULT', 'DIV', 'LPAREN',
11 | 'RPAREN', 'LBRACE', 'RBRACE', 'DOT', 'COLON', 'COMMA', 'SEMI', 'EQ',
12 | 'NEG', 'LT', 'AT', 'TYPEID', 'OBJECTID', 'INT_CONST', 'STR_CONST',
13 | 'COMMENT', 'BOOL_CONST'
14 | ]
15 |
16 | # Regex dos Tokens
17 | t_DARROW = '=>'
18 | t_ASSIGN = '<-'
19 | t_LE = '<='
20 | t_PLUS = r'\+'
21 | t_MINUS = r'-'
22 | t_MULT = r'\*'
23 | t_DIV = r'/'
24 | t_LPAREN = r'\('
25 | t_RPAREN = r'\)'
26 | t_LBRACE = r'\{'
27 | t_RBRACE = r'\}'
28 | t_DOT = r'\.'
29 | t_COLON = ':'
30 | t_COMMA = ','
31 | t_SEMI = ';'
32 | t_EQ = '='
33 | t_NEG = '~'
34 | t_LT = '<'
35 | t_AT = '@'
36 |
37 | t_ignore = ' \t\r\f'
38 |
39 |
40 | # Handle objects_types_and_reserved_words
41 | def t_ID(t):
42 | r'[a-zA-Z_][a-zA-Z_0-9]*'
43 | if t.value == 'true':
44 | t.type = 'BOOL_CONST'
45 | t.value = True
46 | return t
47 | if t.value == 'false':
48 | t.type = 'BOOL_CONST'
49 | t.value = False
50 | return t
51 |
52 | if t.value.lower() in reserved:
53 | t.type = t.value.upper()
54 | else:
55 | if t.value[0].islower():
56 | t.type = 'OBJECTID'
57 | else:
58 | t.type = 'TYPEID'
59 | return t
60 |
61 |
62 | def t_COMMENT(t):
63 | r'--.* | \(\*.+[\n\*\w\s]*\*\)'
64 | pass
65 |
66 |
67 | def t_STRING(t):
68 | r'\"[^"]*\"'
69 | # Tira as aspas (only python 2)
70 | t.value = t.value[1:-1].decode("string-escape")
71 | t.type = 'STR_CONST'
72 | return t
73 |
74 |
75 | def t_INT_CONST(t):
76 | r'\d+'
77 | t.value = int(t.value)
78 | return t
79 |
80 |
81 | def t_NEWLINE(t):
82 | r'\n+'
83 | t.lexer.lineno += t.value.count("\n")
84 |
85 |
86 | lerror = []
87 |
88 |
89 | def t_error(t):
90 | lr = (t.value[0], t.lineno, t.lexpos)
91 | lerror.append(lr)
92 | t.lexer.skip(1)
93 |
--------------------------------------------------------------------------------
/templates/lexico.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 | {% block content %}
5 |
6 |
7 |
8 |
9 |
14 |
15 |
16 |
17 | {% if llex or lerror %}
18 |
19 |
20 |
21 |
Análise
22 |
Resultado da análise léxica:
23 |
24 | {% if lerror %}
25 |
26 |
27 |
28 |
29 | | Token |
30 | Lexema |
31 | Linha |
32 |
33 |
34 |
35 | {% for error in lerror %}
36 |
37 |
38 | | ERROR |
39 | {{ error.0 }} |
40 | {{ error.1 }} |
41 |
42 |
43 | {% endfor %}
44 |
45 |
46 | {% endif %}
47 |
48 |
49 |
50 |
51 | | Token |
52 | Lexema |
53 | Linha |
54 | Coluna |
55 |
56 |
57 |
58 | {% for tok in llex %}
59 |
60 |
61 | | {{ tok.0 }} |
62 | {{ tok.1 }} |
63 | {{ tok.2 }} |
64 | {{ tok.3 }} |
65 | |
66 |
67 |
68 | {% endfor %}
69 |
70 |
71 |
72 |
73 |
74 | {% endif %}
75 |
76 | {% endblock %}
--------------------------------------------------------------------------------
/examples/cells.cl:
--------------------------------------------------------------------------------
1 | (* models one-dimensional cellular automaton on a circle of finite radius
2 | arrays are faked as Strings,
3 | X's respresent live cells, dots represent dead cells,
4 | no error checking is done *)
5 | class CellularAutomaton inherits IO {
6 | population_map : String;
7 |
8 | init(map : String) : SELF_TYPE {
9 | {
10 | population_map <- map;
11 | self;
12 | }
13 | };
14 |
15 | print() : SELF_TYPE {
16 | {
17 | out_string(population_map.concat("\n"));
18 | self;
19 | }
20 | };
21 |
22 | num_cells() : Int {
23 | population_map.length()
24 | };
25 |
26 | cell(position : Int) : String {
27 | population_map.substr(position, 1)
28 | };
29 |
30 | cell_left_neighbor(position : Int) : String {
31 | if position = 0 then
32 | cell(num_cells() - 1)
33 | else
34 | cell(position - 1)
35 | fi
36 | };
37 |
38 | cell_right_neighbor(position : Int) : String {
39 | if position = num_cells() - 1 then
40 | cell(0)
41 | else
42 | cell(position + 1)
43 | fi
44 | };
45 |
46 | (* a cell will live if exactly 1 of itself and it's immediate
47 | neighbors are alive *)
48 | cell_at_next_evolution(position : Int) : String {
49 | if (if cell(position) = "X" then 1 else 0 fi
50 | + if cell_left_neighbor(position) = "X" then 1 else 0 fi
51 | + if cell_right_neighbor(position) = "X" then 1 else 0 fi
52 | = 1)
53 | then
54 | "X"
55 | else
56 | "."
57 | fi
58 | };
59 |
60 | evolve() : SELF_TYPE {
61 | (let position : Int in
62 | (let num : Int <- num_cells() in
63 | (let temp : String in
64 | {
65 | while position < num loop
66 | {
67 | temp <- temp.concat(cell_at_next_evolution(position));
68 | position <- position + 1;
69 | }
70 | pool;
71 | population_map <- temp;
72 | self;
73 | }
74 | ) ) )
75 | };
76 | };
77 |
78 | class Main {
79 | cells : CellularAutomaton;
80 |
81 | main() : SELF_TYPE {
82 | {
83 | cells <- (new CellularAutomaton).init(" X ");
84 | cells.print();
85 | (let countdown : Int <- 20 in
86 | while 0 < countdown loop
87 | {
88 | cells.evolve();
89 | cells.print();
90 | countdown <- countdown - 1;
91 | }
92 | pool
93 | );
94 | self;
95 | }
96 | };
97 | };
98 |
--------------------------------------------------------------------------------
/examples/primes.cl:
--------------------------------------------------------------------------------
1 |
2 | (*
3 | * methodless-primes.cl
4 | *
5 | * Designed by Jesse H. Willett, jhw@cory, 11103234, with
6 | * Istvan Siposs, isiposs@cory, 12342921.
7 | *
8 | * This program generates primes in order without using any methods.
9 | * Actually, it does use three methods: those of IO to print out each
10 | * prime, and abort() to halt the program. These methods are incidental,
11 | * however, to the information-processing functionality of the program. We
12 | * could regard the attribute 'out's sequential values as our output, and
13 | * the string "halt" as our terminate signal.
14 | *
15 | * Naturally, using Cool this way is a real waste, basically reducing it
16 | * to assembly without the benefit of compilation.
17 | *
18 | * There could even be a subroutine-like construction, in that different
19 | * code could be in the assign fields of attributes of other classes,
20 | * and it could be executed by calling 'new Sub', but no parameters
21 | * could be passed to the subroutine, and it could only return itself.
22 | * but returning itself would be useless since we couldn't call methods
23 | * and the only operators we have are for Int and Bool, which do nothing
24 | * interesting when we initialize them!
25 | *)
26 |
27 | class Main inherits IO {
28 |
29 | main() : Int { -- main() is an atrophied method so we can parse.
30 | 0
31 | };
32 |
33 | out : Int <- -- out is our 'output'. Its values are the primes.
34 | {
35 | out_string("2 is trivially prime.\n");
36 | 2;
37 | };
38 |
39 | testee : Int <- out; -- testee is a number to be tested for primeness.
40 |
41 | divisor : Int; -- divisor is a number which may factor testee.
42 |
43 | stop : Int <- 500; -- stop is an arbitrary value limiting testee.
44 |
45 | m : Object <- -- m supplants the main method.
46 | while true loop
47 | {
48 |
49 | testee <- testee + 1;
50 | divisor <- 2;
51 |
52 | while
53 | if testee < divisor * divisor
54 | then false -- can stop if divisor > sqrt(testee).
55 | else if testee - divisor*(testee/divisor) = 0
56 | then false -- can stop if divisor divides testee.
57 | else true
58 | fi fi
59 | loop
60 | divisor <- divisor + 1
61 | pool;
62 |
63 | if testee < divisor * divisor -- which reason did we stop for?
64 | then -- testee has no factors less than sqrt(testee).
65 | {
66 | out <- testee; -- we could think of out itself as the output.
67 | out_int(out);
68 | out_string(" is prime.\n");
69 | }
70 | else -- the loop halted on testee/divisor = 0, testee isn't prime.
71 | 0 -- testee isn't prime, do nothing.
72 | fi;
73 |
74 | if stop <= testee then
75 | "halt".abort() -- we could think of "halt" as SIGTERM.
76 | else
77 | "continue"
78 | fi;
79 |
80 | }
81 | pool;
82 |
83 | }; (* end of Main *)
84 |
85 |
--------------------------------------------------------------------------------
/examples/atoi.cl:
--------------------------------------------------------------------------------
1 | (*
2 | The class A2I provides integer-to-string and string-to-integer
3 | conversion routines. To use these routines, either inherit them
4 | in the class where needed, have a dummy variable bound to
5 | something of type A2I, or simpl write (new A2I).method(argument).
6 | *)
7 |
8 |
9 | (*
10 | c2i Converts a 1-character string to an integer. Aborts
11 | if the string is not "0" through "9"
12 | *)
13 | class A2I {
14 |
15 | c2i(char : String) : Int {
16 | if char = "0" then 0 else
17 | if char = "1" then 1 else
18 | if char = "2" then 2 else
19 | if char = "3" then 3 else
20 | if char = "4" then 4 else
21 | if char = "5" then 5 else
22 | if char = "6" then 6 else
23 | if char = "7" then 7 else
24 | if char = "8" then 8 else
25 | if char = "9" then 9 else
26 | { abort(); 0; } -- the 0 is needed to satisfy the typchecker
27 | fi fi fi fi fi fi fi fi fi fi
28 | };
29 |
30 | (*
31 | i2c is the inverse of c2i.
32 | *)
33 | i2c(i : Int) : String {
34 | if i = 0 then "0" else
35 | if i = 1 then "1" else
36 | if i = 2 then "2" else
37 | if i = 3 then "3" else
38 | if i = 4 then "4" else
39 | if i = 5 then "5" else
40 | if i = 6 then "6" else
41 | if i = 7 then "7" else
42 | if i = 8 then "8" else
43 | if i = 9 then "9" else
44 | { abort(); ""; } -- the "" is needed to satisfy the typchecker
45 | fi fi fi fi fi fi fi fi fi fi
46 | };
47 |
48 | (*
49 | a2i converts an ASCII string into an integer. The empty string
50 | is converted to 0. Signed and unsigned strings are handled. The
51 | method aborts if the string does not represent an integer. Very
52 | long strings of digits produce strange answers because of arithmetic
53 | overflow.
54 |
55 | *)
56 | a2i(s : String) : Int {
57 | if s.length() = 0 then 0 else
58 | if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else
59 | if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else
60 | a2i_aux(s)
61 | fi fi fi
62 | };
63 |
64 | (*
65 | a2i_aux converts the usigned portion of the string. As a programming
66 | example, this method is written iteratively.
67 | *)
68 | a2i_aux(s : String) : Int {
69 | (let int : Int <- 0 in
70 | {
71 | (let j : Int <- s.length() in
72 | (let i : Int <- 0 in
73 | while i < j loop
74 | {
75 | int <- int * 10 + c2i(s.substr(i,1));
76 | i <- i + 1;
77 | }
78 | pool
79 | )
80 | );
81 | int;
82 | }
83 | )
84 | };
85 |
86 | (*
87 | i2a converts an integer to a string. Positive and negative
88 | numbers are handled correctly.
89 | *)
90 | i2a(i : Int) : String {
91 | if i = 0 then "0" else
92 | if 0 < i then i2a_aux(i) else
93 | "-".concat(i2a_aux(i * ~1))
94 | fi fi
95 | };
96 |
97 | (*
98 | i2a_aux is an example using recursion.
99 | *)
100 | i2a_aux(i : Int) : String {
101 | if i = 0 then "" else
102 | (let next : Int <- i / 10 in
103 | i2a_aux(next).concat(i2c(i - next * 10))
104 | )
105 | fi
106 | };
107 |
108 | };
109 |
110 | class Main inherits IO {
111 | main () : Object {
112 | let a : Int <- (new A2I).a2i("678987"),
113 | b : String <- (new A2I).i2a(678987) in
114 | {
115 | out_int(a) ;
116 | out_string(" == ") ;
117 | out_string(b) ;
118 | out_string("\n");
119 | }
120 | } ;
121 | } ;
122 |
--------------------------------------------------------------------------------
/examples/sort-list.cl:
--------------------------------------------------------------------------------
1 | (*
2 | This file presents a fairly large example of Cool programming. The
3 | class List defines the names of standard list operations ala Scheme:
4 | car, cdr, cons, isNil, rev, sort, rcons (add an element to the end of
5 | the list), and print_list. In the List class most of these functions
6 | are just stubs that abort if ever called. The classes Nil and Cons
7 | inherit from List and define the same operations, but now as
8 | appropriate to the empty list (for the Nil class) and for cons cells (for
9 | the Cons class).
10 |
11 | The Main class puts all of this code through the following silly
12 | test exercise:
13 |
14 | 1. prompt for a number N
15 | 2. generate a list of numbers 0..N-1
16 | 3. reverse the list
17 | 4. sort the list
18 | 5. print the sorted list
19 |
20 | Because the sort used is a quadratic space insertion sort, sorting
21 | moderately large lists can be quite slow.
22 | *)
23 |
24 | Class List inherits IO {
25 | (* Since abort() returns Object, we need something of
26 | type Bool at the end of the block to satisfy the typechecker.
27 | This code is unreachable, since abort() halts the program. *)
28 | isNil() : Bool { { abort(); true; } };
29 |
30 | cons(hd : Int) : Cons {
31 | (let new_cell : Cons <- new Cons in
32 | new_cell.init(hd,self)
33 | )
34 | };
35 |
36 | (*
37 | Since abort "returns" type Object, we have to add
38 | an expression of type Int here to satisfy the typechecker.
39 | This code is, of course, unreachable.
40 | *)
41 | car() : Int { { abort(); new Int; } };
42 |
43 | cdr() : List { { abort(); new List; } };
44 |
45 | rev() : List { cdr() };
46 |
47 | sort() : List { cdr() };
48 |
49 | insert(i : Int) : List { cdr() };
50 |
51 | rcons(i : Int) : List { cdr() };
52 |
53 | print_list() : Object { abort() };
54 | };
55 |
56 | Class Cons inherits List {
57 | xcar : Int; -- We keep the car in cdr in attributes.
58 | xcdr : List;
59 |
60 | isNil() : Bool { false };
61 |
62 | init(hd : Int, tl : List) : Cons {
63 | {
64 | xcar <- hd;
65 | xcdr <- tl;
66 | self;
67 | }
68 | };
69 |
70 | car() : Int { xcar };
71 |
72 | cdr() : List { xcdr };
73 |
74 | rev() : List { (xcdr.rev()).rcons(xcar) };
75 |
76 | sort() : List { (xcdr.sort()).insert(xcar) };
77 |
78 | insert(i : Int) : List {
79 | if i < xcar then
80 | (new Cons).init(i,self)
81 | else
82 | (new Cons).init(xcar,xcdr.insert(i))
83 | fi
84 | };
85 |
86 |
87 | rcons(i : Int) : List { (new Cons).init(xcar, xcdr.rcons(i)) };
88 |
89 | print_list() : Object {
90 | {
91 | out_int(xcar);
92 | out_string("\n");
93 | xcdr.print_list();
94 | }
95 | };
96 | };
97 |
98 | Class Nil inherits List {
99 | isNil() : Bool { true };
100 |
101 | rev() : List { self };
102 |
103 | sort() : List { self };
104 |
105 | insert(i : Int) : List { rcons(i) };
106 |
107 | rcons(i : Int) : List { (new Cons).init(i,self) };
108 |
109 | print_list() : Object { true };
110 |
111 | };
112 |
113 |
114 | Class Main inherits IO {
115 |
116 | l : List;
117 |
118 | (* iota maps its integer argument n into the list 0..n-1 *)
119 | iota(i : Int) : List {
120 | {
121 | l <- new Nil;
122 | (let j : Int <- 0 in
123 | while j < i
124 | loop
125 | {
126 | l <- (new Cons).init(j,l);
127 | j <- j + 1;
128 | }
129 | pool
130 | );
131 | l;
132 | }
133 | };
134 |
135 | main() : Object {
136 | {
137 | out_string("How many numbers to sort? ");
138 | iota(in_int()).rev().sort().print_list();
139 | }
140 | };
141 | };
142 |
143 |
144 |
145 |
146 |
147 |
--------------------------------------------------------------------------------
/examples/list.cl:
--------------------------------------------------------------------------------
1 | (*
2 | * This file shows how to implement a list data type for lists of integers.
3 | * It makes use of INHERITANCE and DYNAMIC DISPATCH.
4 | *
5 | * The List class has 4 operations defined on List objects. If 'l' is
6 | * a list, then the methods dispatched on 'l' have the following effects:
7 | *
8 | * isNil() : Bool Returns true if 'l' is empty, false otherwise.
9 | * head() : Int Returns the integer at the head of 'l'.
10 | * If 'l' is empty, execution aborts.
11 | * tail() : List Returns the remainder of the 'l',
12 | * i.e. without the first element.
13 | * cons(i : Int) : List Return a new list containing i as the
14 | * first element, followed by the
15 | * elements in 'l'.
16 | *
17 | * There are 2 kinds of lists, the empty list and a non-empty
18 | * list. We can think of the non-empty list as a specialization of
19 | * the empty list.
20 | * The class List defines the operations on empty list. The class
21 | * Cons inherits from List and redefines things to handle non-empty
22 | * lists.
23 | *)
24 |
25 |
26 | class List {
27 | -- Define operations on empty lists.
28 |
29 | isNil() : Bool { true };
30 |
31 | -- Since abort() has return type Object and head() has return type
32 | -- Int, we need to have an Int as the result of the method body,
33 | -- even though abort() never returns.
34 |
35 | head() : Int { { abort(); 0; } };
36 |
37 | -- As for head(), the self is just to make sure the return type of
38 | -- tail() is correct.
39 |
40 | tail() : List { { abort(); self; } };
41 |
42 | -- When we cons and element onto the empty list we get a non-empty
43 | -- list. The (new Cons) expression creates a new list cell of class
44 | -- Cons, which is initialized by a dispatch to init().
45 | -- The result of init() is an element of class Cons, but it
46 | -- conforms to the return type List, because Cons is a subclass of
47 | -- List.
48 |
49 | cons(i : Int) : List {
50 | (new Cons).init(i, self)
51 | };
52 |
53 | };
54 |
55 |
56 | (*
57 | * Cons inherits all operations from List. We can reuse only the cons
58 | * method though, because adding an element to the front of an emtpy
59 | * list is the same as adding it to the front of a non empty
60 | * list. All other methods have to be redefined, since the behaviour
61 | * for them is different from the empty list.
62 | *
63 | * Cons needs two attributes to hold the integer of this list
64 | * cell and to hold the rest of the list.
65 | *
66 | * The init() method is used by the cons() method to initialize the
67 | * cell.
68 | *)
69 |
70 | class Cons inherits List {
71 |
72 | car : Int; -- The element in this list cell
73 |
74 | cdr : List; -- The rest of the list
75 |
76 | isNil() : Bool { false };
77 |
78 | head() : Int { car };
79 |
80 | tail() : List { cdr };
81 |
82 | init(i : Int, rest : List) : List {
83 | {
84 | car <- i;
85 | cdr <- rest;
86 | self;
87 | }
88 | };
89 |
90 | };
91 |
92 |
93 |
94 | (*
95 | * The Main class shows how to use the List class. It creates a small
96 | * list and then repeatedly prints out its elements and takes off the
97 | * first element of the list.
98 | *)
99 |
100 | class Main inherits IO {
101 |
102 | mylist : List;
103 |
104 | -- Print all elements of the list. Calls itself recursively with
105 | -- the tail of the list, until the end of the list is reached.
106 |
107 | print_list(l : List) : Object {
108 | if l.isNil() then out_string("\n")
109 | else {
110 | out_int(l.head());
111 | out_string(" ");
112 | print_list(l.tail());
113 | }
114 | fi
115 | };
116 |
117 | -- Note how the dynamic dispatch mechanism is responsible to end
118 | -- the while loop. As long as mylist is bound to an object of
119 | -- dynamic type Cons, the dispatch to isNil calls the isNil method of
120 | -- the Cons class, which returns false. However when we reach the
121 | -- end of the list, mylist gets bound to the object that was
122 | -- created by the (new List) expression. This object is of dynamic type
123 | -- List, and thus the method isNil in the List class is called and
124 | -- returns true.
125 |
126 | main() : Object {
127 | {
128 | mylist <- new List.cons(1).cons(2).cons(3).cons(4).cons(5);
129 | while (not mylist.isNil()) loop
130 | {
131 | print_list(mylist);
132 | mylist <- mylist.tail();
133 | }
134 | pool;
135 | }
136 | };
137 |
138 | };
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/src/semantic/myexceptions.py:
--------------------------------------------------------------------------------
1 | class SemantError(Exception):
2 | pass
3 |
4 |
5 | class UndefinedMethodError(SemantError):
6 |
7 | def __init__(self, method, _class):
8 | msg = 'A undefined method %s was called in class %s'
9 | super(UndefinedMethodError, self).__init__(msg % (method, _class))
10 |
11 |
12 | class ReturnedTypeError(SemantError):
13 |
14 | def __init__(self, method, _class, expected, returned):
15 | msg = 'The method %s in class %s returns wrong type. Expected %s, returned %s.'
16 | super(ReturnedTypeError, self).__init__(
17 | msg % (method, _class, expected, returned)
18 | )
19 |
20 |
21 | class ArgumentTypeError(SemantError):
22 |
23 | def __init__(self, method, class_name):
24 | m = "Argument %s passed to method %s in class %s have a different type"
25 | try:
26 | # If is an Object, there is a name,
27 | content_or_name = method.name
28 | except AttributeError:
29 | # if not, there is a content instead
30 | content_or_name = method.content
31 | super(ArgumentTypeError, self).__init__(
32 | m % (content_or_name, method.name, class_name)
33 | )
34 |
35 |
36 | class NumberOfArgumentError(SemantError):
37 |
38 | def __init__(self, method, _class):
39 | msg = 'Tried to call method %s in class %s with wrong number of arguments'
40 | super(NumberOfArgumentError, self).__init__(msg % (method, _class))
41 |
42 |
43 | class RedefinedMethodError(SemantError):
44 |
45 | def __init__(self, method_nmae):
46 | msg = "Redefined method %s cannot change arguments or return type, they must be the same of the parent method"
47 | super(RedefinedMethodError, self).__init__(msg % (method_nmae))
48 |
49 |
50 | class RedefinedAttributeError(SemantError):
51 |
52 | def __init__(self, class_nmae):
53 | msg = "Attribute cannot be redefined in child class %s"
54 | super(RedefinedAttributeError, self).__init__(msg % (class_nmae))
55 |
56 |
57 | class UndefinedParentError(SemantError):
58 |
59 | def __init__(self, child, parent):
60 | msg = 'Classe %s inherit from an undefined parent %s'
61 | super(UndefinedParentError, self).__init__(msg % (child, parent))
62 |
63 |
64 | class ClassAlreadyDefinedError(SemantError):
65 |
66 | def __init__(self, class_name):
67 | msg = 'Class %s already defined'
68 | super(ClassAlreadyDefinedError, self).__init__(msg % (class_name))
69 |
70 |
71 | class InheritanceError(SemantError):
72 |
73 | def __init__(self, class_name):
74 | msg = '%s is in a inheritance cycle'
75 | super(InheritanceError, self).__init__(msg % (class_name))
76 |
77 |
78 | class DeclaredTypeError(SemantError):
79 |
80 | def __init__(self, expression_type, value_type):
81 | msg = 'Let init %s is not equal to the declared type %s'
82 | super(DeclaredTypeError, self).__init__(
83 | msg % (value_type, expression_type)
84 | )
85 |
86 |
87 | class AttributeTypeError(SemantError):
88 |
89 | def __init__(self, expression, value_type):
90 | msg = 'Expression %s was declared as %s and was passed %s'
91 | super(AttributeTypeError, self).__init__(
92 | msg % (expression.name, expression.type, value_type)
93 | )
94 |
95 |
96 | class TypeCheckError(SemantError):
97 |
98 | def __init__(self, first_type, second_type, _class):
99 | msg = 'Must be a Integer to check with < , <= or = ! Was given %s and %s in class %s'
100 | super(TypeCheckError, self).__init__(
101 | msg % (first_type, second_type, _class.name)
102 | )
103 |
104 |
105 | class EqualTypeCheckError(SemantError):
106 |
107 | def __init__(self, first_type, second_type, _class):
108 | msg = 'To compare two values, they must be String, Int or Bool. Was given %s and %s in class %s'
109 | super(EqualTypeCheckError, self).__init__(
110 | msg % (first_type, second_type, _class.name)
111 | )
112 |
113 |
114 | class EqualCheckError(SemantError):
115 |
116 | def __init__(self, first_type, second_type, _class):
117 | msg = 'To compare two values, they must be the same type. Was given %s and %s in class %s'
118 | super(EqualCheckError, self).__init__(
119 | msg % (first_type, second_type, _class.name)
120 | )
121 |
122 |
123 | class ArithmeticError(SemantError):
124 |
125 | def __init__(self, first_type, second_type, _class):
126 | msg = 'Arithmetic operations require integers! Was given %s and %s in class %s'
127 | super(ArithmeticError, self).__init__(
128 | msg % (first_type, second_type, _class.name)
129 | )
130 |
131 |
132 | class AssignError(SemantError):
133 |
134 | def __init__(self, first_type, second_type, _class):
135 | msg = 'Assign operations require same types! Was given %s and %s in class %s'
136 | super(AssignError, self).__init__(
137 | msg % (first_type, second_type, _class.name)
138 | )
139 |
140 |
141 | class ConditionStatementError(SemantError):
142 |
143 | def __init__(self, statement, value_type, _class):
144 | msg = '%s statement must have a boolean type, was given %s in class %s'
145 | super(ConditionStatementError, self).__init__(
146 | msg % (statement, value_type, _class.name)
147 | )
148 |
--------------------------------------------------------------------------------
/src/syntactic/syntactic.py:
--------------------------------------------------------------------------------
1 | import ply.yacc as yacc
2 |
3 | from ..lexical import MyLex
4 | from ..lexical.tokrules import *
5 |
6 | from ast import *
7 |
8 |
9 | def syntactic(string):
10 |
11 | def p_class_list_many(p):
12 | '''class_list : class_list class SEMI'''
13 | p[0] = p[1] + [p[2]]
14 |
15 | def p_class_list_single(p):
16 | '''class_list : class SEMI'''
17 | p[0] = [p[1]]
18 |
19 | def p_class(p):
20 | '''class : CLASS TYPEID LBRACE feature_list RBRACE'''
21 | p[0] = Class(p[2], "Object", p[4])
22 |
23 | def p_class_inherits(p):
24 | '''class : CLASS TYPEID INHERITS TYPEID LBRACE feature_list RBRACE'''
25 | p[0] = Class(p[2], p[4], p[6])
26 |
27 | def p_feature_list_many(p):
28 | '''feature_list : feature_list feature SEMI'''
29 | p[0] = p[1] + [p[2]]
30 |
31 | def p_feature_list_single(p):
32 | '''feature_list : feature SEMI'''
33 | p[0] = [p[1]]
34 |
35 | def p_feature_list_empty(p):
36 | '''feature_list : '''
37 | p[0] = []
38 |
39 | def p_feature_method(p):
40 | '''feature : OBJECTID LPAREN formal_list RPAREN COLON TYPEID LBRACE expression RBRACE'''
41 | p[0] = Method(p[1], p[3], p[6], p[8])
42 |
43 | def p_feature_method_no_formals(p):
44 | '''feature : OBJECTID LPAREN RPAREN COLON TYPEID LBRACE expression RBRACE'''
45 | p[0] = Method(p[1], [], p[5], p[7])
46 |
47 | def p_feature_attr_initialized(p):
48 | '''feature : OBJECTID COLON TYPEID ASSIGN expression'''
49 | p[0] = Attr(p[1], p[3], p[5])
50 |
51 | def p_feature_attr(p):
52 | '''feature : OBJECTID COLON TYPEID'''
53 | p[0] = Attr(p[1], p[3], None)
54 |
55 | def p_formal_list_many(p):
56 | '''formal_list : formal_list COMMA formal'''
57 | p[0] = p[1] + [p[3]]
58 |
59 | def p_formal_list_single(p):
60 | '''formal_list : formal'''
61 | p[0] = [p[1]]
62 |
63 | def p_formal(p):
64 | '''formal : OBJECTID COLON TYPEID'''
65 | p[0] = (p[1], p[3])
66 |
67 | def p_expression_object(p):
68 | '''expression : OBJECTID'''
69 | p[0] = Object(p[1])
70 |
71 | def p_expression_int(p):
72 | '''expression : INT_CONST'''
73 | p[0] = Int(p[1])
74 |
75 | def p_expression_bool(p):
76 | '''expression : BOOL_CONST'''
77 | p[0] = Bool(p[1])
78 |
79 | def p_expression_str(p):
80 | '''expression : STR_CONST'''
81 | p[0] = Str(p[1])
82 |
83 | def p_expression_block(p):
84 | '''expression : LBRACE block_list RBRACE'''
85 | p[0] = Block(p[2])
86 |
87 | def p_block_list_many(p):
88 | '''block_list : block_list expression SEMI'''
89 | p[0] = p[1] + [p[2]]
90 |
91 | def p_block_list_single(p):
92 | '''block_list : expression SEMI'''
93 | p[0] = [p[1]]
94 |
95 | def p_expression_assignment(p):
96 | '''expression : OBJECTID ASSIGN expression'''
97 | p[0] = Assign(Object(p[1]), p[3])
98 |
99 | def p_expression_dispatch(p):
100 | '''expression : expression DOT OBJECTID LPAREN expr_list RPAREN'''
101 | p[0] = Dispatch(p[1], p[3], p[5])
102 |
103 | def p_expr_list_many(p):
104 | '''expr_list : expr_list COMMA expression'''
105 | p[0] = p[1] + [p[3]]
106 |
107 | def p_expr_list_single(p):
108 | '''expr_list : expression'''
109 | p[0] = [p[1]]
110 |
111 | def p_expr_list_empty(p):
112 | '''expr_list : '''
113 | p[0] = []
114 |
115 | def p_expression_static_dispatch(p):
116 | '''expression : expression AT TYPEID DOT OBJECTID LPAREN expr_list RPAREN'''
117 | p[0] = StaticDispatch(p[1], p[3], p[5], p[7])
118 |
119 | def p_expression_self_dispatch(p):
120 | '''expression : OBJECTID LPAREN expr_list RPAREN'''
121 | p[0] = Dispatch("self", p[1], p[3])
122 |
123 | def p_expression_basic_math(p):
124 | '''
125 | expression : expression PLUS expression
126 | | expression MINUS expression
127 | | expression MULT expression
128 | | expression DIV expression
129 | '''
130 | if p[2] == '+':
131 | p[0] = Plus(p[1], p[3])
132 | elif p[2] == '-':
133 | p[0] = Sub(p[1], p[3])
134 | elif p[2] == '*':
135 | p[0] = Mult(p[1], p[3])
136 | elif p[2] == '/':
137 | p[0] = Div(p[1], p[3])
138 |
139 | def p_expression_numerical_comparison(p):
140 | '''
141 | expression : expression LT expression
142 | | expression LE expression
143 | | expression EQ expression
144 | '''
145 | if p[2] == '<':
146 | p[0] = Lt(p[1], p[3])
147 | elif p[2] == '<=':
148 | p[0] = Le(p[1], p[3])
149 | elif p[2] == '=':
150 | p[0] = Eq(p[1], p[3])
151 |
152 | def p_expression_with_parenthesis(p):
153 | '''expression : LPAREN expression RPAREN'''
154 | p[0] = p[2]
155 |
156 | def p_expression_if(p):
157 | '''expression : IF expression THEN expression ELSE expression FI'''
158 | p[0] = If(p[2], p[4], p[6])
159 |
160 | def p_expression_while(p):
161 | '''expression : WHILE expression LOOP expression POOL'''
162 | p[0] = While(p[2], p[4])
163 |
164 | def p_expression_let(p):
165 | """expression : LET OBJECTID COLON TYPEID IN expression
166 | expression : LET OBJECTID COLON TYPEID COMMA inner_lets"""
167 | p[0] = Let(p[2], p[4], None, p[6])
168 |
169 | def p_expression_let_initialized(p):
170 | """expression : LET OBJECTID COLON TYPEID ASSIGN expression IN expression
171 | expression : LET OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets"""
172 | p[0] = Let(p[2], p[4], p[6], p[8])
173 |
174 | def p_expression_let_with_error_in_first_decl(p):
175 | """expression : LET error COMMA OBJECTID COLON TYPEID IN expression
176 | expression : LET error COMMA OBJECTID COLON TYPEID COMMA inner_lets"""
177 | p[0] = Let(p[4], p[6], None, p[8])
178 |
179 | def p_expression_let_initialized_with_error_in_first_decl(p):
180 | """expression : LET error COMMA OBJECTID COLON TYPEID ASSIGN expression IN expression
181 | expression : LET error COMMA OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets"""
182 | p[0] = Let(p[4], p[6], p[8], p[10])
183 |
184 | def p_inner_lets_simple(p):
185 | """inner_lets : OBJECTID COLON TYPEID IN expression
186 | inner_lets : OBJECTID COLON TYPEID COMMA inner_lets """
187 | p[0] = Let(p[1], p[3], None, p[5])
188 |
189 | def p_inner_lets_initialized(p):
190 | """inner_lets : OBJECTID COLON TYPEID ASSIGN expression IN expression
191 | inner_lets : OBJECTID COLON TYPEID ASSIGN expression COMMA inner_lets"""
192 | p[0] = Let(p[1], p[3], p[5], p[7])
193 |
194 | def p_expression_case(p):
195 | '''expression : CASE expression OF case_list ESAC'''
196 | p[0] = Case(p[2], p[4])
197 |
198 | def p_case_list_one(p):
199 | '''case_list : case'''
200 | p[0] = [p[1]]
201 |
202 | def p_case_list_many(p):
203 | '''case_list : case_list case'''
204 | p[0] = p[1] + [p[2]]
205 |
206 | def p_case_expr(p):
207 | '''case : OBJECTID COLON TYPEID DARROW expression SEMI'''
208 | p[0] = (p[1], p[3], p[5])
209 |
210 | def p_expression_new(p):
211 | '''expression : NEW TYPEID'''
212 | p[0] = New(p[2])
213 |
214 | def p_expression_isvoid(p):
215 | '''expression : ISVOID expression'''
216 | p[0] = Isvoid(p[2])
217 |
218 | def p_expression_neg(p):
219 | '''expression : NEG expression'''
220 | p[0] = Neg(p[2])
221 |
222 | def p_expression_not(p):
223 | '''expression : NOT expression'''
224 | p[0] = Not(p[2])
225 |
226 | precedence = (
227 | ('right', 'ASSIGN'),
228 | ('left', 'NOT'),
229 | ('nonassoc', 'LE', 'LT', 'EQ'),
230 | ('left', 'PLUS', 'MINUS'),
231 | ('left', 'MULT', 'DIV'),
232 | ('left', 'ISVOID'),
233 | ('left', 'NEG'),
234 | ('left', 'AT'),
235 | ('left', 'DOT'),
236 | )
237 |
238 | serror = []
239 |
240 | # Error rule for syntax errors
241 | def p_error(p):
242 | er = (p.type, p.value[0], p.lineno, p.lexpos)
243 | serror.append(er)
244 | print('parser error: {}'.format(p))
245 |
246 | # Build the parser
247 | parser = yacc.yacc()
248 |
249 | l = MyLex()
250 | lexer = l.lexer
251 |
252 | result = parser.parse(string, lexer=lexer)
253 |
254 | return result, serror
255 |
256 |
257 | if __name__ == '__main__':
258 | import sys
259 |
260 | if len(sys.argv) > 1:
261 | with open(sys.argv[1]) as file:
262 | data = file.read()
263 |
264 | result, errors = syntactic(data)
265 | if result:
266 | print('\nOK!\n')
267 | else:
268 | print('A cool file is required.')
269 |
--------------------------------------------------------------------------------
/examples/arith.cl:
--------------------------------------------------------------------------------
1 | (*
2 | * A contribution from Anne Sheets (sheets@cory)
3 | *
4 | * Tests the arithmetic operations and various other things
5 | *)
6 |
7 | class A {
8 |
9 | var : Int <- 0;
10 |
11 | value() : Int { var };
12 |
13 | set_var(num : Int) : SELF_TYPE {
14 | {
15 | var <- num;
16 | self;
17 | }
18 | };
19 |
20 | method1(num : Int) : SELF_TYPE { -- same
21 | self
22 | };
23 |
24 | method2(num1 : Int, num2 : Int) : B { -- plus
25 | (let x : Int in
26 | {
27 | x <- num1 + num2;
28 | (new B).set_var(x);
29 | }
30 | )
31 | };
32 |
33 | method3(num : Int) : C { -- negate
34 | (let x : Int in
35 | {
36 | x <- ~num;
37 | (new C).set_var(x);
38 | }
39 | )
40 | };
41 |
42 | method4(num1 : Int, num2 : Int) : D { -- diff
43 | if num2 < num1 then
44 | (let x : Int in
45 | {
46 | x <- num1 - num2;
47 | (new D).set_var(x);
48 | }
49 | )
50 | else
51 | (let x : Int in
52 | {
53 | x <- num2 - num1;
54 | (new D).set_var(x);
55 | }
56 | )
57 | fi
58 | };
59 |
60 | method5(num : Int) : E { -- factorial
61 | (let x : Int <- 1 in
62 | {
63 | (let y : Int <- 1 in
64 | while y <= num loop
65 | {
66 | x <- x * y;
67 | y <- y + 1;
68 | }
69 | pool
70 | );
71 | (new E).set_var(x);
72 | }
73 | )
74 | };
75 |
76 | };
77 |
78 | class B inherits A { -- B is a number squared
79 |
80 | method5(num : Int) : E { -- square
81 | (let x : Int in
82 | {
83 | x <- num * num;
84 | (new E).set_var(x);
85 | }
86 | )
87 | };
88 |
89 | };
90 |
91 | class C inherits B {
92 |
93 | method6(num : Int) : A { -- negate
94 | (let x : Int in
95 | {
96 | x <- ~num;
97 | (new A).set_var(x);
98 | }
99 | )
100 | };
101 |
102 | method5(num : Int) : E { -- cube
103 | (let x : Int in
104 | {
105 | x <- num * num * num;
106 | (new E).set_var(x);
107 | }
108 | )
109 | };
110 |
111 | };
112 |
113 | class D inherits B {
114 |
115 | method7(num : Int) : Bool { -- divisible by 3
116 | (let x : Int <- num in
117 | if x < 0 then method7(~x) else
118 | if 0 = x then true else
119 | if 1 = x then false else
120 | if 2 = x then false else
121 | method7(x - 3)
122 | fi fi fi fi
123 | )
124 | };
125 |
126 | };
127 |
128 | class E inherits D {
129 |
130 | method6(num : Int) : A { -- division
131 | (let x : Int in
132 | {
133 | x <- num / 8;
134 | (new A).set_var(x);
135 | }
136 | )
137 | };
138 |
139 | };
140 |
141 | (* The following code is from atoi.cl in ~cs164/examples *)
142 |
143 | (*
144 | The class A2I provides integer-to-string and string-to-integer
145 | conversion routines. To use these routines, either inherit them
146 | in the class where needed, have a dummy variable bound to
147 | something of type A2I, or simpl write (new A2I).method(argument).
148 | *)
149 |
150 |
151 | (*
152 | c2i Converts a 1-character string to an integer. Aborts
153 | if the string is not "0" through "9"
154 | *)
155 | class A2I {
156 |
157 | c2i(char : String) : Int {
158 | if char = "0" then 0 else
159 | if char = "1" then 1 else
160 | if char = "2" then 2 else
161 | if char = "3" then 3 else
162 | if char = "4" then 4 else
163 | if char = "5" then 5 else
164 | if char = "6" then 6 else
165 | if char = "7" then 7 else
166 | if char = "8" then 8 else
167 | if char = "9" then 9 else
168 | { abort(); 0; } (* the 0 is needed to satisfy the
169 | typchecker *)
170 | fi fi fi fi fi fi fi fi fi fi
171 | };
172 |
173 | (*
174 | i2c is the inverse of c2i.
175 | *)
176 | i2c(i : Int) : String {
177 | if i = 0 then "0" else
178 | if i = 1 then "1" else
179 | if i = 2 then "2" else
180 | if i = 3 then "3" else
181 | if i = 4 then "4" else
182 | if i = 5 then "5" else
183 | if i = 6 then "6" else
184 | if i = 7 then "7" else
185 | if i = 8 then "8" else
186 | if i = 9 then "9" else
187 | { abort(); ""; } -- the "" is needed to satisfy the typchecker
188 | fi fi fi fi fi fi fi fi fi fi
189 | };
190 |
191 | (*
192 | a2i converts an ASCII string into an integer. The empty string
193 | is converted to 0. Signed and unsigned strings are handled. The
194 | method aborts if the string does not represent an integer. Very
195 | long strings of digits produce strange answers because of arithmetic
196 | overflow.
197 |
198 | *)
199 | a2i(s : String) : Int {
200 | if s.length() = 0 then 0 else
201 | if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else
202 | if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else
203 | a2i_aux(s)
204 | fi fi fi
205 | };
206 |
207 | (* a2i_aux converts the usigned portion of the string. As a
208 | programming example, this method is written iteratively. *)
209 |
210 |
211 | a2i_aux(s : String) : Int {
212 | (let int : Int <- 0 in
213 | {
214 | (let j : Int <- s.length() in
215 | (let i : Int <- 0 in
216 | while i < j loop
217 | {
218 | int <- int * 10 + c2i(s.substr(i,1));
219 | i <- i + 1;
220 | }
221 | pool
222 | )
223 | );
224 | int;
225 | }
226 | )
227 | };
228 |
229 | (* i2a converts an integer to a string. Positive and negative
230 | numbers are handled correctly. *)
231 |
232 | i2a(i : Int) : String {
233 | if i = 0 then "0" else
234 | if 0 < i then i2a_aux(i) else
235 | "-".concat(i2a_aux(i * ~1))
236 | fi fi
237 | };
238 |
239 | (* i2a_aux is an example using recursion. *)
240 |
241 | i2a_aux(i : Int) : String {
242 | if i = 0 then "" else
243 | (let next : Int <- i / 10 in
244 | i2a_aux(next).concat(i2c(i - next * 10))
245 | )
246 | fi
247 | };
248 |
249 | };
250 |
251 | class Main inherits IO {
252 |
253 | char : String;
254 | avar : A;
255 | a_var : A;
256 | flag : Bool <- true;
257 |
258 |
259 | menu() : String {
260 | {
261 | out_string("\n\tTo add a number to ");
262 | print(avar);
263 | out_string("...enter a:\n");
264 | out_string("\tTo negate ");
265 | print(avar);
266 | out_string("...enter b:\n");
267 | out_string("\tTo find the difference between ");
268 | print(avar);
269 | out_string("and another number...enter c:\n");
270 | out_string("\tTo find the factorial of ");
271 | print(avar);
272 | out_string("...enter d:\n");
273 | out_string("\tTo square ");
274 | print(avar);
275 | out_string("...enter e:\n");
276 | out_string("\tTo cube ");
277 | print(avar);
278 | out_string("...enter f:\n");
279 | out_string("\tTo find out if ");
280 | print(avar);
281 | out_string("is a multiple of 3...enter g:\n");
282 | out_string("\tTo divide ");
283 | print(avar);
284 | out_string("by 8...enter h:\n");
285 | out_string("\tTo get a new number...enter j:\n");
286 | out_string("\tTo quit...enter q:\n\n");
287 | in_string();
288 | }
289 | };
290 |
291 | prompt() : String {
292 | {
293 | out_string("\n");
294 | out_string("Please enter a number... ");
295 | in_string();
296 | }
297 | };
298 |
299 | get_int() : Int {
300 | {
301 | (let z : A2I <- new A2I in
302 | (let s : String <- prompt() in
303 | z.a2i(s)
304 | )
305 | );
306 | }
307 | };
308 |
309 | is_even(num : Int) : Bool {
310 | (let x : Int <- num in
311 | if x < 0 then is_even(~x) else
312 | if 0 = x then true else
313 | if 1 = x then false else
314 | is_even(x - 2)
315 | fi fi fi
316 | )
317 | };
318 |
319 | class_type(var : A) : SELF_TYPE {
320 | case var of
321 | a : A => out_string("Class type is now A\n");
322 | b : B => out_string("Class type is now B\n");
323 | c : C => out_string("Class type is now C\n");
324 | d : D => out_string("Class type is now D\n");
325 | e : E => out_string("Class type is now E\n");
326 | o : Object => out_string("Oooops\n");
327 | esac
328 | };
329 |
330 | print(var : A) : SELF_TYPE {
331 | (let z : A2I <- new A2I in
332 | {
333 | out_string(z.i2a(var.value()));
334 | out_string(" ");
335 | }
336 | )
337 | };
338 |
339 | main() : Object {
340 | {
341 | avar <- (new A);
342 | while flag loop
343 | {
344 | -- avar <- (new A).set_var(get_int());
345 | out_string("number ");
346 | print(avar);
347 | if is_even(avar.value()) then
348 | out_string("is even!\n")
349 | else
350 | out_string("is odd!\n")
351 | fi;
352 | -- print(avar); -- prints out answer
353 | class_type(avar);
354 | char <- menu();
355 | if char = "a" then -- add
356 | {
357 | a_var <- (new A).set_var(get_int());
358 | avar <- (new B).method2(avar.value(), a_var.value());
359 | } else
360 | if char = "b" then -- negate
361 | case avar of
362 | c : C => avar <- c.method6(c.value());
363 | a : A => avar <- a.method3(a.value());
364 | o : Object => {
365 | out_string("Oooops\n");
366 | abort(); 0;
367 | };
368 | esac else
369 | if char = "c" then -- diff
370 | {
371 | a_var <- (new A).set_var(get_int());
372 | avar <- (new D).method4(avar.value(), a_var.value());
373 | } else
374 | if char = "d" then avar <- (new C)@A.method5(avar.value()) else
375 | -- factorial
376 | if char = "e" then avar <- (new C)@B.method5(avar.value()) else
377 | -- square
378 | if char = "f" then avar <- (new C)@C.method5(avar.value()) else
379 | -- cube
380 | if char = "g" then -- multiple of 3?
381 | if ((new D).method7(avar.value()))
382 | then -- avar <- (new A).method1(avar.value())
383 | {
384 | out_string("number ");
385 | print(avar);
386 | out_string("is divisible by 3.\n");
387 | }
388 | else -- avar <- (new A).set_var(0)
389 | {
390 | out_string("number ");
391 | print(avar);
392 | out_string("is not divisible by 3.\n");
393 | }
394 | fi else
395 | if char = "h" then
396 | (let x : A in
397 | {
398 | x <- (new E).method6(avar.value());
399 | (let r : Int <- (avar.value() - (x.value() * 8)) in
400 | {
401 | out_string("number ");
402 | print(avar);
403 | out_string("is equal to ");
404 | print(x);
405 | out_string("times 8 with a remainder of ");
406 | (let a : A2I <- new A2I in
407 | {
408 | out_string(a.i2a(r));
409 | out_string("\n");
410 | }
411 | ); -- end let a:
412 | }
413 | ); -- end let r:
414 | avar <- x;
415 | }
416 | ) -- end let x:
417 | else
418 | if char = "j" then avar <- (new A)
419 | else
420 | if char = "q" then flag <- false
421 | else
422 | avar <- (new A).method1(avar.value()) -- divide/8
423 | fi fi fi fi fi fi fi fi fi fi;
424 | }
425 | pool;
426 | }
427 | };
428 |
429 | };
430 |
431 |
--------------------------------------------------------------------------------
/src/semantic/semantic.py:
--------------------------------------------------------------------------------
1 | from collections import defaultdict
2 | from copy import deepcopy
3 |
4 | from ..syntactic.ast import *
5 |
6 | from myexceptions import (
7 | UndefinedMethodError, ReturnedTypeError,
8 | NumberOfArgumentError, RedefinedMethodError, RedefinedAttributeError,
9 | UndefinedParentError, ClassAlreadyDefinedError, InheritanceError,
10 | ArgumentTypeError, DeclaredTypeError, AttributeTypeError,
11 | TypeCheckError, ConditionStatementError, ArithmeticError, AssignError,
12 | EqualTypeCheckError, EqualCheckError
13 | )
14 | from scope import Scope
15 | from checktype import (
16 | get_expression_type, returned_type, isAttribute, isMethod
17 | )
18 |
19 |
20 | class Semant(object):
21 | """ Analyzes semantically the code. """
22 |
23 | def __init__(self, ast):
24 | self.ast = ast
25 | self.classes = {}
26 | self.parents = defaultdict(set)
27 | self.scope = Scope()
28 |
29 | def build(self):
30 | self.__create_default_classes()
31 | self.__create_symbol_tables()
32 | self.__check_undefined_classes()
33 | self.__check_inheritance_cycles()
34 | self.__check_inheritence_and_add_methods_in_children()
35 |
36 | for _class in self.classes.keys():
37 | self.__check_scope_and_type(self.classes[_class])
38 |
39 | def __create_default_classes(self):
40 | # Object there is no parent
41 | objc = Class("Object", None, [
42 | Method('abort', [], 'Object', None),
43 | Method('type_name', [], 'String', None),
44 | Method('copy', [], 'SELF_TYPE', None),
45 | ])
46 | # IO inherits from Object
47 | ioc = Class("IO", "Object", [
48 | Method('out_string', [('arg', 'String')], 'SELF_TYPE', None),
49 | Method('out_int', [('arg', 'Int')], 'SELF_TYPE', None),
50 | Method('in_string', [], 'String', None),
51 | Method('in_int', [], 'Int', None),
52 | ])
53 | # Interge inherits from Object
54 | intc = Class("Int", "Object", [
55 | Attr('variable', 'Int', Int(content=0))
56 | ])
57 | # String inherits from Object
58 | stringc = Class("String", "Object", [
59 | Method('length', [], 'Int', None),
60 | Method('concat', [('arg', 'String')], 'String', None),
61 | Method(
62 | 'substr', [('arg1', 'Int'), ('arg2', 'Int')], 'String', None
63 | ),
64 | ])
65 | # Boolean inherits from Object
66 | boolc = Class("Bool", "Object", [
67 | Attr('variable', 'Bool', Bool(content=False))
68 | ])
69 |
70 | self.ast += [objc, ioc, intc, stringc, boolc]
71 |
72 | def __create_symbol_tables(self):
73 | """
74 | Create two tables:
75 | One with all the classes and another with all
76 | parents classes.
77 | """
78 | for _class in self.ast:
79 | if _class.name in self.classes:
80 | raise ClassAlreadyDefinedError(_class.name)
81 |
82 | else:
83 | self.classes[_class.name] = _class
84 |
85 | if _class.name != 'Object':
86 | self.parents[_class.parent].add(_class.name)
87 |
88 | def __check_undefined_classes(self):
89 | """
90 | Check if every parent is defined in classes table. (self.classes)
91 | """
92 | parents = self.parents.keys()
93 |
94 | for parent in parents:
95 | if parent not in self.classes:
96 | class_name = self.parents[parent]
97 | raise UndefinedParentError(class_name, parent)
98 |
99 | def __check_inheritance_cycles(self):
100 | """
101 | Check if every class has your right parent and children.
102 |
103 | First, set every class(including parents) as False.
104 | Then, visit each class and their children.
105 | """
106 | visited = {}
107 | for parent_name in self.parents.keys():
108 | visited[parent_name] = False
109 | for child_name in self.parents[parent_name]:
110 | visited[child_name] = False
111 |
112 | # Visit every class, recursively, starting with Object
113 | self.__visit_tree('Object', visited)
114 |
115 | # If some class has False value, means that the visitor
116 | # couldn't get in that class. So, some class is missing.
117 | for key, value in visited.items():
118 | if not value:
119 | raise InheritanceError(key)
120 |
121 | def __visit_tree(self, _class, visited):
122 | visited[_class] = True
123 |
124 | # If a _class is not in parents,
125 | # it is not a parent, so, don't have children. Get out.
126 | if _class not in self.parents.keys():
127 | return
128 |
129 | for child in self.parents[_class]:
130 | self.__visit_tree(child, visited)
131 |
132 | def __check_inheritence_and_add_methods_in_children(self, _class='Object'):
133 | """
134 | Check attributes and methods from inheritance and
135 | if it is ok, add them from parent to child.
136 | """
137 | cl = self.classes[_class]
138 |
139 | if cl.parent:
140 | _class_parent = self.classes[cl.parent]
141 |
142 | attrs_of_parent = self.__get_attributes(_class_parent)
143 | attrs_of_child = self.__get_attributes(cl)
144 |
145 | self.__check_same_attribute(
146 | attrs_of_parent, attrs_of_child, _class
147 | )
148 |
149 | methods_of_parent = self.__get_methods(_class_parent)
150 | methods_of_child = self.__get_methods(cl)
151 |
152 | method_signatures_of_parent = self.__get_signatures(
153 | methods_of_parent
154 | )
155 | method_signatures_of_child = self.__get_signatures(
156 | methods_of_child
157 | )
158 |
159 | self.__check_same_signature(
160 | methods_of_child,
161 | method_signatures_of_parent,
162 | method_signatures_of_child
163 | )
164 |
165 | self.__add_method_from_parent_to_child(
166 | cl, methods_of_parent, methods_of_child
167 | )
168 |
169 | self.__add_attr_from_parent_to_child(cl, attrs_of_parent)
170 |
171 | # Goes recursively to all children
172 | all_children = self.parents[_class]
173 | for child in all_children:
174 | self.__check_inheritence_and_add_methods_in_children(child)
175 |
176 | def __get_attributes(self, _class):
177 | return [i for i in _class.feature_list if isAttribute(i)]
178 |
179 | def __check_same_attribute(self, parent, child, _class):
180 | """
181 | It's illegal to redefine attribute names in child class.
182 | """
183 | for p_attr in parent:
184 | for c_attr in child:
185 | if p_attr.name == c_attr.name:
186 | raise RedefinedAttributeError(_class)
187 |
188 | def __get_methods(self, _class):
189 | return [i for i in _class.feature_list if isMethod(i)]
190 |
191 | def __get_signatures(self, methods):
192 | method_signatures = {}
193 | for method in methods:
194 | method_signatures[method.name] = {}
195 | for formal in method.formal_list:
196 | # formal is a tuple that has 2 values:
197 | # The first one is the name of the argument;
198 | # The second, is the type of the argument (Int, Bool,...)
199 | method_signatures[method.name][formal[0]] = formal[1]
200 | method_signatures[method.name]['return'] = method.return_type
201 | return method_signatures
202 |
203 | def __check_same_signature(self, child_methods, sig_parent, sig_child):
204 | """
205 | If a class "B" inherits a method "m" from an ancestor class "A",
206 | then "B" may override the inherited definition of "m" provided
207 | the number of arguments, the types of the formal parameters,
208 | and the return type are exactly the same in both definitions.
209 | """
210 | for method in child_methods:
211 | if method.name in sig_parent:
212 | parent_signature = sig_parent[method.name]
213 | child_signature = sig_child[method.name]
214 |
215 | if parent_signature != child_signature:
216 | raise RedefinedMethodError(method.name)
217 |
218 | def __add_method_from_parent_to_child(self, _cl, p_methods, c_methods):
219 | for method in p_methods:
220 | if method.name not in c_methods:
221 | copied_method = deepcopy(method)
222 | # Add at the beginning
223 | _cl.feature_list.insert(0, copied_method)
224 |
225 | def __add_attr_from_parent_to_child(self, _cl, attrs_of_parent):
226 | for attr in attrs_of_parent:
227 | # Add at the beginning
228 | _cl.feature_list.insert(0, deepcopy(attr))
229 |
230 | def __check_scope_and_type(self, _class):
231 | """
232 | Check scope and type for each class.
233 |
234 | If it's a method, goes recursively inside the body.
235 |
236 | When a scope is created?
237 | With a new block, let, case,
238 |
239 | OBS: Every attribute is protected and every method is public.
240 | """
241 |
242 | for feature in _class.feature_list:
243 | _type = returned_type(feature, _class)
244 |
245 | if isAttribute(feature):
246 | value_type = get_expression_type(
247 | feature.body, _class, self.scope
248 | )
249 |
250 | if not value_type:
251 | # If value_type is None, means that feature.body is
252 | # a complex expression, need to be checked.
253 | self.__check_children(feature.body, _class)
254 |
255 | # Test if the attribute value type is the same as declared.
256 | if feature.type != value_type:
257 | raise AttributeTypeError(feature, value_type)
258 |
259 | self.scope.add(feature.name, _type)
260 |
261 | elif isMethod(feature):
262 | self.scope.add(feature.name, _type)
263 |
264 | # Add arguments to scope. name:type
265 | for formal in feature.formal_list:
266 | self.scope.add(formal[0], formal[1])
267 |
268 | self.__check_children(feature.body, _class)
269 |
270 | def __check_children(self, expression, _class):
271 | if isinstance(expression, Block):
272 | self.scope.new()
273 |
274 | for expr in expression.body:
275 | self.__check_children(expr, _class)
276 |
277 | self.scope.destroy()
278 |
279 | elif isinstance(expression, Dispatch):
280 | self.__check_children(expression.body, _class)
281 |
282 | # Get return type
283 | if expression.body == 'self':
284 | _class_name = _class.name
285 | else:
286 | try:
287 | _class_name = expression.body.return_type
288 | except AttributeError:
289 | # If the expression is an Object and there is no
290 | # return_type variable, so, need get the type.
291 | _class_name = get_expression_type(
292 | expression.body, _class, self.scope
293 | )
294 |
295 | # Get the whole class' structure
296 | _class_content = self.classes[_class_name]
297 |
298 | called_method = False
299 |
300 | # Parse the structure untill match the method name
301 | for feature in _class_content.feature_list:
302 | if isMethod(feature) and feature.name == expression.method:
303 | called_method = True
304 |
305 | if len(feature.formal_list) != len(expression.expr_list):
306 | raise NumberOfArgumentError(feature.name, _class_name)
307 |
308 | formals = zip(
309 | feature.formal_list, expression.expr_list,
310 | )
311 |
312 | # Test if the arguments types are not equals
313 | for feat, called in formals:
314 | expression_type = get_expression_type(
315 | called, _class, self.scope
316 | )
317 | # feat[0] is the name and feat[1] the type
318 | if feat[1] != expression_type:
319 | raise ArgumentTypeError(feature, _class_name)
320 |
321 | # For default, the method returns the host class. SELF_TYPE
322 | last_type = _class_name
323 |
324 | feature_type = returned_type(feature, _class)
325 |
326 | # If exists a body, means that exists one or more
327 | # expressions inside the method.
328 | if feature.body:
329 | try:
330 | # If have a Block, must look the last expression,
331 | # because it is the type that will be returned.
332 | last_expression = feature.body.body[-1]
333 | except AttributeError:
334 | last_expression = feature.body
335 |
336 | last_type = get_expression_type(
337 | last_expression, _class, self.scope
338 | )
339 |
340 | # If the returns types are not equals, raise an error
341 | if feature_type != last_type:
342 | raise ReturnedTypeError(
343 | feature.name, _class_name, feature_type, last_type
344 | )
345 |
346 | # If didn't match the method name...
347 | if not called_method:
348 | raise UndefinedMethodError(expression.method, _class_name)
349 |
350 | elif isinstance(expression, Let):
351 | self.scope.new()
352 | self.scope.add(expression.object, expression.type)
353 |
354 | # Test if the declared type is the same type as
355 | # the given value
356 | value_type = get_expression_type(
357 | expression.init, _class, self.scope
358 | )
359 | if expression.type != value_type:
360 | raise DeclaredTypeError(expression.type, value_type)
361 |
362 | self.__check_children(expression.body, _class)
363 |
364 | self.scope.destroy()
365 |
366 | elif isinstance(expression, While):
367 | self.__check_children(expression.predicate, _class)
368 | self.__check_children(expression.body, _class)
369 | # If the methods above did not raise an error, means that
370 | # the body's type is Int or an Object.
371 | # If is an Object and the root type is not a Bool,
372 | # must raise an error.
373 | self.__raise_if_not_bool(expression, _class, 'While')
374 |
375 | elif isinstance(expression, Lt) or isinstance(expression, Le):
376 | first_type, second_type = self.__get_params_types(
377 | expression, _class
378 | )
379 |
380 | if first_type != 'Int' or second_type != 'Int':
381 | raise TypeCheckError(first_type, second_type, _class)
382 |
383 | elif isinstance(expression, Eq):
384 | """
385 | The comparison = is a special case.
386 | If either or has static type Int, Bool,
387 | or String, then the other must have the same static type.
388 | """
389 | first_type, second_type = self.__get_params_types(
390 | expression, _class
391 | )
392 | types = ['String', 'Int', 'Bool']
393 | if first_type not in types or second_type not in types:
394 | raise EqualTypeCheckError(first_type, second_type, _class)
395 |
396 | if first_type != second_type:
397 | raise EqualCheckError(first_type, second_type, _class)
398 |
399 | elif any(isinstance(expression, X) for X in [Plus, Sub, Mult, Div]):
400 | """
401 | The static types of the two sub-expressions must be Int.
402 |
403 | Cool has only integer division.
404 | """
405 | first_type, second_type = self.__get_params_types(
406 | expression, _class
407 | )
408 |
409 | if first_type != 'Int' or second_type != 'Int':
410 | raise ArithmeticError(first_type, second_type, _class)
411 |
412 | elif isinstance(expression, Assign):
413 | self.__check_children(expression.body, _class)
414 | # If the method above did not raise an error, means that
415 | # the body type is Int. Just need to test name type now.
416 | name_type = get_expression_type(
417 | expression.name, _class, self.scope
418 | )
419 |
420 | if name_type != 'Int':
421 | raise AssignError(name_type, 'Int', _class)
422 |
423 | elif isinstance(expression, If):
424 | self.__check_children(expression.predicate, _class)
425 | self.__check_children(expression.then_body, _class)
426 | self.__check_children(expression.else_body, _class)
427 | # If the methods above did not raise an error, means that
428 | # the body type is Int or an Object.
429 | # If is an Object and the root type is not a Bool,
430 | # must raise an error.
431 | self.__raise_if_not_bool(expression, _class, 'If')
432 |
433 | def __raise_if_not_bool(self, expression, _class, statement):
434 | if isinstance(expression.predicate, Object):
435 | obj_type = get_expression_type(
436 | expression.predicate, _class, self.scope
437 | )
438 | if obj_type != 'Bool':
439 | raise ConditionStatementError(statement, obj_type, _class)
440 |
441 | def __get_params_types(self, expression, _class):
442 | first_type = get_expression_type(
443 | expression.first, _class, self.scope
444 | )
445 | second_type = get_expression_type(
446 | expression.second, _class, self.scope
447 | )
448 | return first_type, second_type
449 |
--------------------------------------------------------------------------------
/static/css/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700");/*!
2 | * bootswatch v3.3.6
3 | * Homepage: http://bootswatch.com
4 | * Copyright 2012-2015 Thomas Park
5 | * Licensed under MIT
6 | * Based on Bootstrap
7 | *//*!
8 | * Bootstrap v3.3.6 (http://getbootstrap.com)
9 | * Copyright 2011-2015 Twitter, Inc.
10 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.846;color:#666666;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2196f3;text-decoration:none}a:hover,a:focus{color:#0a6ebd;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:23px;margin-bottom:23px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:#444444}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#bbbbbb}h1,.h1,h2,.h2,h3,.h3{margin-top:23px;margin-bottom:11.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:11.5px;margin-bottom:11.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:56px}h2,.h2{font-size:45px}h3,.h3{font-size:34px}h4,.h4{font-size:24px}h5,.h5{font-size:20px}h6,.h6{font-size:14px}p{margin:0 0 11.5px}.lead{margin-bottom:23px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#ffe0b2;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#bbbbbb}.text-primary{color:#2196f3}a.text-primary:hover,a.text-primary:focus{color:#0c7cd5}.text-success{color:#4caf50}a.text-success:hover,a.text-success:focus{color:#3d8b40}.text-info{color:#9c27b0}a.text-info:hover,a.text-info:focus{color:#771e86}.text-warning{color:#ff9800}a.text-warning:hover,a.text-warning:focus{color:#cc7a00}.text-danger{color:#e51c23}a.text-danger:hover,a.text-danger:focus{color:#b9151b}.bg-primary{color:#fff;background-color:#2196f3}a.bg-primary:hover,a.bg-primary:focus{background-color:#0c7cd5}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#e1bee7}a.bg-info:hover,a.bg-info:focus{background-color:#d099d9}.bg-warning{background-color:#ffe0b2}a.bg-warning:hover,a.bg-warning:focus{background-color:#ffcb7f}.bg-danger{background-color:#f9bdbb}a.bg-danger:hover,a.bg-danger:focus{background-color:#f5908c}.page-header{padding-bottom:10.5px;margin:46px 0 23px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:11.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:23px}dt,dd{line-height:1.846}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #bbbbbb}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11.5px 23px;margin:0 0 23px;font-size:16.25px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.846;color:#bbbbbb}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:23px;font-style:normal;line-height:1.846}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:11px;margin:0 0 11.5px;font-size:12px;line-height:1.846;word-break:break-all;word-wrap:break-word;color:#212121;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:3px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#bbbbbb;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:23px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.846;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#e1bee7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#d8abe0}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#ffe0b2}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ffd699}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f9bdbb}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#f7a6a4}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:17.25px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:23px;font-size:19.5px;line-height:inherit;color:#212121;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.846;color:#666666}.form-control{display:block;width:100%;height:37px;padding:6px 16px;font-size:13px;line-height:1.846;color:#666666;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#bbbbbb;opacity:1}.form-control:-ms-input-placeholder{color:#bbbbbb}.form-control::-webkit-input-placeholder{color:#bbbbbb}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:transparent;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:37px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:23px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:35px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.form-group-lg select.form-control{height:45px;line-height:45px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:45px;min-height:40px;padding:11px 16px;font-size:17px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:46.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:37px;height:37px;line-height:37px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#4caf50}.has-success .form-control{border-color:#4caf50;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#3d8b40;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94}.has-success .input-group-addon{color:#4caf50;border-color:#4caf50;background-color:#dff0d8}.has-success .form-control-feedback{color:#4caf50}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ff9800}.has-warning .form-control{border-color:#ff9800;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#cc7a00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166}.has-warning .input-group-addon{color:#ff9800;border-color:#ff9800;background-color:#ffe0b2}.has-warning .form-control-feedback{color:#ff9800}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#e51c23}.has-error .form-control{border-color:#e51c23;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#b9151b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c}.has-error .input-group-addon{color:#e51c23;border-color:#e51c23;background-color:#f9bdbb}.has-error .form-control-feedback{color:#e51c23}.has-feedback label~.form-control-feedback{top:28px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a6a6a6}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.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:17px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 16px;font-size:13px;line-height:1.846;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#444444;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#444444;background-color:#ffffff;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:hover{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#444444;background-color:#d4d4d4;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#ffffff;border-color:transparent}.btn-default .badge{color:#ffffff;background-color:#444444}.btn-primary{color:#ffffff;background-color:#2196f3;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:hover{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#0a68b4;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#2196f3;border-color:transparent}.btn-primary .badge{color:#2196f3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#4caf50;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:hover{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#327334;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#4caf50;border-color:transparent}.btn-success .badge{color:#4caf50;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9c27b0;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:hover{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#5d1769;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#9c27b0;border-color:transparent}.btn-info .badge{color:#9c27b0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff9800;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:hover{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a86400;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#ff9800;border-color:transparent}.btn-warning .badge{color:#ff9800;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e51c23;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:hover{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#991216;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#e51c23;border-color:transparent}.btn-danger .badge{color:#e51c23;background-color:#ffffff}.btn-link{color:#2196f3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0a6ebd;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#bbbbbb;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.846;color:#666666;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#141414;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2196f3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#bbbbbb}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.846;color:#bbbbbb;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .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:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 16px;font-size:13px;font-weight:normal;line-height:1;color:#666666;text-align:center;background-color:transparent;border:1px solid transparent;border-radius:3px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#bbbbbb}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#bbbbbb;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#2196f3}.nav .nav-divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.846;border:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#666666;background-color:transparent;border:1px solid transparent;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:3px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2196f3}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:64px;margin-bottom:23px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:3px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20.5px 15px;font-size:17px;line-height:23px;height:64px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15px;margin-bottom:15px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:10.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:23px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:23px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:20.5px;padding-bottom:20.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:13.5px;margin-bottom:13.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:13.5px;margin-bottom:13.5px}.navbar-btn.btn-sm{margin-top:17px;margin-bottom:17px}.navbar-btn.btn-xs{margin-top:21px;margin-bottom:21px}.navbar-text{margin-top:20.5px;margin-bottom:20.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:transparent}.navbar-default .navbar-brand{color:#666666}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#212121;background-color:transparent}.navbar-default .navbar-text{color:#bbbbbb}.navbar-default .navbar-nav>li>a{color:#666666}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#212121}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#666666}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#666666}.navbar-default .navbar-link:hover{color:#212121}.navbar-default .btn-link{color:#666666}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#212121}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2196f3;border-color:transparent}.navbar-inverse .navbar-brand{color:#b2dbfb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#bbbbbb}.navbar-inverse .navbar-nav>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#0c84e4}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#0c7cd5;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#b2dbfb}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#b2dbfb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:23px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#bbbbbb}.pagination{display:inline-block;padding-left:0;margin:23px 0;border-radius:3px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 16px;line-height:1.846;text-decoration:none;color:#2196f3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#0a6ebd;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#ffffff;background-color:#2196f3;border-color:#2196f3;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#bbbbbb;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:23px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#bbbbbb;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#bbbbbb}.label-default[href]:hover,.label-default[href]:focus{background-color:#a2a2a2}.label-primary{background-color:#2196f3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#0c7cd5}.label-success{background-color:#4caf50}.label-success[href]:hover,.label-success[href]:focus{background-color:#3d8b40}.label-info{background-color:#9c27b0}.label-info[href]:hover,.label-info[href]:focus{background-color:#771e86}.label-warning{background-color:#ff9800}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc7a00}.label-danger{background-color:#e51c23}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#b9151b}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#bbbbbb;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2196f3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f9f9f9}.jumbotron h1,.jumbotron .h1{color:#444444}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#e0e0e0}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:59px}}.thumbnail{display:block;padding:4px;margin-bottom:23px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2196f3}.thumbnail .caption{padding:9px;color:#666666}.alert{padding:15px;margin-bottom:23px;border:1px solid transparent;border-radius:3px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#4caf50}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#3d8b40}.alert-info{background-color:#e1bee7;border-color:#cba4dd;color:#9c27b0}.alert-info hr{border-top-color:#c191d6}.alert-info .alert-link{color:#771e86}.alert-warning{background-color:#ffe0b2;border-color:#ffc599;color:#ff9800}.alert-warning hr{border-top-color:#ffb67f}.alert-warning .alert-link{color:#cc7a00}.alert-danger{background-color:#f9bdbb;border-color:#f7a4af;color:#e51c23}.alert-danger hr{border-top-color:#f58c9a}.alert-danger .alert-link{color:#b9151b}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:23px;margin-bottom:23px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:23px;color:#ffffff;text-align:center;background-color:#2196f3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4caf50}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9c27b0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff9800}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e51c23}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#bbbbbb;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#bbbbbb}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2196f3;border-color:#2196f3}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e3f2fd}.list-group-item-success{color:#4caf50;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#4caf50}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:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#4caf50;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#4caf50;border-color:#4caf50}.list-group-item-info{color:#9c27b0;background-color:#e1bee7}a.list-group-item-info,button.list-group-item-info{color:#9c27b0}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:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#9c27b0;background-color:#d8abe0}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#9c27b0;border-color:#9c27b0}.list-group-item-warning{color:#ff9800;background-color:#ffe0b2}a.list-group-item-warning,button.list-group-item-warning{color:#ff9800}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:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ff9800;background-color:#ffd699}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ff9800;border-color:#ff9800}.list-group-item-danger{color:#e51c23;background-color:#f9bdbb}a.list-group-item-danger,button.list-group-item-danger{color:#e51c23}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:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#e51c23;background-color:#f7a6a4}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#e51c23;border-color:#e51c23}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:23px;background-color:#ffffff;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:2px;border-top-left-radius:2px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.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:2px;border-bottom-left-radius:2px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:23px}.panel-group .panel{margin-bottom:0;border-radius:3px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#212121;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#212121}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2196f3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2196f3;border-color:#2196f3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2196f3}.panel-primary>.panel-heading .badge{color:#2196f3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2196f3}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#ffffff;background-color:#4caf50;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#4caf50;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#cba4dd}.panel-info>.panel-heading{color:#ffffff;background-color:#9c27b0;border-color:#cba4dd}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#cba4dd}.panel-info>.panel-heading .badge{color:#9c27b0;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#cba4dd}.panel-warning{border-color:#ffc599}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff9800;border-color:#ffc599}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffc599}.panel-warning>.panel-heading .badge{color:#ff9800;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffc599}.panel-danger{border-color:#f7a4af}.panel-danger>.panel-heading{color:#ffffff;background-color:#e51c23;border-color:#f7a4af}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f7a4af}.panel-danger>.panel-heading .badge{color:#e51c23;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f7a4af}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f9f9f9;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:normal;line-height:1;color:#000000;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid transparent}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.846}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid transparent}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#727272;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#727272}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#727272}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,0);border-top-color:rgba(0,0,0,0.075);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0.075)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0.075);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,0);border-left-color:rgba(0,0,0,0.075)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-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{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.3);box-shadow:0 1px 2px rgba(0,0,0,0.3)}.navbar-brand{font-size:24px}.navbar-inverse .navbar-form input[type=text],.navbar-inverse .navbar-form input[type=password]{color:#fff;-webkit-box-shadow:inset 0 -1px 0 #b2dbfb;box-shadow:inset 0 -1px 0 #b2dbfb}.navbar-inverse .navbar-form input[type=text]::-moz-placeholder,.navbar-inverse .navbar-form input[type=password]::-moz-placeholder{color:#b2dbfb;opacity:1}.navbar-inverse .navbar-form input[type=text]:-ms-input-placeholder,.navbar-inverse .navbar-form input[type=password]:-ms-input-placeholder{color:#b2dbfb}.navbar-inverse .navbar-form input[type=text]::-webkit-input-placeholder,.navbar-inverse .navbar-form input[type=password]::-webkit-input-placeholder{color:#b2dbfb}.navbar-inverse .navbar-form input[type=text]:focus,.navbar-inverse .navbar-form input[type=password]:focus{-webkit-box-shadow:inset 0 -2px 0 #fff;box-shadow:inset 0 -2px 0 #fff}.btn-default{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-default:focus{background-color:#ffffff}.btn-default:hover,.btn-default:active:hover{background-color:#f0f0f0}.btn-default:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-primary{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-primary:focus{background-color:#2196f3}.btn-primary:hover,.btn-primary:active:hover{background-color:#0d87e9}.btn-primary:active{background-color:#0b76cc;background-image:-webkit-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:-o-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-success{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-success:focus{background-color:#4caf50}.btn-success:hover,.btn-success:active:hover{background-color:#439a46}.btn-success:active{background-color:#39843c;background-image:-webkit-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:-o-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:radial-gradient(circle, #39843c 10%, #4caf50 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-info{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-info:focus{background-color:#9c27b0}.btn-info:hover,.btn-info:active:hover{background-color:#862197}.btn-info:active{background-color:#701c7e;background-image:-webkit-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:-o-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-warning{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-warning:focus{background-color:#ff9800}.btn-warning:hover,.btn-warning:active:hover{background-color:#e08600}.btn-warning:active{background-color:#c27400;background-image:-webkit-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:-o-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:radial-gradient(circle, #c27400 10%, #ff9800 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-danger{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-danger:focus{background-color:#e51c23}.btn-danger:hover,.btn-danger:active:hover{background-color:#cb171e}.btn-danger:active{background-color:#b0141a;background-image:-webkit-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:-o-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-link{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-link:focus{background-color:#ffffff}.btn-link:hover,.btn-link:active:hover{background-color:#f0f0f0}.btn-link:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn{text-transform:uppercase;border:none;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.4);box-shadow:1px 1px 4px rgba(0,0,0,0.4);-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s}.btn-link{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#444444}.btn-link:hover,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none;color:#444444;text-decoration:none}.btn-default.disabled{background-color:rgba(0,0,0,0.1);color:rgba(0,0,0,0.4);opacity:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.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:0}body{-webkit-font-smoothing:antialiased;letter-spacing:.1px}p{margin:0 0 1em}input,button{-webkit-font-smoothing:antialiased;letter-spacing:.1px}a{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.table-hover>tbody>tr,.table-hover>tbody>tr>th,.table-hover>tbody>tr>td{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}label{font-weight:normal}textarea,textarea.form-control,input.form-control,input[type=text],input[type=password],input[type=email],input[type=number],[type=text].form-control,[type=password].form-control,[type=email].form-control,[type=tel].form-control,[contenteditable].form-control{padding:0;border:none;border-radius:0;-webkit-appearance:none;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px}textarea:focus,textarea.form-control:focus,input.form-control:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=number]:focus,[type=text].form-control:focus,[type=password].form-control:focus,[type=email].form-control:focus,[type=tel].form-control:focus,[contenteditable].form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3}textarea[disabled],textarea.form-control[disabled],input.form-control[disabled],input[type=text][disabled],input[type=password][disabled],input[type=email][disabled],input[type=number][disabled],[type=text].form-control[disabled],[type=password].form-control[disabled],[type=email].form-control[disabled],[type=tel].form-control[disabled],[contenteditable].form-control[disabled],textarea[readonly],textarea.form-control[readonly],input.form-control[readonly],input[type=text][readonly],input[type=password][readonly],input[type=email][readonly],input[type=number][readonly],[type=text].form-control[readonly],[type=password].form-control[readonly],[type=email].form-control[readonly],[type=tel].form-control[readonly],[contenteditable].form-control[readonly]{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px dotted #ddd}textarea.input-sm,textarea.form-control.input-sm,input.form-control.input-sm,input[type=text].input-sm,input[type=password].input-sm,input[type=email].input-sm,input[type=number].input-sm,[type=text].form-control.input-sm,[type=password].form-control.input-sm,[type=email].form-control.input-sm,[type=tel].form-control.input-sm,[contenteditable].form-control.input-sm{font-size:12px}textarea.input-lg,textarea.form-control.input-lg,input.form-control.input-lg,input[type=text].input-lg,input[type=password].input-lg,input[type=email].input-lg,input[type=number].input-lg,[type=text].form-control.input-lg,[type=password].form-control.input-lg,[type=email].form-control.input-lg,[type=tel].form-control.input-lg,[contenteditable].form-control.input-lg{font-size:17px}select,select.form-control{border:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-left:0;padding-right:0\9;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=);-webkit-background-size:13px 13px;background-size:13px;background-repeat:no-repeat;background-position:right center;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px;line-height:1.5}select::-ms-expand,select.form-control::-ms-expand{display:none}select.input-sm,select.form-control.input-sm{font-size:12px}select.input-lg,select.form-control.input-lg{font-size:17px}select:focus,select.form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=)}select[multiple],select.form-control[multiple]{background:none}.radio label,.radio-inline label,.checkbox label,.checkbox-inline label{padding-left:25px}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="radio"],.checkbox-inline input[type="radio"],.radio input[type="checkbox"],.radio-inline input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{margin-left:-25px}input[type="radio"],.radio input[type="radio"],.radio-inline input[type="radio"]{position:relative;margin-top:6px;margin-right:4px;vertical-align:top;border:none;background-color:transparent;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="radio"]:focus,.radio input[type="radio"]:focus,.radio-inline input[type="radio"]:focus{outline:none}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before,input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{content:"";display:block;width:18px;height:18px;border-radius:50%;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before{position:absolute;left:0;top:-3px;background-color:#2196f3;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0)}input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{position:relative;top:-3px;border:2px solid #666666}input[type="radio"]:checked:before,.radio input[type="radio"]:checked:before,.radio-inline input[type="radio"]:checked:before{-webkit-transform:scale(.5);-ms-transform:scale(.5);-o-transform:scale(.5);transform:scale(.5)}input[type="radio"]:disabled:checked:before,.radio input[type="radio"]:disabled:checked:before,.radio-inline input[type="radio"]:disabled:checked:before{background-color:#bbbbbb}input[type="radio"]:checked:after,.radio input[type="radio"]:checked:after,.radio-inline input[type="radio"]:checked:after{border-color:#2196f3}input[type="radio"]:disabled:after,.radio input[type="radio"]:disabled:after,.radio-inline input[type="radio"]:disabled:after,input[type="radio"]:disabled:checked:after,.radio input[type="radio"]:disabled:checked:after,.radio-inline input[type="radio"]:disabled:checked:after{border-color:#bbbbbb}input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:relative;border:none;margin-bottom:-4px;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="checkbox"]:focus,.checkbox input[type="checkbox"]:focus,.checkbox-inline input[type="checkbox"]:focus{outline:none}input[type="checkbox"]:focus:after,.checkbox input[type="checkbox"]:focus:after,.checkbox-inline input[type="checkbox"]:focus:after{border-color:#2196f3}input[type="checkbox"]:after,.checkbox input[type="checkbox"]:after,.checkbox-inline input[type="checkbox"]:after{content:"";display:block;width:18px;height:18px;margin-top:-2px;margin-right:5px;border:2px solid #666666;border-radius:2px;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="checkbox"]:checked:before,.checkbox input[type="checkbox"]:checked:before,.checkbox-inline input[type="checkbox"]:checked:before{content:"";position:absolute;top:0;left:6px;display:table;width:6px;height:12px;border:2px solid #fff;border-top-width:0;border-left-width:0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}input[type="checkbox"]:checked:after,.checkbox input[type="checkbox"]:checked:after,.checkbox-inline input[type="checkbox"]:checked:after{background-color:#2196f3;border-color:#2196f3}input[type="checkbox"]:disabled:after,.checkbox input[type="checkbox"]:disabled:after,.checkbox-inline input[type="checkbox"]:disabled:after{border-color:#bbbbbb}input[type="checkbox"]:disabled:checked:after,.checkbox input[type="checkbox"]:disabled:checked:after,.checkbox-inline input[type="checkbox"]:disabled:checked:after{background-color:#bbbbbb;border-color:transparent}.has-warning input:not([type=checkbox]),.has-warning .form-control,.has-warning input.form-control[readonly],.has-warning input[type=text][readonly],.has-warning [type=text].form-control[readonly],.has-warning input:not([type=checkbox]):focus,.has-warning .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #ff9800;box-shadow:inset 0 -2px 0 #ff9800}.has-error input:not([type=checkbox]),.has-error .form-control,.has-error input.form-control[readonly],.has-error input[type=text][readonly],.has-error [type=text].form-control[readonly],.has-error input:not([type=checkbox]):focus,.has-error .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #e51c23;box-shadow:inset 0 -2px 0 #e51c23}.has-success input:not([type=checkbox]),.has-success .form-control,.has-success input.form-control[readonly],.has-success input[type=text][readonly],.has-success [type=text].form-control[readonly],.has-success input:not([type=checkbox]):focus,.has-success .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #4caf50;box-shadow:inset 0 -2px 0 #4caf50}.has-warning .input-group-addon,.has-error .input-group-addon,.has-success .input-group-addon{color:#666666;border-color:transparent;background-color:transparent}.nav-tabs>li>a,.nav-tabs>li>a:focus{margin-right:0;background-color:transparent;border:none;color:#666666;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus:hover{background-color:transparent;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus{border:none;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus:hover{border:none;color:#2196f3}.nav-tabs>li.disabled>a{-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd}.nav-tabs.nav-justified>li>a,.nav-tabs.nav-justified>li>a:hover,.nav-tabs.nav-justified>li>a:focus,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:none}.nav-tabs .dropdown-menu{margin-top:0}.dropdown-menu{margin-top:0;border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.alert{border:none;color:#fff}.alert-success{background-color:#4caf50}.alert-info{background-color:#9c27b0}.alert-warning{background-color:#ff9800}.alert-danger{background-color:#e51c23}.alert a:not(.close),.alert .alert-link{color:#fff;font-weight:bold}.alert .close{color:#fff}.badge{padding:4px 6px 4px}.progress{position:relative;z-index:1;height:6px;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress-bar:last-child{border-radius:0 3px 3px 0}.progress-bar:last-child:before{display:block;content:"";position:absolute;width:100%;height:100%;left:0;right:0;z-index:-1;background-color:#cae6fc}.progress-bar-success:last-child.progress-bar:before{background-color:#c7e7c8}.progress-bar-info:last-child.progress-bar:before{background-color:#edc9f3}.progress-bar-warning:last-child.progress-bar:before{background-color:#ffe0b3}.progress-bar-danger:last-child.progress-bar:before{background-color:#f28e92}.close{font-size:34px;font-weight:300;line-height:24px;opacity:0.6;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.close:hover{opacity:1}.list-group-item{padding:15px}.list-group-item-text{color:#bbbbbb}.well{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.panel{border:none;border-radius:2px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.panel-heading{border-bottom:none}.panel-footer{border-top:none}.popover{border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.carousel-caption h1,.carousel-caption h2,.carousel-caption h3,.carousel-caption h4,.carousel-caption h5,.carousel-caption h6{color:inherit}
--------------------------------------------------------------------------------