diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/.buildinfo b/docs/.buildinfo new file mode 100644 index 0000000..d945cd8 --- /dev/null +++ b/docs/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 6d1deba435e026ed761fa0e0dbeffa98 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/cli/index.doctree b/docs/.doctrees/cli/index.doctree new file mode 100644 index 0000000..1013fae Binary files /dev/null and b/docs/.doctrees/cli/index.doctree differ diff --git a/docs/.doctrees/cli/main.doctree b/docs/.doctrees/cli/main.doctree new file mode 100644 index 0000000..855c48e Binary files /dev/null and b/docs/.doctrees/cli/main.doctree differ diff --git a/docs/.doctrees/cli/translate.doctree b/docs/.doctrees/cli/translate.doctree new file mode 100644 index 0000000..c49dedb Binary files /dev/null and b/docs/.doctrees/cli/translate.doctree differ diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle new file mode 100644 index 0000000..1955886 Binary files /dev/null and b/docs/.doctrees/environment.pickle differ diff --git a/docs/.doctrees/honeybee_doe2.cli.doctree b/docs/.doctrees/honeybee_doe2.cli.doctree new file mode 100644 index 0000000..54aa03c Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.cli.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.cli.translate.doctree b/docs/.doctrees/honeybee_doe2.cli.translate.doctree new file mode 100644 index 0000000..713a2c0 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.cli.translate.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.config.doctree b/docs/.doctrees/honeybee_doe2.config.doctree new file mode 100644 index 0000000..1577344 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.config.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.construction.doctree b/docs/.doctrees/honeybee_doe2.construction.doctree new file mode 100644 index 0000000..097faaa Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.construction.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.doctree b/docs/.doctrees/honeybee_doe2.doctree new file mode 100644 index 0000000..4435638 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.grouping.doctree b/docs/.doctrees/honeybee_doe2.grouping.doctree new file mode 100644 index 0000000..cf87896 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.grouping.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.load.doctree b/docs/.doctrees/honeybee_doe2.load.doctree new file mode 100644 index 0000000..cac96d6 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.load.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.programtype.doctree b/docs/.doctrees/honeybee_doe2.programtype.doctree new file mode 100644 index 0000000..731b5be Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.programtype.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.properties.doctree b/docs/.doctrees/honeybee_doe2.properties.doctree new file mode 100644 index 0000000..d0ba5cb Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.properties.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.properties.model.doctree b/docs/.doctrees/honeybee_doe2.properties.model.doctree new file mode 100644 index 0000000..516408f Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.properties.model.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.properties.room.doctree b/docs/.doctrees/honeybee_doe2.properties.room.doctree new file mode 100644 index 0000000..3706676 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.properties.room.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.schedule.doctree b/docs/.doctrees/honeybee_doe2.schedule.doctree new file mode 100644 index 0000000..4bf526f Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.schedule.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.simulation.doctree b/docs/.doctrees/honeybee_doe2.simulation.doctree new file mode 100644 index 0000000..8fee14e Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.simulation.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.util.doctree b/docs/.doctrees/honeybee_doe2.util.doctree new file mode 100644 index 0000000..3aede53 Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.util.doctree differ diff --git a/docs/.doctrees/honeybee_doe2.writer.doctree b/docs/.doctrees/honeybee_doe2.writer.doctree new file mode 100644 index 0000000..e9554ed Binary files /dev/null and b/docs/.doctrees/honeybee_doe2.writer.doctree differ diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree new file mode 100644 index 0000000..dc5fc0c Binary files /dev/null and b/docs/.doctrees/index.doctree differ diff --git a/docs/.doctrees/modules.doctree b/docs/.doctrees/modules.doctree new file mode 100644 index 0000000..f37cd82 Binary files /dev/null and b/docs/.doctrees/modules.doctree differ diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/_modules/honeybee_doe2/cli/translate.html b/docs/_modules/honeybee_doe2/cli/translate.html new file mode 100644 index 0000000..7578324 --- /dev/null +++ b/docs/_modules/honeybee_doe2/cli/translate.html @@ -0,0 +1,611 @@ + + + + + + + honeybee_doe2.cli.translate — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.cli.translate

+"""honeybee-doe2 translation commands."""
+import sys
+import os
+import json
+import logging
+import click
+
+from honeybee.typing import clean_doe2_string
+from honeybee.model import Model
+from honeybee_energy.schedule.ruleset import ScheduleRuleset
+from honeybee_energy.schedule.dictutil import dict_to_schedule
+
+from honeybee_doe2.config import RES_CHARS
+from honeybee_doe2.util import header_comment_minor
+from honeybee_doe2.schedule import extract_all_schedule_ruleset_from_inp_file
+from honeybee_doe2.simulation import SimulationPar
+
+_logger = logging.getLogger(__name__)
+
+
+@click.group(help='Commands for translating Honeybee Model to DOE-2 formats.')
+def translate():
+    pass
+
+
+@translate.command('model-to-inp')
+@click.argument('model-file', type=click.Path(
+    exists=True, file_okay=True, dir_okay=False, resolve_path=True))
+@click.option(
+    '--sim-par-json', '-sp', help='Full path to a honeybee-doe2 SimulationPar '
+    'JSON that describes all of the settings for the simulation. If unspecified, '
+    'default parameters will be generated.', default=None, show_default=True,
+    type=click.Path(exists=True, file_okay=True, dir_okay=False, resolve_path=True))
+@click.option(
+    '--hvac-mapping', '-hm', help='Text to indicate how HVAC systems should be '
+    'assigned to the exported model. Story will assign one HVAC system for each '
+    'distinct level polygon, Model will use only one HVAC system for the whole model '
+    'and AssignedHVAC will follow how the HVAC systems have been assigned to the'
+    'Rooms.properties.energy.hvac. Choose from: Room, Story, Model, AssignedHVAC',
+    default='Story', show_default=True, type=str)
+@click.option(
+    '--include-interior-walls/--exclude-interior-walls', ' /-xw', help='Flag to note '
+    'whether interior walls should be excluded from the export.',
+    default=True, show_default=True)
+@click.option(
+    '--include-interior-ceilings/--exclude-interior-ceilings', ' /-xc', help='Flag to '
+    'note whether interior ceilings should be excluded from the export.',
+    default=True, show_default=True)
+@click.option(
+    '--equest-version', '-eq', help='Optional text string to denote the version '
+    'of eQuest for which the INP definition will be generated. If unspecified '
+    'or unrecognized, the latest version of eQuest will be used.',
+    default='3.65', show_default=True, type=str)
+@click.option(
+    '--output-file', '-o', help='Optional INP file path to output the INP string '
+    'of the translation. By default this will be printed out to stdout.',
+    type=click.File('w'), default='-', show_default=True)
+def model_to_inp_cli(
+    model_file, sim_par_json, hvac_mapping, include_interior_walls,
+    include_interior_ceilings, equest_version, output_file
+):
+    """Translate a Honeybee Model to an INP file.
+
+    \b
+    Args:
+        model_file: Full path to a Honeybee Model file (HBJSON or HBpkl).
+    """
+    try:
+        exclude_interior_walls = not include_interior_walls
+        exclude_interior_ceilings = not include_interior_ceilings
+        model_to_inp(
+            model_file, sim_par_json, hvac_mapping,
+            exclude_interior_walls, exclude_interior_ceilings,
+            equest_version, output_file)
+    except Exception as e:
+        _logger.exception(f'Model translation failed:\n{e}')
+        sys.exit(1)
+    else:
+        sys.exit(0)
+
+
+
+[docs] +def model_to_inp( + model_file, sim_par_json=None, hvac_mapping='Story', + exclude_interior_walls=False, exclude_interior_ceilings=False, + equest_version='3.65', output_file=None, + include_interior_walls=True, include_interior_ceilings=True): + """Translate a Honeybee Model to an INP file. + + Args: + model_file: Full path to a Honeybee Model file (HBJSON or HBpkl). + sim_par_json: Full path to a honeybee-doe2 SimulationPar JSON that + describes all of the settings for the simulation. If None, + default parameters will be generated. (Default: None). + hvac_mapping: Text to indicate how HVAC systems should be assigned to + the exported model. Story will assign one HVAC system for each distinct + level polygon, Model will use only one HVAC system for the whole model + and AssignedHVAC will follow how the HVAC systems have been assigned + to the Rooms.properties.energy.hvac. Choose from the following. + + * Room + * Story + * Model + * AssignedHVAC + + exclude_interior_walls: Boolean to note whether interior walls should + be excluded from the export. (Default: False). + exclude_interior_ceilings: Boolean to note whether interior ceilings + should be excluded from the export. (Default: False). + equest_version: Optional text string to denote the version of eQuest for + which the INP definition will be generated. If unspecified or + unrecognized, the latest version of eQuest will be used. (Default: False). + output_file: Optional INP file path to output the INP string of the + translation. If None, the string will be returned from this function. + """ + # load simulation parameters if specified + sim_par = None + if sim_par_json is not None: + with open(sim_par_json) as json_file: + data = json.load(json_file) + sim_par = SimulationPar.from_dict(data) + + # re-serialize the Model to Python + model = Model.from_file(model_file) + + # create the strings for the model + inp_str = model.to.inp( + model, sim_par, hvac_mapping, + exclude_interior_walls, exclude_interior_ceilings, equest_version) + + # write out the INP file + return _process_content_to_output(inp_str, output_file)
+ + + +@translate.command('schedules-to-inp') +@click.argument('schedule-json', type=click.Path( + exists=True, file_okay=True, dir_okay=False, resolve_path=True)) +@click.option('--output-file', '-f', help='Optional INP file to output the INP ' + 'string of the translation. By default this will be printed out to stdout', + type=click.File('w'), default='-', show_default=True) +def schedule_to_inp_cli(schedule_json, output_file): + """Translate a Schedule JSON file to an INP. + + \b + Args: + schedule_json: Full path to a Schedule JSON file. This file should + either be an array of non-abridged Schedules or a dictionary where + the values are non-abridged Schedules. + """ + try: + schedule_to_inp(schedule_json, output_file) + except Exception as e: + _logger.exception('Schedule translation failed.\n{}'.format(e)) + sys.exit(1) + else: + sys.exit(0) + + +
+[docs] +def schedule_to_inp(schedule_json, output_file=None): + """Translate a Schedule JSON file to an INP. + + Args: + schedule_json: Full path to a Schedule JSON file. This file should + either be an array of non-abridged Schedules or a dictionary where + the values are non-abridged Schedules. + output_file: Optional INP file path to output the INP string of the + translation. If None, the string will be returned from this function. + """ + # re-serialize the Schedule to Python + with open(schedule_json) as json_file: + data = json.load(json_file) + sch_list = data.values() if isinstance(data, dict) else data + sch_objs = [dict_to_schedule(sch) for sch in sch_list] + type_objs = set() + for sch in sch_objs: + type_objs.add(sch.schedule_type_limit) + + # create the INP strings + all_day_scheds, all_week_scheds, all_year_scheds = [], [], [] + used_day_sched_ids, used_day_count = {}, 1 + all_scheds = sch_objs + for sched in all_scheds: + if isinstance(sched, ScheduleRuleset): + year_schedule, week_schedules = sched.to_inp() + # check that day schedules aren't referenced by other model schedules + day_scheds = [] + for day in sched.day_schedules: + if day.identifier not in used_day_sched_ids: + day_scheds.append(day.to_inp(sched.schedule_type_limit)) + used_day_sched_ids[day.identifier] = day + elif day != used_day_sched_ids[day.identifier]: + new_day = day.duplicate() + new_day.identifier = 'Schedule Day {}'.format(used_day_count) + day_scheds.append(new_day.to_inp(sched.schedule_type_limit)) + for i, week_sch in enumerate(week_schedules): + old_day_id = clean_doe2_string(day.identifier, RES_CHARS) + new_day_id = clean_doe2_string(new_day.identifier, RES_CHARS) + week_schedules[i] = week_sch.replace(old_day_id, new_day_id) + used_day_count += 1 + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + else: # ScheduleFixedInterval + year_schedule, week_schedules, year_schedule = sched.to_inp() + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + inp_str_list = ['INPUT ..\n\n'] + inp_str_list.append(header_comment_minor('Day Schedules')) + inp_str_list.extend(all_day_scheds) + inp_str_list.append(header_comment_minor('Week Schedules')) + inp_str_list.extend(all_week_scheds) + inp_str_list.append(header_comment_minor('Annual Schedules')) + inp_str_list.extend(all_year_scheds) + inp_str_list.append('END ..\nCOMPUTE ..\nSTOP ..\n') + inp_str = '\n'.join(inp_str_list) + + # write out the INP file + return _process_content_to_output(inp_str, output_file)
+ + + +@translate.command('schedules-from-inp') +@click.argument('schedule-inp', type=click.Path( + exists=True, file_okay=True, dir_okay=False, resolve_path=True)) +@click.option( + '--dictionary/--array', ' /-a', help='Flag to note whether a the output JSON ' + 'should be an array of schedule objects or whether it should be a dictionary ' + 'where each key is the identifier of the schedule and each value is the ' + 'schedule object. The dictionary format is the one used by honeybee-standards ' + 'and is recommended when writing INP schedules into the user standards library.', + default=True, show_default=True) +@click.option( + '--output-file', '-f', help='Optional JSON file to output the JSON string of ' + 'the translation. By default this will be printed out to stdout', + type=click.File('w'), default='-', show_default=True) +def schedule_from_inp_cli(schedule_inp, dictionary, output_file): + """Translate a schedule INP file to a honeybee JSON as an array of schedules. + + \b + Args: + schedule_inp: Full path to a Schedule INP file. + """ + try: + array = not dictionary + schedule_from_inp(schedule_inp, array, output_file) + except Exception as e: + _logger.exception('Schedule translation failed.\n{}'.format(e)) + sys.exit(1) + else: + sys.exit(0) + + +
+[docs] +def schedule_from_inp(schedule_inp, array=False, output_file=None, dictionary=True): + """Translate a schedule INP file to a honeybee JSON as an array of schedules. + + Args: + schedule_inp: Full path to a Schedule INP file. + array: Boolean to note whether a the output JSON should be an array of + schedule objects or whether it should be a dictionary where each key + is the identifier of the schedule and each value is the schedule object. + The dictionary format is the one used by honeybee-standards and is + recommended when writing INP schedules into the user standards + library. (Default: False). + output_file: Optional JSON file path to output the JSON string of the + translation. If None, the string will be returned from this function. + """ + # re-serialize the schedules to Python + schedules = extract_all_schedule_ruleset_from_inp_file(schedule_inp) + # create the honeybee dictionaries + if array: + hb_objs = [sch.to_dict() for sch in schedules] + else: + hb_objs = {sch.identifier: sch.to_dict() for sch in schedules} + # write out the JSON file + content_str = json.dumps(hb_objs) + return _process_content_to_output(content_str, output_file)
+ + + +def _process_content_to_output(content_str, output_file): + """Process content strings for various types of output_files.""" + if output_file is None: + return content_str + elif isinstance(output_file, str): + if not os.path.isdir(os.path.dirname(output_file)): + os.makedirs(os.path.dirname(output_file)) + with open(output_file, 'w') as of: + of.write(content_str) + else: + if 'stdout' not in str(output_file): + if not os.path.isdir(os.path.dirname(output_file.name)): + os.makedirs(os.path.dirname(output_file.name)) + output_file.write(content_str) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/construction.html b/docs/_modules/honeybee_doe2/construction.html new file mode 100644 index 0000000..2499a5a --- /dev/null +++ b/docs/_modules/honeybee_doe2/construction.html @@ -0,0 +1,431 @@ + + + + + + + honeybee_doe2.construction — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.construction

+"""honeybee-inp construction translators."""
+from __future__ import division
+
+from ladybug.datatype.uvalue import UValue
+from ladybug.datatype.rvalue import RValue
+from ladybug.datatype.distance import Distance
+from honeybee.typing import clean_doe2_string
+from honeybee_energy.material.opaque import EnergyMaterialNoMass
+
+from .config import RES_CHARS, MIN_LAYER_THICKNESS
+from .util import generate_inp_string, generate_inp_string_list_format
+
+# dictionary to map between E+ and DOE-2 roughness types
+ROUGHNESS_MAP = {
+    'VeryRough': 1, 'Rough': 2, 'MediumRough': 3,
+    'MediumSmooth': 4, 'Smooth': 5, 'VerySmooth': 6
+}
+
+
+
+[docs] +def opaque_material_to_inp(material): + """Convert an EnergyMaterial or EnergyMaterialNoMass into a MATERIAL INP string. + + Note that EnergyMaterials that are below a certain thickness will be automatically + converted to No Mass materials for compatibility with DOE-2. Also note that + this does not work for any materials that can be a part of a window constructions. + """ + doe2_id = clean_doe2_string(material.identifier, RES_CHARS) + # check if the material should be translated as a no mass material + if isinstance(material, EnergyMaterialNoMass) or \ + material.thickness < MIN_LAYER_THICKNESS: + r_val = RValue().to_unit([material.r_value], 'h-ft2-F/Btu', 'm2-K/W')[0] + keywords = ('TYPE', 'RESISTANCE') + values = ('RESISTANCE', round(r_val, 6)) + return generate_inp_string(doe2_id, 'MATERIAL', keywords, values) + # write out detailed properties for the material + thickness = round(Distance().to_unit([material.thickness], 'ft', 'm')[0], 3) + conduct = round(material.conductivity * 0.578176, 3) # convert to BTU/h-ft-F + density = round(material.density / 16.018, 3) # convert to lb/ft3 + spec_en = round(material.specific_heat * 0.0002388459, 3) # convert to BTU/lb-F + keywords = ('TYPE', 'THICKNESS', 'CONDUCTIVITY', 'DENSITY', 'SPECIFIC-HEAT') + values = ('PROPERTIES', thickness, conduct, density, spec_en) + return generate_inp_string(doe2_id, 'MATERIAL', keywords, values)
+ + + +
+[docs] +def opaque_construction_to_inp(construction): + """Convert an OpaqueConstruction into a CONSTRUCTION INP string. + + This will include both the LAYERS definition as well as the CONSTRUCTION but + it does NOT include the constituent MATERIAL definitions and their properties. + """ + doe2_id = clean_doe2_string(construction.identifier, RES_CHARS) + # if the construction has no heat capacity, simply make a U-VALUE construction + if construction.area_heat_capacity == 0 or \ + construction.thickness <= MIN_LAYER_THICKNESS * len(construction.materials): + con_cond = UValue().to_unit([construction.u_factor], 'Btu/h-ft2-F', 'W/m2-K')[0] + keywords = ('TYPE', 'U-VALUE') + values = ('U-VALUE', round(con_cond, 6)) + return generate_inp_string(doe2_id, 'CONSTRUCTION', keywords, values) + # create the specification of material layers + layer_id = '{}_l'.format(doe2_id) + layers = ['"{}"'.format(clean_doe2_string(mat, RES_CHARS)) + for mat in construction.layers] + layer_str = generate_inp_string_list_format( + layer_id, 'LAYERS', ['MATERIAL'], [layers]) + # create the construction specification + roughness = ROUGHNESS_MAP[construction.materials[0].roughness] + sol_absorb = round(1 - construction.outside_solar_reflectance, 3) + keywords = ('TYPE', 'ABSORPTANCE', 'ROUGHNESS', 'LAYERS') + values = ('LAYERS', sol_absorb, roughness, '"{}"'.format(layer_id)) + constr_str = generate_inp_string(doe2_id, 'CONSTRUCTION', keywords, values) + return ''.join((layer_str, constr_str))
+ + + +
+[docs] +def window_construction_to_inp(construction): + """Convert a WindowConstruction (or its variants) into a GLASS-TYPE INP string.""" + doe2_id = clean_doe2_string(construction.identifier, RES_CHARS) + shading_coef = construction.shgc / 0.87 + glass_cond = UValue().to_unit([construction.u_factor], 'Btu/h-ft2-F', 'W/m2-K')[0] + keywords = ('TYPE', 'SHADING-COEF', 'GLASS-CONDUCT') + values = ('SHADING-COEF', round(shading_coef, 3), round(glass_cond, 6)) + return generate_inp_string(doe2_id, 'GLASS-TYPE', keywords, values)
+ + + +
+[docs] +def door_construction_to_inp(construction): + """Convert an OpaqueConstruction or WindowConstruction to a CONSTRUCTION INP string. + + This translation pathway always uses a NoMass U-VALUE Construction. + """ + doe2_id = clean_doe2_string(construction.identifier, RES_CHARS) + constr_cond = UValue().to_unit([construction.u_factor], 'Btu/h-ft2-F', 'W/m2-K')[0] + keywords = ('TYPE', 'U-VALUE') + values = ('U-VALUE', round(constr_cond, 6)) + return generate_inp_string(doe2_id, 'CONSTRUCTION', keywords, values)
+ + + +
+[docs] +def air_construction_to_inp(construction): + """Convert an AirBoundaryConstruction to a CONSTRUCTION INP string. + + This translation pathway always uses a NoMass U-VALUE Construction. + """ + doe2_id = clean_doe2_string(construction.identifier, RES_CHARS) + constr_cond = 1.0 # default U-Value in Btu/h-ft2-F + keywords = ('TYPE', 'U-VALUE') + values = ('U-VALUE', constr_cond) + return generate_inp_string(doe2_id, 'CONSTRUCTION', keywords, values)
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/grouping.html b/docs/_modules/honeybee_doe2/grouping.html new file mode 100644 index 0000000..8db552d --- /dev/null +++ b/docs/_modules/honeybee_doe2/grouping.html @@ -0,0 +1,554 @@ + + + + + + + honeybee_doe2.grouping — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.grouping

+# coding=utf-8
+"""Methods for grouping rooms to comply with INP rules."""
+from __future__ import division
+import math
+
+from ladybug_geometry.geometry2d import Point2D, Polygon2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Face3D
+from honeybee.typing import clean_doe2_string
+from honeybee.room import Room
+
+from .config import DOE2_TOLERANCE, FLOOR_LEVEL_TOL, RES_CHARS
+
+
+
+[docs] +def group_rooms_by_doe2_level(rooms, model_tolerance): + """Group Honeybee Rooms according to acceptable floor levels in DOE-2. + + This means that not only will Rooms be on separate DOE-2 levels if their floor + heights differ but also Rooms that share the same floor height but are + disconnected from one another in plan will also be separate levels. + For example, when the model is of two towers on a plinth, each tower will + get its own separate level group. + + Args: + rooms: A list of Honeybee Rooms to be grouped. + model_tolerance: The tolerance of the model that the Rooms originated from. + + Returns: + A tuple with three elements. + + - room_groups: A list of lists where each sub-list contains Honeybee + Rooms that should be on the same DOE-2 level. + + - level_geometries: A list of Face3D with the same length as the + room_groups, which contains the geometry that represents each floor + level. These geometries will always be pointing upwards so that + their vertices are counter-clockwise when viewed from above. They + will also have colinear vertices removed such that they are ready + to be translated to INP POLYGONS. + + - level_names: A list of text strings that align with the level + geometry and contain suggested names for the DOE-2 levels. + """ + # set up lists of the outputs to be populated + room_groups, level_geometries, level_names, existing_levels = [], [], [], {} + + # first group the rooms by floor height + grouped_rooms, _ = Room.group_by_floor_height(rooms, FLOOR_LEVEL_TOL) + for fi, room_group in enumerate(grouped_rooms): + # determine a base name for the level using the story assigned to the rooms + level_name = clean_doe2_string(room_group[0].story, RES_CHARS - 8) \ + if room_group[0].story is not None else 'Level_{}'.format(fi) + if level_name in existing_levels: + existing_levels[level_name] += 1 + level_name = level_name + str(existing_levels[level_name]) + else: + existing_levels[level_name] = 1 + + # then, group the rooms by contiguous horizontal boundary + floor_geos = [] + for room in room_group: + if room.properties.doe2.space_polygon_geometry is not None: + floor_geos.append(room.properties.doe2.space_polygon_geometry) + else: + try: + flr_geo = room.horizontal_floor_boundaries(tolerance=model_tolerance) + if len(flr_geo) == 0: # possible when Rooms have no floors + flr_geo = room.horizontal_boundary(tolerance=model_tolerance) + floor_geos.append(flr_geo) + else: + floor_geos.extend(flr_geo) + except Exception: # level geometry is overlapping or not clean + pass + + # join all of the floors into horizontal boundaries + hor_bounds = _grouped_floor_boundary(floor_geos, model_tolerance) + + # if we got lucky and everything is one contiguous polygon, we're done! + if len(hor_bounds) == 0: # we will write the story with NO-SHAPE + room_groups.append(room_group) + level_geometries.append(None) + level_names.append(level_name) + elif len(hor_bounds) == 1: # just one clean polygon for the level + flr_geo = hor_bounds[0] + flr_geo = flr_geo if flr_geo.normal.z >= 0 else flr_geo.flip() + if flr_geo.has_holes: # remove holes as we only care about the boundary + flr_geo = Face3D(flr_geo.boundary, flr_geo.plane) + flr_geo = flr_geo.remove_colinear_vertices(tolerance=DOE2_TOLERANCE) + room_groups.append(room_group) + level_geometries.append(flr_geo) + level_names.append(level_name) + else: # we need to figure out which Room belongs to which geometry + # first get a set of Point2Ds that are inside each room in plan + room_pts, z_axis = [], Vector3D(0, 0, 1) + for room in room_group: + for face in room.faces: + if math.degrees(z_axis.angle(face.normal)) >= 91: + down_geo = face.geometry + break + room_pt3d = down_geo.center if down_geo.is_convex else \ + down_geo.pole_of_inaccessibility(DOE2_TOLERANCE) + room_pts.append(Point2D(room_pt3d.x, room_pt3d.y)) + # loop through floor geometries and determine all rooms associated with them + for si, flr_geo in enumerate(hor_bounds): + flr_geo = flr_geo if flr_geo.normal.z >= 0 else flr_geo.flip() + if flr_geo.has_holes: # remove holes as we only care about the boundary + flr_geo = Face3D(flr_geo.boundary, flr_geo.plane) + flr_geo = flr_geo.remove_colinear_vertices(tolerance=DOE2_TOLERANCE) + flr_poly = Polygon2D([Point2D(pt.x, pt.y) for pt in flr_geo.boundary]) + flr_rooms = [] + for room, room_pt in zip(room_group, room_pts): + if flr_poly.is_point_inside_bound_rect(room_pt): + flr_rooms.append(room) + room_groups.append(flr_rooms) + level_geometries.append(flr_geo) + level_names.append('{}_Section{}'.format(level_name, si)) + + # return all of the outputs + return room_groups, level_geometries, level_names
+ + + +
+[docs] +def group_rooms_by_doe2_hvac(model, hvac_mapping): + """Group Honeybee Rooms according to HVAC logic. + + Args: + model: A Honeybee Model for which Rooms will be grouped for HVAC assignment. + hvac_mapping: Text to indicate how HVAC systems should be assigned. + Model will use only one HVAC system for the whole model and + AssignedHVAC will follow how the HVAC systems have been assigned + to the Rooms.properties.energy.hvac. Choose from the options below. + + * Room + * Model + * AssignedHVAC + + Returns: + A tuple with three elements. + + - room_groups: A list of lists where each sub-list contains Honeybee + Rooms that should ave the same HVAC system. + + - hvac_names: A list of text strings that align with the room_groups + and contain suggested names for the DOE-2 HVAC systems. + """ + # clean up the hvac_mapping text + hvac_mapping = hvac_mapping.upper().replace('-', '').replace(' ', '') + + # determine the mapping to be used + if hvac_mapping == 'MODEL': + hvac_name = clean_doe2_string('{}_Sys'.format(model.display_name), RES_CHARS) + return [model.rooms], [hvac_name] + elif hvac_mapping == 'ROOM': + hvac_names = [clean_doe2_string('{}_Sys'.format(room.identifier), RES_CHARS) + for room in model.rooms] + room_groups = [[room] for room in model.rooms] + else: # assume that it is the assigned HVAC + hvac_dict = {} + for room in model.rooms: + if room.properties.energy.hvac is not None: + hvac_id = room.properties.energy.hvac.display_name + try: + hvac_dict[hvac_id].append(room) + except KeyError: # the first time that we are encountering the HVAC + hvac_dict[hvac_id] = [room] + else: + try: + hvac_dict['Unassigned'].append(room) + except KeyError: # the first time that we have an unassigned room + hvac_dict['Unassigned'] = [room] + room_groups, hvac_names, existing_dict = [], [], {} + for hvac_name, rooms in hvac_dict.items(): + room_groups.append(rooms) + hvac_doe2_name = clean_doe2_string(hvac_name, RES_CHARS - 2) + if hvac_doe2_name in existing_dict: + existing_dict[hvac_doe2_name] += 1 + hvac_names.append(hvac_doe2_name + str(existing_dict[hvac_doe2_name])) + else: + existing_dict[hvac_doe2_name] = 1 + hvac_names.append(hvac_doe2_name) + + return room_groups, hvac_names
+ + + +def _grouped_floor_boundary(floor_geos, tolerance=0.01): + """Get a list of Face3D for the boundary around several horizontal Face3Ds. + + Args: + floor_geos: A list of Honeybee Rooms for which the horizontal boundary will + be computed. + tolerance: The maximum difference between coordinate values of two + vertices at which they can be considered equivalent. (Default: 0.01, + suitable for objects in meters). + """ + # remove colinear vertices and degenerate faces + clean_floor_geos = [] + for geo in floor_geos: + try: + clean_floor_geos.append(geo.remove_colinear_vertices(tolerance)) + except AssertionError: # degenerate geometry to ignore + pass + if len(clean_floor_geos) == 0: + return [] # no Room boundary to be found + + # convert the floor Face3Ds into counterclockwise Polygon2Ds + floor_polys, z_vals = [], [] + for flr_geo in clean_floor_geos: + z_vals.append(flr_geo.min.z) + b_poly = Polygon2D([Point2D(pt.x, pt.y) for pt in flr_geo.boundary]) + floor_polys.append(b_poly) + if flr_geo.has_holes: + for hole in flr_geo.holes: + h_poly = Polygon2D([Point2D(pt.x, pt.y) for pt in hole]) + floor_polys.append(h_poly) + z_min = min(z_vals) + + # find the joined intersected boundary + closed_polys = Polygon2D.joined_intersected_boundary(floor_polys, tolerance) + + # remove colinear vertices from the resulting polygons + clean_polys = [] + for poly in closed_polys: + try: + clean_polys.append(poly.remove_colinear_vertices(tolerance)) + except AssertionError: + pass # degenerate polygon to ignore + + # figure out if polygons represent holes in the others and make Face3D + if len(clean_polys) == 0: + return [] + elif len(clean_polys) == 1: # can be represented with a single Face3D + pts3d = [Point3D(pt.x, pt.y, z_min) for pt in clean_polys[0]] + return [Face3D(pts3d)] + else: # need to separate holes from distinct Face3Ds + bound_faces = [] + for poly in clean_polys: + pts3d = tuple(Point3D(pt.x, pt.y, z_min) for pt in poly) + bound_faces.append(Face3D(pts3d)) + return Face3D.merge_faces_to_holes(bound_faces, tolerance) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/load.html b/docs/_modules/honeybee_doe2/load.html new file mode 100644 index 0000000..78006a9 --- /dev/null +++ b/docs/_modules/honeybee_doe2/load.html @@ -0,0 +1,613 @@ + + + + + + + honeybee_doe2.load — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.load

+"""honeybee-doe2 load translators."""
+from __future__ import division
+
+from ladybug.datatype.area import Area
+from ladybug.datatype.power import Power
+from ladybug.datatype.energyflux import EnergyFlux
+from ladybug.datatype.volumeflowrate import VolumeFlowRate
+from ladybug.datatype.volumeflowrateintensity import VolumeFlowRateIntensity
+from honeybee.typing import clean_doe2_string
+
+from .config import RES_CHARS
+
+# list of all keywords associated with different load types
+PEOPLE_KEYS = ('AREA/PERSON', 'PEOPLE-SCHEDULE')
+LIGHTING_KEYS = ('LIGHTING-W/AREA', 'LIGHTING-SCHEDULE', 'LIGHT-TO-RETURN',
+                 'LIGHT-RAD-FRAC')
+EQUIP_KEYS = ('EQUIPMENT-W/AREA', 'EQUIP-SCHEDULE',
+              'EQUIP-SENSIBLE', 'EQUIP-LATENT', 'EQUIP-RAD-FRAC')
+SOURCE_KEYS = ('SOURCE-TYPE', 'SOURCE-POWER', 'SOURCE-SCHEDULE',
+               'SOURCE-SENSIBLE', 'SOURCE-RAD-FRAC', 'SOURCE-LATENT')
+INFILTRATION_KEYS = ('INF-METHOD', 'INF-FLOW/AREA', 'INF-SCHEDULE')
+SETPOINT_KEYS = ('DESIGN-HEAT-T', 'DESIGN-COOL-T', 'HEAT-TEMP-SCH', 'COOL-TEMP-SCH')
+VENTILATION_KEYS = ('OA-FLOW/PER', 'OA-FLOW/AREA', 'OA-CHANGES', 'OUTSIDE-AIR-FLOW',
+                    'MIN-FLOW-SCH')
+MECH_AIRFLOW_KEYS = ('ASSIGNED-FLOW', 'FLOW/AREA', 'MIN-FLOW-RATIO', 'MIN-FLOW/AREA',
+                     'HMAX-FLOW-RATIO')
+SPACE_KEYS = PEOPLE_KEYS + LIGHTING_KEYS + EQUIP_KEYS + INFILTRATION_KEYS
+ZONE_KEYS = SETPOINT_KEYS + VENTILATION_KEYS + MECH_AIRFLOW_KEYS
+SCHEDULE_KEYS = (
+    'PEOPLE-SCHEDULE', 'LIGHTING-SCHEDULE', 'EQUIP-SCHEDULE', 'SOURCE-SCHEDULE',
+    'INF-SCHEDULE', 'HEAT-TEMP-SCH', 'COOL-TEMP-SCH', 'MIN-FLOW-SCH')
+
+# TODO: Add methods to map honeybee_energy process loads to SOURCE-TYPE PROCESS
+# TODO: Add methods to translate daylight sensors
+
+
+
+[docs] +def people_to_inp(people): + """Translate a People definition into INP (Keywords, Values). + + Args: + people: A honeybee-energy People definition. None is allowed. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + people for a Space. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + if people is None: + return (), () + ppl_den = Area().to_unit([people.area_per_person], 'ft2', 'm2')[0] + ppl_den = round(ppl_den, 3) + ppl_sch = clean_doe2_string(people.occupancy_schedule.identifier, RES_CHARS) + ppl_sch = '"{}"'.format(ppl_sch) + return PEOPLE_KEYS, (ppl_den, ppl_sch)
+ + + +
+[docs] +def lighting_to_inp(lighting): + """Translate a Lighting definition into INP (Keywords, Values). + + Args: + lighting: A honeybee-energy Lighting definition. None is allowed. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + lighting for a Space. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + if lighting is None: + return (), () + lpd = EnergyFlux().to_unit([lighting.watts_per_area], 'W/ft2', 'W/m2')[0] + lpd = round(lpd, 3) + lgt_sch = clean_doe2_string(lighting.schedule.identifier, RES_CHARS) + lgt_sch = '"{}"'.format(lgt_sch) + ret_fract = round(lighting.return_air_fraction, 3) + rad_fract = round(lighting.radiant_fraction, 3) + return LIGHTING_KEYS, (lpd, lgt_sch, ret_fract, rad_fract)
+ + + +
+[docs] +def electric_equipment_to_inp(electric_equip): + """Translate an ElectricEquipment into INP (Keywords, Values). + + Args: + electric_equip: A honeybee-energy ElectricEquipment definition. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + the equipment for a Space. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + if electric_equip is None: + return (), () + epd = EnergyFlux().to_unit([electric_equip.watts_per_area], 'W/ft2', 'W/m2')[0] + epd = round(epd, 3) + eqp_sch = clean_doe2_string(electric_equip.schedule.identifier, RES_CHARS) + eqp_sch = '("{}")'.format(eqp_sch) + sens_fract = 1 - electric_equip.latent_fraction - electric_equip.lost_fraction + values = (epd, eqp_sch, sens_fract, electric_equip.latent_fraction, + electric_equip.radiant_fraction) + return EQUIP_KEYS, values
+ + + +
+[docs] +def hot_water_and_gas_to_inp(hot_water, gas_equip, room_floor_area): + """Translate a ServiceHotWater and/or GasEquipment into INP (Keywords, Values). + + Args: + hot_water: A honeybee-energy ServiceHotWater definition. None is allowed. + None is allowed. + gas_equip: gas_equip: A honeybee-energy GasEquipment definition. + None is allowed. + room_floor_area: The host Room floor area in square feet, which will + be used to convert the hot water flow per unit floor area to an + absolute load in BTU/h. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + the hot water SOURCE load for a Space. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + # first check whether anything is assigned + if hot_water is None and gas_equip is None: + return (), () + + # process the hot water and gas into absolute values in Btu/h + shw_values, gas_values = None, None + if hot_water is not None: + flow_den = hot_water.flow_per_area # L/h-m2 + flr_area = Area().to_unit([room_floor_area], 'm2', 'ft2')[0] # m2 + total_flow = flow_den * flr_area # L/h + delta_t = 50 # assume the water heater must heat water from 10C to 60C + c_water = 4.186 # J/g-C, the specific heat of water + shw_heat = total_flow * c_water * delta_t # J/h using Q = m * c * deltaT + shw_heat = shw_heat / 3600. # Watts + shw_power = round(Power().to_unit([shw_heat], 'Btu/h', 'W')[0], 3) + shw_sch = clean_doe2_string(hot_water.schedule.identifier, RES_CHARS) + shw_sch = '"{}"'.format(shw_sch) + sens_fract = round(hot_water.sensible_fraction, 3) + lat_fract = round(hot_water.latent_fraction, 3) + shw_values = ('HOT-WATER', shw_power, shw_sch, sens_fract, 0.0, lat_fract) + if gas_equip is not None: + epd = EnergyFlux().to_unit([gas_equip.watts_per_area], 'Btu/h-ft2', 'W/m2')[0] + total_power = round(epd * flr_area, 3) # Btu/h + eqp_sch = clean_doe2_string(gas_equip.schedule.identifier, RES_CHARS) + eqp_sch = '"{}"'.format(eqp_sch) + sens_fract = round(1 - gas_equip.latent_fraction - gas_equip.lost_fraction, 3) + rad_fract = round(gas_equip.radiant_fraction, 3) + lat_fract = round(gas_equip.latent_fraction, 3) + gas_values = ('GAS', total_power, eqp_sch, sens_fract, rad_fract, lat_fract) + + # if both were specified, format them into a single set of numbers + if shw_values is not None and gas_values is not None: + total_load = round(shw_values[1] + gas_values[1], 3) + shw_weight = shw_values[1] / total_load + gas_weight = gas_values[1] / total_load + if gas_weight > shw_weight: + values = ['GAS', total_load, gas_values[2]] + else: + values = ['HOT-WATER', total_load, shw_values[2]] + for shw_v, gas_v in zip(shw_values[3:], gas_values[3:]): + new_v = (shw_v * shw_weight) + (gas_v * gas_weight) + values.append(round(new_v, 3)) + else: + values = shw_values if shw_values is not None else gas_values + + return SOURCE_KEYS, values
+ + + +
+[docs] +def infiltration_to_inp(infiltration): + """Translate an Infiltration definition into INP (Keywords, Values). + + Args: + infiltration: A honeybee-energy Infiltration definition. None is allowed. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + infiltration for a Space. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + if infiltration is None: + return (), () + inf_den = infiltration.flow_per_exterior_area + inf_den = VolumeFlowRateIntensity().to_unit([inf_den], 'cfm/ft2', 'm3/s-m2')[0] + inf_den = round(inf_den, 3) + inf_sch = clean_doe2_string(infiltration.schedule.identifier, RES_CHARS) + inf_sch = '"{}"'.format(inf_sch) + return INFILTRATION_KEYS, ('AIR-CHANGE', inf_den, inf_sch)
+ + + +
+[docs] +def setpoint_to_inp(setpoint): + """Translate a Setpoint definition into INP (Keywords, Values). + + Args: + setpoint: A honeybee-energy Setpoint definition. None is allowed. + + Returns: + A tuple with two elements. + + - keywords: A tuple of text strings for keywords related to defining + setpoints for a Zone. + + - values: A tuple of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + if setpoint is None: # use some default setpoints + return ('DESIGN-HEAT-T', 'DESIGN-COOL-T'), (72, 75) + heat_setpt = round(setpoint.heating_setpoint * (9. / 5.) + 32., 2) + cool_setpt = round(setpoint.cooling_setpoint * (9. / 5.) + 32., 2) + heat_sch = clean_doe2_string(setpoint.heating_schedule.identifier, RES_CHARS) + heat_sch = '"{}"'.format(heat_sch) + cool_sch = clean_doe2_string(setpoint.cooling_schedule.identifier, RES_CHARS) + cool_sch = '"{}"'.format(cool_sch) + return SETPOINT_KEYS, (heat_setpt, cool_setpt, heat_sch, cool_sch)
+ + + +
+[docs] +def ventilation_to_inp(ventilation): + """Translate a Ventilation definition into INP (Keywords, Values). + + Args: + ventilation: A honeybee-energy Ventilation definition. None is allowed. + + Returns: + A tuple with two elements. + + - keywords: A list of text strings for keywords related to defining + ventilation for a Space. + + - values: A list of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + keywords, values = [], [] + if ventilation is None: + return keywords, values + # check the flow per person + ppl_den = ventilation.flow_per_person + if ppl_den != 0: + keywords.append('OA-FLOW/PER') + ppl_den = VolumeFlowRate().to_unit([ppl_den], 'cfm', 'm3/s')[0] + values.append(round(ppl_den, 3)) + # check the flow per floor area + vent_den = ventilation.flow_per_area + if vent_den != 0: + keywords.append('OA-FLOW/AREA') + vent_den = VolumeFlowRateIntensity().to_unit([vent_den], 'cfm/ft2', 'm3/s-m2')[0] + values.append(round(vent_den, 3)) + # check the air changes per hour + ach = ventilation.air_changes_per_hour + if ach != 0: + keywords.append('OA-CHANGES') + values.append(round(ach, 3)) + # check the flow per zone + total_flow = ventilation.flow_per_zone + if total_flow != 0: + keywords.append('OUTSIDE-AIR-FLOW') + total_flow = VolumeFlowRate().to_unit([total_flow], 'cfm', 'm3/s')[0] + values.append(round(total_flow, 3)) + # check the schedule + vent_sch = ventilation.schedule + if vent_sch is not None: + keywords.append('MIN-FLOW-SCH') + vent_sch = clean_doe2_string(vent_sch.identifier, RES_CHARS) + values.append('"{}"'.format(vent_sch)) + return keywords, values
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/programtype.html b/docs/_modules/honeybee_doe2/programtype.html new file mode 100644 index 0000000..9d62102 --- /dev/null +++ b/docs/_modules/honeybee_doe2/programtype.html @@ -0,0 +1,492 @@ + + + + + + + honeybee_doe2.programtype — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.programtype

+"""honeybee-doe2 program type translators."""
+from __future__ import division
+
+from .util import switch_statement_id
+from .load import people_to_inp, lighting_to_inp, electric_equipment_to_inp, \
+    infiltration_to_inp, setpoint_to_inp, ventilation_to_inp, \
+    SPACE_KEYS, ZONE_KEYS, SCHEDULE_KEYS, MECH_AIRFLOW_KEYS
+SCH_KEY_SET = set(SCHEDULE_KEYS)
+
+
+
+[docs] +def program_type_to_inp(program_type, switch_dict=None): + """Translate a ProgramType into a dictionary used to write INP switch statements. + + Args: + program_type: A honeybee-energy ProgramType definition. + switch_dict: An optional dictionary with INP keywords as keys (such as + PEOPLE-SCHEDULE or AREA/PERSON or LIGHTING-W/AREA). The values of the + dictionary should be lists of switch statement text strings, such as + 'case "conf": #SI("Small Off Occ", "SPACE", "PEOPLE-SCHEDULE")'. + Specifying an input dictionary here can be used to build up switch + statements for all program types across a model. + + Returns: + An dictionary with INP keywords as keys (such as PEOPLE-SCHEDULE or AREA/PERSON). + The values of the dictionary are lists of switch statement text strings, + such as 'case "conf": #SI("Small Off Occ", "SPACE", "PEOPLE-SCHEDULE")'. + """ + # set up the switch statement dictionary to be filled + switch_dict = switch_dict if switch_dict is not None else {} + prog_uid = switch_statement_id(program_type.identifier) + base_switch = 'case "{}": '.format(prog_uid) + + def _format_schedule(sch_key, sch_uid, obj_type='SPACE'): + """Format schedules in the way they are written into switch statements.""" + return '{}#SI({}, "{}", "{}")'.format(base_switch, sch_uid, obj_type, sch_key) + + def _add_to_switch_dict(keyword, value): + """Add a key: value pair to the switch dictionary with a check.""" + try: + switch_dict[keyword].append(value) + except KeyError: # the first time this key was encountered in the dict + switch_dict[keyword] = [value] + + # write the people into the dictionary + ppl_kwd, ppl_val = people_to_inp(program_type.people) + for key, val in zip(ppl_kwd, ppl_val): + if key in SCH_KEY_SET: + _add_to_switch_dict(key, _format_schedule(key, val, 'SPACE')) + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + + # write the lighting into the dictionary + lgt_kwd, lgt_val = lighting_to_inp(program_type.lighting) + for key, val in zip(lgt_kwd, lgt_val): + if key == 'LIGHTING-SCHEDULE': + key = 'LIGHTING-SCHEDUL' # there's a typo in DOE-2 that was never fixed + _add_to_switch_dict(key, _format_schedule(key, val, 'SPACE')) + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + # write the equipment into the dictionary + eq_kwd, eq_val = electric_equipment_to_inp(program_type.electric_equipment) + for key, val in zip(eq_kwd, eq_val): + if key in SCH_KEY_SET: + _add_to_switch_dict(key, _format_schedule(key, val, 'SPACE')) + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + # write the infiltration into the dictionary + inf_kwd, inf_val = infiltration_to_inp(program_type.infiltration) + for key, val in zip(inf_kwd, inf_val): + if key in SCH_KEY_SET: + _add_to_switch_dict(key, _format_schedule(key, val, 'SPACE')) + elif key == 'INF-METHOD': + continue # DOE-2 does not like when we define this key + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + # write the setpoint into the dictionary + stp_kwd, stp_val = setpoint_to_inp(program_type.setpoint) + for key, val in zip(stp_kwd, stp_val): + if key in SCH_KEY_SET: + _add_to_switch_dict(key, _format_schedule(key, val, 'ZONE')) + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + # write the ventilation into the dictionary + vt_kwd, vt_val = ventilation_to_inp(program_type.ventilation) + for key, val in zip(vt_kwd, vt_val): + if key in SCH_KEY_SET: + _add_to_switch_dict(key, _format_schedule(key, val, 'ZONE')) + else: + _add_to_switch_dict(key, '{}{}'.format(base_switch, val)) + + # if the user_data of the ProgramType has Mech AirFlow keys, add them + if program_type.user_data is not None: + for air_key in MECH_AIRFLOW_KEYS: + if air_key in program_type.user_data: + val = program_type.user_data[air_key] + _add_to_switch_dict(air_key, '{}{}'.format(base_switch, val)) + + return switch_dict
+ + + +
+[docs] +def switch_dict_to_space_inp(switch_dict): + """Translate a switch statement dictionary into INP strings for the SPACE. + + Args: + switch_dict: An dictionary with INP keywords as keys (such as + PEOPLE-SCHEDULE or AREA/PERSON or LIGHTING-W/AREA). The values of the + dictionary should be lists of switch statement text strings, such as + 'case "conf": #SI("Small Off Occ", "SPACE", "PEOPLE-SCHEDULE")'. + + Returns: + A text string to be written into an INP file. This should go at the top + of the description of Floors / Spaces. + """ + # loop through the space keys and build a list of all switch statement keys + all_switch_strs = [] + for s_key in SPACE_KEYS: + try: + if len(s_key) > 16: # switch statements limit characters to 16 + s_key = s_key[:16] + switch_progs = switch_dict[s_key] + switch_strs = ['SET-DEFAULT FOR SPACE'] + switch_strs.append(' {} ='.format(s_key)) + switch_strs.append('{switch(#L("C-ACTIVITY-DESC"))') + switch_strs.extend(switch_progs) + switch_strs.append('default: no_default') + switch_strs.append('endswitch}') + switch_strs.append('..\n') + all_switch_strs.append('\n'.join(switch_strs)) + except KeyError: + pass # none of the programs types have this space key + # add something to set the INF-METHOD for all spaces + inf_str = 'SET-DEFAULT FOR SPACE\n' \ + ' INF-METHOD = AIR-CHANGE\n' \ + '..\n' + all_switch_strs.append(inf_str) + return '\n'.join(all_switch_strs)
+ + + +
+[docs] +def switch_dict_to_zone_inp(switch_dict): + """Translate a switch statement dictionary into INP strings for the ZONE. + + Args: + switch_dict: An dictionary with INP keywords as keys (such as + HEAT-TEMP-SCH or DESIGN-HEAT-T or OUTSIDE-AIR-FLOW). The values of the + dictionary should be lists of switch statement text strings, such as + 'case "conf": #SI("Small Off HtgStp", "SPACE", "HEAT-TEMP-SCH")'. + + Returns: + A text string to be written into an INP file. This should go at the top + of the description of HVAC Systems / Zones. + """ + # loop through the space keys and build a list of all switch statement keys + all_switch_strs = [] + for s_key in ZONE_KEYS: + try: + switch_progs = switch_dict[s_key] + switch_strs = ['SET-DEFAULT FOR ZONE', ' TYPE = CONDITIONED'] + switch_strs.append(' {} ='.format(s_key)) + switch_strs.append('{switch(#LR("SPACE", "C-ACTIVITY-DESC"))') + switch_strs.extend(switch_progs) + switch_strs.append('default: no_default') + switch_strs.append('endswitch}') + switch_strs.append('..\n') + all_switch_strs.append('\n'.join(switch_strs)) + except KeyError: + pass # none of the programs types have this space key + return '\n'.join(all_switch_strs)
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/properties/model.html b/docs/_modules/honeybee_doe2/properties/model.html new file mode 100644 index 0000000..41ab7bc --- /dev/null +++ b/docs/_modules/honeybee_doe2/properties/model.html @@ -0,0 +1,446 @@ + + + + + + + honeybee_doe2.properties.model — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.properties.model

+# coding=utf-8
+"""Model DOE-2 Properties."""
+
+
+
+[docs] +class ModelDoe2Properties(object): + """DOE-2 Properties for Honeybee Model. + + Args: + host: A honeybee_core Model object that hosts these properties. + + Properties: + * host + """ + + def __init__(self, host): + """Initialize ModelDoe2Properties.""" + self._host = host + + @property + def host(self): + """Get the Model object hosting these properties.""" + return self._host + +
+[docs] + def check_for_extension(self, raise_exception=True, detailed=False): + """Check that the Model is valid for DOE-2 simulation. + + This process includes all relevant honeybee-core checks as well as checks + that apply only for DOE-2. + + Args: + raise_exception: Boolean to note whether a ValueError should be raised + if any errors are found. If False, this method will simply + return a text string with all errors that were found. (Default: True). + detailed: Boolean for whether the returned object is a detailed list of + dicts with error info or a string with a message. (Default: False). + + Returns: + A text string with all errors that were found or a list if detailed is True. + This string (or list) will be empty if no errors were found. + """ + # set up defaults to ensure the method runs correctly + detailed = False if raise_exception else detailed + msgs = [] + tol = self.host.tolerance + ang_tol = self.host.angle_tolerance + + # perform checks for duplicate identifiers, which might mess with other checks + msgs.append(self.host.check_all_duplicate_identifiers(False, detailed)) + + # perform several checks for the Honeybee schema geometry rules + msgs.append(self.host.check_planar(tol, False, detailed)) + msgs.append(self.host.check_self_intersecting(tol, False, detailed)) + msgs.append(self.host.check_degenerate_rooms(tol, False, detailed)) + + # perform geometry checks related to parent-child relationships + msgs.append(self.host.check_sub_faces_valid(tol, ang_tol, False, detailed)) + msgs.append(self.host.check_sub_faces_overlapping(tol, False, detailed)) + msgs.append(self.host.check_rooms_solid(tol, ang_tol, False, detailed)) + msgs.append(self.host.check_upside_down_faces(ang_tol, False, detailed)) + + # perform checks related to adjacency relationships + msgs.append(self.host.check_room_volume_collisions(tol, False, detailed)) + msgs.append(self.host.check_missing_adjacencies(False, detailed)) + msgs.append(self.host.check_matching_adjacent_areas(tol, False, detailed)) + msgs.append(self.host.check_all_air_boundaries_adjacent(False, detailed)) + + # perform checks that are specific to DOE-2 + # perform checks for duplicate identifiers + e_prop = self.host.properties.energy + msgs.append(e_prop.check_duplicate_material_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_construction_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_construction_set_identifiers(False, detailed)) + msgs.append( + e_prop.check_duplicate_schedule_type_limit_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_schedule_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_program_type_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_hvac_identifiers(False, detailed)) + msgs.append(e_prop.check_duplicate_shw_identifiers(False, detailed)) + # perform checks for specific energy simulation rules + msgs.append(e_prop.check_interior_constructions_reversed(False, detailed)) + + # output a final report of errors or raise an exception + full_msgs = [msg for msg in msgs if msg] + if detailed: + return [m for msg in full_msgs for m in msg] + full_msg = '\n'.join(full_msgs) + if raise_exception and len(full_msgs) != 0: + raise ValueError(full_msg) + return full_msg
+ + +
+[docs] + def to_dict(self): + """Return Model DOE-2 properties as a dictionary.""" + return {'doe2': {'type': 'ModelDoe2Properties'}}
+ + +
+[docs] + def apply_properties_from_dict(self, data): + """Apply the energy properties of a dictionary to the host Model of this object. + + Args: + data: A dictionary representation of an entire honeybee-core Model. + Note that this dictionary must have ModelEnergyProperties in order + for this method to successfully apply the energy properties. + """ + assert 'doe2' in data['properties'], \ + 'Dictionary possesses no ModelDoe2Properties.' + room_doe2_dicts = [] + if 'rooms' in data and data['rooms'] is not None: + for room_dict in data['rooms']: + try: + room_doe2_dicts.append(room_dict['properties']['doe2']) + except KeyError: + room_doe2_dicts.append(None) + for room, r_dict in zip(self.host.rooms, room_doe2_dicts): + if r_dict is not None: + room.properties.doe2.apply_properties_from_dict(r_dict)
+ + +
+[docs] + def ToString(self): + return self.__repr__()
+ + + def __repr__(self): + return 'Model DOE2 Properties: [host: {}]'.format(self.host.display_name)
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/properties/room.html b/docs/_modules/honeybee_doe2/properties/room.html new file mode 100644 index 0000000..82f9016 --- /dev/null +++ b/docs/_modules/honeybee_doe2/properties/room.html @@ -0,0 +1,705 @@ + + + + + + + honeybee_doe2.properties.room — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.properties.room

+# coding=utf-8
+"""Room DOE-2 Properties."""
+import math
+
+from ladybug_geometry.geometry3d import Face3D
+from honeybee.typing import float_in_range, float_positive
+from honeybee.altnumber import autocalculate
+
+from ..load import MECH_AIRFLOW_KEYS
+
+
+
+[docs] +class RoomDoe2Properties(object): + """DOE-2 Properties for Honeybee Room. + + Args: + host: A honeybee_core Room object that hosts these properties. + assigned_flow: A number for the design supply air flow rate for the zone + the Room is assigned to (cfm). This establishes the minimum allowed + design air flow. Note that the actual design flow may be larger. If + None, this parameter will not be written into the INP. (Default: None). + flow_per_area: A number for the design supply air flow rate to + the zone per unit floor area (cfm/ft2). If None, this parameter + will not be written into the INP. (Default: None). + min_flow_ratio: A number between 0 and 1 for the minimum allowable zone + air supply flow rate, expressed as a fraction of design flow rate. + Applicable to variable-volume type systems only. If None, this parameter + will not be written into the INP. (Default: None). + min_flow_per_area: A number for the minimum air flow per square foot of + floor area (cfm/ft2). This is an alternative way of specifying the + min_flow_ratio. If None, this parameter will not be written into + the INP. (Default: None). + hmax_flow_ratio: A number between 0 and 1 for the ratio of the maximum + (or fixed) heating airflow to the cooling airflow. The specific + meaning varies according to the type of zone terminal. If None, this + parameter will not be written into the INP. (Default: None). + space_polygon_geometry: An optional horizontal Face3D object, which will + be used to set the SPACE polygon during export to INP. If None, + the SPACE polygon is auto-calculated from the 3D Room geometry. + Specifying a geometry here can help overcome some limitations of + this auto-calculation, particularly for cases where the floors + of the Room are composed of AirBoundaries. (Default: None). + + Properties: + * host + * assigned_flow + * flow_per_area + * min_flow_ratio + * min_flow_per_area + * hmax_flow_ratio + * space_polygon_geometry + """ + __slots__ = ( + '_host', '_assigned_flow', '_flow_per_area', '_min_flow_ratio', + '_min_flow_per_area', '_hmax_flow_ratio', '_space_polygon_geometry' + ) + + def __init__( + self, host, assigned_flow=None, flow_per_area=None, min_flow_ratio=None, + min_flow_per_area=None, hmax_flow_ratio=None, space_polygon_geometry=None + ): + """Initialize Room DOE-2 properties.""" + # set the main properties of the Room + self._host = host + self.assigned_flow = assigned_flow + self.flow_per_area = flow_per_area + self.min_flow_ratio = min_flow_ratio + self.min_flow_per_area = min_flow_per_area + self.hmax_flow_ratio = hmax_flow_ratio + self.space_polygon_geometry = space_polygon_geometry + + @property + def host(self): + """Get the Room object hosting these properties.""" + return self._host + + @property + def assigned_flow(self): + """Get or set the design supply air flow rate for the zone (cfm).""" + return self._assigned_flow + + @assigned_flow.setter + def assigned_flow(self, value): + if value is not None: + value = float_positive(value, 'zone assigned flow') + self._assigned_flow = value + + @property + def flow_per_area(self): + """Get or set the design supply air flow rate per unit floor area (cfm/ft2). + """ + return self._flow_per_area + + @flow_per_area.setter + def flow_per_area(self, value): + if value is not None: + value = float_positive(value, 'zone flow per area') + self._flow_per_area = value + + @property + def min_flow_ratio(self): + """Get or set the the min supply airflow rate as a fraction of design flow rate. + """ + return self._min_flow_ratio + + @min_flow_ratio.setter + def min_flow_ratio(self, value): + if value is not None: + value = float_in_range(value, 0.0, 1.0, 'zone min flow ratio') + self._min_flow_ratio = value + + @property + def min_flow_per_area(self): + """Get or set the minimum air flow per square foot of floor area (cfm/ft2).""" + return self._min_flow_per_area + + @min_flow_per_area.setter + def min_flow_per_area(self, value): + if value is not None: + value = float_positive(value, 'zone min flow per area') + self._min_flow_per_area = value + + @property + def hmax_flow_ratio(self): + """Get or set the ratio of the maximum heating airflow to the cooling airflow. + """ + return self._hmax_flow_ratio + + @hmax_flow_ratio.setter + def hmax_flow_ratio(self, value): + if value is not None: + value = float_in_range(value, 0.0, 1.0, 'zone heating max flow ratio') + self._hmax_flow_ratio = value + + @property + def space_polygon_geometry(self): + """Get or set a horizontal Face3D to set the space polygon geometry.""" + return self._space_polygon_geometry + + @space_polygon_geometry.setter + def space_polygon_geometry(self, value): + if value is not None: + assert isinstance(value, Face3D), \ + 'Expected ladybug_geometry Face3D. Got {}'.format(type(value)) + if value.normal.z < 0: # ensure upward-facing Face3D + self._floor_geometry = value.flip() + self._space_polygon_geometry = value + +
+[docs] + def move(self, moving_vec): + """Move this object along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the object. + """ + if self.space_polygon_geometry is not None: + self._space_polygon_geometry = self.space_polygon_geometry.move(moving_vec)
+ + +
+[docs] + def rotate(self, angle, axis, origin): + """Rotate this object by a certain angle around an axis and origin. + + Args: + angle: An angle for rotation in degrees. + axis: Rotation axis as a Vector3D. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + if self.space_polygon_geometry is not None: + self._space_polygon_geometry = \ + self.space_polygon_geometry.rotate(math.radians(angle), axis, origin)
+ + +
+[docs] + def rotate_xy(self, angle, origin): + """Rotate this object counterclockwise in the world XY plane by a certain angle. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + if self.space_polygon_geometry is not None: + self._space_polygon_geometry = \ + self.space_polygon_geometry.rotate_xy(math.radians(angle), origin)
+ + +
+[docs] + def reflect(self, plane): + """Reflect this object across a plane. + + Args: + plane: A ladybug_geometry Plane across which the object will + be reflected. + """ + if self.space_polygon_geometry is not None: + self._space_polygon_geometry = self.space_polygon_geometry.reflect(plane)
+ + +
+[docs] + def scale(self, factor, origin=None): + """Scale this object by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + if self.space_polygon_geometry is not None: + self._space_polygon_geometry = \ + self.space_polygon_geometry.scale(factor, origin)
+ + +
+[docs] + @classmethod + def from_dict(cls, data, host): + """Create RoomDoe2Properties from a dictionary. + + Args: + data: A dictionary representation of RoomDoe2Properties with the + format below. + host: A Room object that hosts these properties. + + .. code-block:: python + + { + "type": 'RoomDoe2Properties', + "assigned_flow": 100, # number in cfm + "flow_per_area": 1, # number in cfm/ft2 + "min_flow_ratio": 0.3, # number between 0 and 1 + "min_flow_per_area": 0.3, # number in cfm/ft2 + "hmax_flow_ratio": 0.3, # number between 0 and 1 + "space_polygon_geometry": {} # optional Face3D dictionary + } + """ + assert data['type'] == 'RoomDoe2Properties', \ + 'Expected RoomDoe2Properties. Got {}.'.format(data['type']) + new_prop = cls(host) + auto_dict = autocalculate.to_dict() + if 'assigned_flow' in data and data['assigned_flow'] != auto_dict: + new_prop.assigned_flow = data['assigned_flow'] + if 'flow_per_area' in data and data['flow_per_area'] != auto_dict: + new_prop.flow_per_area = data['flow_per_area'] + if 'min_flow_ratio' in data and data['min_flow_ratio'] != auto_dict: + new_prop.min_flow_ratio = data['min_flow_ratio'] + if 'min_flow_per_area' in data and data['min_flow_per_area'] != auto_dict: + new_prop.min_flow_per_area = data['min_flow_per_area'] + if 'hmax_flow_ratio' in data and data['hmax_flow_ratio'] != auto_dict: + new_prop.hmax_flow_ratio = data['hmax_flow_ratio'] + if 'space_polygon_geometry' in data and \ + data['space_polygon_geometry'] is not None: + new_prop.space_polygon_geometry = \ + Face3D.from_dict(data['space_polygon_geometry']) + return new_prop
+ + +
+[docs] + def apply_properties_from_dict(self, data): + """Apply properties from a RoomDoe2Properties dictionary. + + Args: + data: A RoomDoe2Properties dictionary (typically coming from a Model). + """ + auto_dict = autocalculate.to_dict() + if 'assigned_flow' in data and data['assigned_flow'] != auto_dict: + self.assigned_flow = data['assigned_flow'] + if 'flow_per_area' in data and data['flow_per_area'] != auto_dict: + self.flow_per_area = data['flow_per_area'] + if 'min_flow_ratio' in data and data['min_flow_ratio'] != auto_dict: + self.min_flow_ratio = data['min_flow_ratio'] + if 'min_flow_per_area' in data and data['min_flow_per_area'] != auto_dict: + self.min_flow_per_area = data['min_flow_per_area'] + if 'hmax_flow_ratio' in data and data['hmax_flow_ratio'] != auto_dict: + self.hmax_flow_ratio = data['hmax_flow_ratio'] + if 'space_polygon_geometry' in data and \ + data['space_polygon_geometry'] is not None: + self.space_polygon_geometry = \ + Face3D.from_dict(data['space_polygon_geometry'])
+ + +
+[docs] + def apply_properties_from_user_data(self): + """Apply properties from a the user_data assigned to the host room. + + For this method to successfully assign properties from user_data, the + properties on this object must currently be None and the keys in + user_data must use the INP convention for each of the attributes, + which must be CAPITALIZED like the following: + + .. code-block:: python + + { + "ASSIGNED-FLOW": 100, # number in cfm + "FLOW/AREA": 1, # number in cfm/ft2 + "MIN-FLOW-RATIO": 0.3, # number between 0 and 1 + "MIN-FLOW/AREA": 0.3, # number in cfm/ft2 + "HMAX-FLOW-RATIO": 0.3 # number between 0 and 1 + } + """ + attrs = ('assigned_flow', 'flow_per_area', 'min_flow_ratio', + 'min_flow_per_area', 'hmax_flow_ratio') + data = self.host.user_data + if data is not None: + for key, attr in zip(MECH_AIRFLOW_KEYS, attrs): + if key in data and getattr(self, attr) is None: + try: + setattr(self, attr, data[key]) + except Exception: + pass # it's user_data; users are allowed to make mistakes
+ + +
+[docs] + def to_dict(self, abridged=False): + """Return Room Doe2 properties as a dictionary.""" + base = {'doe2': {}} + base['doe2']['type'] = 'RoomDoe2Properties' + if self.assigned_flow is not None: + base['doe2']['assigned_flow'] = self.assigned_flow + if self.flow_per_area is not None: + base['doe2']['flow_per_area'] = self.flow_per_area + if self.min_flow_ratio is not None: + base['doe2']['min_flow_ratio'] = self.min_flow_ratio + if self.min_flow_per_area is not None: + base['doe2']['min_flow_per_area'] = self.min_flow_per_area + if self.hmax_flow_ratio is not None: + base['doe2']['hmax_flow_ratio'] = self.hmax_flow_ratio + if self.space_polygon_geometry is not None: + base['doe2']['space_polygon_geometry'] = \ + self.space_polygon_geometry.to_dict() + return base
+ + +
+[docs] + def to_inp(self): + """Get RoomDoe2Properties as INP (Keywords, Values). + + Returns: + A tuple with two elements. + + - keywords: A list of text strings for keywords to assign to the room. + + - values: A list of text strings that aligns with the keywords and + denotes the value for each keyword. + """ + keywords = [] + values = [] + attrs = ('assigned_flow', 'flow_per_area', 'min_flow_ratio', + 'min_flow_per_area', 'hmax_flow_ratio') + for key, attr in zip(MECH_AIRFLOW_KEYS, attrs): + attr_value = getattr(self, attr) + if attr_value is not None: + keywords.append(key) + values.append(attr_value) + return keywords, values
+ + +
+[docs] + def duplicate(self, new_host=None): + """Get a copy of this object. + + Args: + new_host: A new Room object that hosts these properties. + If None, the properties will be duplicated with the same host. + """ + _host = new_host or self._host + new_room = RoomDoe2Properties( + _host, self.assigned_flow, self.flow_per_area, self.min_flow_ratio, + self.min_flow_per_area, self.hmax_flow_ratio, self.space_polygon_geometry) + return new_room
+ + +
+[docs] + def ToString(self): + return self.__repr__()
+ + + def __repr__(self): + return 'Room DOE2 Properties: [host: {}]'.format(self.host.display_name)
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/schedule.html b/docs/_modules/honeybee_doe2/schedule.html new file mode 100644 index 0000000..acfdad6 --- /dev/null +++ b/docs/_modules/honeybee_doe2/schedule.html @@ -0,0 +1,1000 @@ + + + + + + + honeybee_doe2.schedule — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.schedule

+# coding=utf-8
+"""honeybee-doe2 schedule translators."""
+from __future__ import division
+import re
+
+from ladybug.dt import Date, MONTHNAMES
+from ladybug.analysisperiod import AnalysisPeriod
+from honeybee.typing import clean_doe2_string, clean_ep_string
+from honeybee_energy.schedule.day import ScheduleDay
+from honeybee_energy.schedule.rule import ScheduleRule
+from honeybee_energy.schedule.ruleset import ScheduleRuleset
+from honeybee_energy.lib.scheduletypelimits import fractional, on_off, temperature
+
+from .config import RES_CHARS
+from .util import generate_inp_string, generate_inp_string_list_format, \
+    clean_inp_file_contents, parse_inp_string
+
+
+"""____________TRANSLATORS FROM HONEYBEE TO INP____________"""
+
+
+
+[docs] +def schedule_type_limit_to_inp(type_limit): + """Get the DOE-2 type for a honeybee-energy ScheduleTypeLimit.""" + if type_limit is None: + return 'FRACTION' + elif type_limit.display_name == 'Multiplier': + return "MULTIPLIER" + elif type_limit.unit_type == 'Temperature': + return 'TEMPERATURE' + else: + if type_limit.numeric_type == 'Discrete': + return 'ON/OFF' + else: + return 'FRACTION'
+ + + +
+[docs] +def schedule_day_to_inp(day_schedule, type_limit=None): + """Convert a ScheduleDay into a DAY-SCHEDULE INP string.""" + # setup the DOE-2 identifier and lists for keywords and values + doe2_id = clean_doe2_string(day_schedule.identifier, RES_CHARS) + type_text = schedule_type_limit_to_inp(type_limit) + keywords, values = ['TYPE'], [type_text] + hour_values = day_schedule.values_at_timestep(1) + + # convert temperature to fahrenheit if the type if temperature + if type_text == 'TEMPERATURE': + hour_values = [round(v * (9. / 5.) + 32., 2) for v in hour_values] + + # setup a function to format list of values correctly + def _format_day_values(values_to_format): + if len(values_to_format) == 1: + return '({})'.format(round(values_to_format[0], 3)) + elif len(values_to_format) < 5: + return str(tuple(round(v, 3) for v in values_to_format)) + else: # we have to format it with multiple lines + spc = ' ' * 31 + full_str = '(' + for i, v in enumerate(values_to_format): + if i == len(values_to_format) - 1: + full_str += str(round(v, 3)) + ')' + elif (i + 1) % 5 == 0: + full_str += str(round(v, 3)) + ',\n' + spc + else: + full_str += str(round(v, 3)) + ', ' + return full_str + + # loop through the hourly values and write them in the format DOE-2 likes + prev_count, prev_hour, prev_values = 0, 1, [hour_values[0]] + for i, val in enumerate(hour_values): + if i == 0: + continue # ignore the first value already in the list + if val == prev_values[-1]: + prev_count += 1 + if len(prev_values) > 1: + keywords.append('HOURS') + if prev_hour != i - 1: + values.append('({}, {})'.format(prev_hour, i - 1)) + keywords.append('VALUES') + values.append(_format_day_values(prev_values[:-1])) + prev_values = [prev_values[-1]] + prev_hour = i + else: + values.append('({}, {})'.format(prev_hour, i)) + keywords.append('VALUES') + values.append(_format_day_values(prev_values)) + prev_values = [prev_values[-1]] + prev_hour = i + 1 + continue # wait for the value to change + if prev_count == 0: # just keep assembling the list of values + prev_values.append(val) + else: + keywords.append('HOURS') + values.append('({}, {})'.format(prev_hour, i)) + keywords.append('VALUES') + values.append(_format_day_values(prev_values)) + prev_values = [val] + prev_hour = i + 1 + prev_count = 0 + keywords.append('HOURS') + values.append('({}, {})'.format(prev_hour, 24)) + keywords.append('VALUES') + values.append(_format_day_values(prev_values)) + + # return the INP string + return generate_inp_string(doe2_id, 'DAY-SCHEDULE', keywords, values)
+ + + +
+[docs] +def schedule_ruleset_to_inp(schedule): + """Convert a ScheduleRuleset into a WEEK-SCHEDULE-PD and SCHEDULE INP strings. + + Note that this method only outputs SCHEDULE and WEEK-SCHEDULE objects + However, to write the full schedule into an INP, the schedules's + day_schedules must also be written. + + Returns: + A tuple with two elements + + - year_schedule: Text string representation of the SCHEDULE + describing this schedule. + + - week_schedules: A list of WEEK-SCHEDULE-PD text strings that are + referenced in the year_schedule. + """ + # setup the DOE-2 identifier and lists for keywords and values + doe2_id = clean_doe2_string(schedule.identifier, RES_CHARS) + type_text = schedule_type_limit_to_inp(schedule.schedule_type_limit) + day_types = [ + 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', + 'Sunday', 'Holiday', 'Winter Design Day', 'Summer Design Day' + ] + + def _get_week_list(schedule, rule_indices): + """Get a list of the ScheduleDay identifiers applied on each day of the week.""" + week_list = [] + for dow in range(7): + for i in rule_indices: + if schedule._schedule_rules[i].week_apply_tuple[dow]: + day_sch_id = schedule._schedule_rules[i].schedule_day.identifier + week_list.append(clean_doe2_string(day_sch_id, RES_CHARS)) + break + else: # no rule applies; use default_day_schedule. + day_sch_id = schedule.default_day_schedule.identifier + week_list.append(clean_doe2_string(day_sch_id, RES_CHARS)) + week_list.append(week_list.pop(0)) # DOE-2 starts week on Monday; not Sunday + return week_list + + def _get_extra_week_fields(schedule): + """Get schedule identifiers of extra days in Schedule:Week.""" + # add summer and winter design days + week_fields = [] + if schedule._holiday_schedule is not None: + day_sch_id = schedule._holiday_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + else: + day_sch_id = schedule._default_day_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + if schedule._winter_designday_schedule is not None: + day_sch_id = schedule._winter_designday_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + else: + day_sch_id = schedule._default_day_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + if schedule._summer_designday_schedule is not None: + day_sch_id = schedule._summer_designday_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + else: + day_sch_id = schedule._default_day_schedule.identifier + week_fields.append(clean_doe2_string(day_sch_id, RES_CHARS)) + return week_fields + + def _inp_week_schedule_from_rule_indices(schedule, rule_indices, week_index): + """Create an INP string of a week schedule from a list of rules indices.""" + week_sch_id = '{}_Week {}'.format(schedule.identifier, week_index) + week_sch_id = clean_doe2_string(week_sch_id, RES_CHARS) + week_fields = [] + # check rules that apply for the days of the week + week_fields.extend(_get_week_list(schedule, rule_indices)) + # add extra days (including summer and winter design days) + week_fields.extend(_get_extra_week_fields(schedule)) + week_keywords, week_values = ['TYPE'], [type_text] + day_list = [] + for day_type, day_sch in zip(day_types, week_fields): + day_list.append('"{}", $ {}'.format(day_sch, day_type)) + week_keywords.append('DAY-SCHEDULES') + week_values.append(day_list) + week_schedule = generate_inp_string_list_format( + week_sch_id, 'WEEK-SCHEDULE-PD', week_keywords, week_values) + return week_schedule, week_sch_id + + def _inp_week_schedule_from_week_list(schedule, week_list, week_index): + """Create an INP string of a week schedule from a list ScheduleDay identifiers. + """ + week_sch_id = '{}_Week {}'.format(schedule.identifier, week_index) + week_sch_id = clean_doe2_string(week_sch_id, RES_CHARS) + week_fields = list(week_list) + week_fields.append(week_fields.pop(0)) # DOE-2 starts week on Monday; not Sunday + week_fields.extend(_get_extra_week_fields(schedule)) + week_keywords, week_values = ['TYPE'], [type_text] + day_list = [] + for day_type, day_sch in zip(day_types, week_fields): + day_list.append('"{}", $ {}'.format(day_sch, day_type)) + week_keywords.append('DAY-SCHEDULES') + week_values.append(day_list) + week_schedule = generate_inp_string_list_format( + week_sch_id, 'WEEK-SCHEDULE-PD', week_keywords, week_values) + return week_schedule, week_sch_id + + # prepare to create a full Schedule:Year + week_schedules = [] + if schedule.is_single_week: # create the only one week schedule + wk_sch, wk_sch_id = \ + _inp_week_schedule_from_rule_indices(schedule, range(len(schedule)), 1) + week_schedules.append(wk_sch) + yr_wk_s_ids = [wk_sch_id] + yr_wk_dt_range = [[Date(1, 1), Date(12, 31)]] + else: # create a set of week schedules throughout the year + # loop through 365 days of the year to find unique combinations of rules + rules_each_day = [] + for doy in range(1, 366): + rules_on_doy = tuple(i for i, rule in enumerate(schedule._schedule_rules) + if rule.does_rule_apply_doy(doy)) + rules_each_day.append(rules_on_doy) + unique_rule_sets = set(rules_each_day) + # check if any combination yield the same week schedule and remove duplicates + week_tuples = [tuple(_get_week_list(schedule, rule_set)) + for rule_set in unique_rule_sets] + unique_week_tuples = list(set(week_tuples)) + # create the unique week schedules from the combinations of rules + week_sched_ids = [] + for i, week_list in enumerate(unique_week_tuples): + wk_schedule, wk_sch_id = \ + _inp_week_schedule_from_week_list(schedule, week_list, i + 1) + week_schedules.append(wk_schedule) + week_sched_ids.append(wk_sch_id) + # create a dictionary mapping unique rule index lists to week schedule ids + rule_set_map = {} + for rule_i, week_list in zip(unique_rule_sets, week_tuples): + unique_week_i = unique_week_tuples.index(week_list) + rule_set_map[rule_i] = week_sched_ids[unique_week_i] + # loop through all 365 days of the year to find when rules change + yr_wk_s_ids = [] + yr_wk_dt_range = [] + prev_week_sched = None + for doy in range(1, 366): + week_sched = rule_set_map[rules_each_day[doy - 1]] + if week_sched != prev_week_sched: # change to a new rule set + yr_wk_s_ids.append(week_sched) + if doy != 1: + yr_wk_dt_range[-1].append(Date.from_doy(doy - 1)) + yr_wk_dt_range.append([Date.from_doy(doy)]) + else: + yr_wk_dt_range.append([Date(1, 1)]) + prev_week_sched = week_sched + yr_wk_dt_range[-1].append(Date(12, 31)) + + # create the year fields + keywords, values = ['TYPE'], [type_text] + for i, (wk_sch_id, dt_range) in enumerate(zip(yr_wk_s_ids, yr_wk_dt_range)): + end_date = dt_range[1] + thru = 'THRU {} {}'.format(MONTHNAMES[end_date.month - 1].upper(), end_date.day) + keywords.append(thru) + values.append('"{}"'.format(wk_sch_id)) + year_schedule = generate_inp_string(doe2_id, 'SCHEDULE', keywords, values) + return year_schedule, week_schedules
+ + + +
+[docs] +def schedule_fixed_interval_to_inp(schedule): + """Convert a ScheduleFixedInterval to INP strings. + + Note that true Fixed Interval schedules are not supported by DOE-2 and there + is no way to faithfully translate them given that DOE-2 SCHEDULE objects have + a hard limit of 12 THRU statements. This method tries to write as best of + an approximation for the schedule as possible by averaging the hourly values + from each day of the fixed interval schedule. A separate day schedule will + be used for each month in an attempt to account for changes in the fixed + interval schedule over the year. + + All of this will allow the translation to succeed and gives roughly matching + behavior of the DOE-2 simulation to the EnergyPlus simulation. However, it is + recommended that users replace ScheduleFixedIntervals with ScheduleRulesets + that they know best represents the schedule. Or EnergyPlus should be used for + the simulation instead of DOE-2. + + Returns: + A tuple with three elements + + - year_schedule: Text string representation of the SCHEDULE + describing this schedule. + + - week_schedules: A list of WEEK-SCHEDULE text strings that are + referenced in the year_schedule. + + - day_schedules: A list of DAY-SCHEDULE-PD text strings that are + referenced in the week_schedules. + """ + # setup the DOE-2 identifier and lists for keywords and values + doe2_id = clean_doe2_string(schedule.identifier, RES_CHARS) + base_id = clean_doe2_string(schedule.identifier, RES_CHARS - 6) + type_text = schedule_type_limit_to_inp(schedule.schedule_type_limit) + + # loop through the months of the year and create appropriate schedules + day_schedules, week_schedules = [], [] + year_keywords, year_values = ['TYPE'], [type_text] + sch_data = schedule.data_collection + if sch_data.header.analysis_period.timestep != 1: + sch_data = sch_data.cull_to_timestep(1) + for month_i in range(1, 13): + # create the day schedules + month_name = AnalysisPeriod.MONTHNAMES[month_i] + month_days = AnalysisPeriod.NUMOFDAYSEACHMONTH[month_i - 1] + week_id = '{}{}'.format(base_id, month_name) + day_id = '{}{}'.format(week_id, 'Day') + period = AnalysisPeriod(st_month=month_i, end_month=month_i, end_day=month_days) + month_data = sch_data.filter_by_analysis_period(period) + mon_per_hr = month_data.average_monthly_per_hour() + hour_values = [round(v, 3) for v in mon_per_hr.values] + if type_text == 'TEMPERATURE': + hour_values = [round(v * (9. / 5.) + 32., 2) for v in hour_values] + day_keywords, day_values = ['TYPE', 'VALUES'], [type_text, hour_values] + day_inp_str = generate_inp_string_list_format( + day_id, 'DAY-SCHEDULE-PD', day_keywords, day_values) + day_schedules.append(day_inp_str) + # create week schedule + week_keywords = ['TYPE', 'DAYS', 'DAY-SCHEDULES'] + week_values = [type_text, '(ALL)', '("{}")'.format(day_id)] + week_sch = generate_inp_string( + week_id, 'WEEK-SCHEDULE', week_keywords, week_values) + week_schedules.append(week_sch) + # add values to the year schedules + thru = 'THRU {} {}'.format(month_name.upper(), period.end_day) + year_keywords.append(thru) + year_values.append('"{}"'.format(week_id)) + + # return all of the strings + year_schedule = generate_inp_string(doe2_id, 'SCHEDULE', year_keywords, year_values) + return year_schedule, week_schedules, day_schedules
+ + + +"""____________TRANSLATORS FROM INP TO HONEYBEE____________""" + + +
+[docs] +def schedule_type_limit_from_inp(inp_type_string): + """Get a honeybee-energy ScheduleTypeLimit for a given DOE-2 schedule type.""" + clean_type = inp_type_string.strip().upper() + if clean_type == 'ON/OFF': + return on_off + elif clean_type == 'TEMPERATURE': + return temperature + else: + return fractional
+ + + +
+[docs] +def schedule_day_from_inp(inp_string): + """Create a Honeybee ScheduleDay from a DOE-2 INP text string. + + Note that this method can accept both types of DOE-2 Day Schedules + (DAY-SCHEDULE, DAY-SCHEDULE-PD). + + Args: + inp_string: A text string fully describing a DOE-2 DAY-SCHEDULE. + """ + # parse the string into properties + u_name, command, keywords, values = parse_inp_string(inp_string) + # extract the hourly values of the schedule + hour_vals, sch_type = [], 'FRACTIONAL' + if command.upper() == 'DAY-SCHEDULE-PD': + field_dict = {k: v for k, v in zip(keywords, values)} + sch_type = field_dict['TYPE'].upper() + hour_vals_init = eval(field_dict['VALUES'].replace('&D', '"&D"'), {}) + if isinstance(hour_vals_init, tuple): + for val in hour_vals_init: + if val == '&D': + hour_vals.append(hour_vals[-1]) + else: + hour_vals.append(float(val)) + if len(hour_vals) < 24: + for _ in range(24 - len(hour_vals)): + hour_vals.append(hour_vals[-1]) + else: # a constant schedule + hour_vals = [hour_vals_init] * 24 + elif command.upper() == 'DAY-SCHEDULE': + prev_count = 0 + for key, val in zip(keywords, values): + if key == 'HOURS': + hr_range = eval(val, {}) + prev_count = hr_range[-1] - hr_range[0] + 1 + elif key == 'VALUES': + hr_vals = eval(val, {}) + if isinstance(hr_vals, tuple): + hour_vals.extend(hr_vals) + else: + hour_vals.extend([hr_vals] * prev_count) + elif key == 'TYPE': + sch_type = val.upper() + else: + raise ValueError('Schedule type "{}" is not recognized.'.format(command)) + # convert temperature values from F to C if type is TEMPERATURE + if sch_type == 'TEMPERATURE': + hour_vals = [round((v - 32.) * (5. / 9.), 2) for v in hour_vals] + return ScheduleDay.from_values_at_timestep(clean_ep_string(u_name), hour_vals)
+ + + +def _inp_day_schedule_dictionary(day_inp_strings): + """Get a dictionary of DaySchedule objects from an INP string list.""" + day_schedule_dict = {} + for sch_str in day_inp_strings: + sch_str = sch_str.strip() + try: + sch_obj = schedule_day_from_inp(sch_str) + day_schedule_dict[sch_obj.identifier] = sch_obj + except Exception: + pass # not a schedule that can be converted + return day_schedule_dict + + +
+[docs] +def extract_all_rules_from_inp_schedule_week( + week_inp_string, day_schedule_dict, start_date=None, end_date=None): + """Extract all ScheduleRule objects from an INP string of a WEEK-SCHEDULE-PD. + + Args: + week_inp_string: A text string fully describing a DOE-2 WEEK-SCHEDULE-PD. + day_schedule_dict: A dictionary with the identifiers of ScheduleDay objects + as keys and the corresponding ScheduleDay objects as values. These objects + will be used to build the ScheduleRules using the week_idf_string. + start_date: A ladybug Date object for the start of the period over which + the ScheduleRules apply. If None, Jan 1 will be used. + end_date: A ladybug Date object for the end of the period over which + the ScheduleRules apply. If None, Dec 31 will be used. + + Returns: + A tuple with five elements + + - u_name: The unique name of the WEEK-SCHEDULE-PD. + + - schedule_rules: A list of ScheduleRule objects that together describe + the WEEK-SCHEDULE-PD. + + - holiday: Text for the name of the SCHEDULE-DAY for the Holiday. + + - winter_dd: Text for the name of the SCHEDULE-DAY for the Winter Design Day. + + - summer_dd: Text for the name of the SCHEDULE-DAY for the Summer Design Day. + """ + # parse the string into properties + u_name, command, keywords, values = parse_inp_string(week_inp_string) + assert command.upper() == 'WEEK-SCHEDULE-PD', 'Week schedule must be in ' \ + 'WEEK-SCHEDULE-PD format. Got "{}".'.format(command) + # create the ScheduleRule objects from the parsed properties + schedule_rules = [] + field_dict = {k: v for k, v in zip(keywords, values)} + week_vals = eval(field_dict['DAY-SCHEDULES'].replace('&D', '"&D"'), {}) + applied_day_ids, prev_day = [], None + for i, day_sch_id in enumerate(week_vals[:7]): + day_sch_id = day_sch_id.replace('"', '') + day_sch_id = prev_day if day_sch_id == '&D' else day_sch_id + prev_day = day_sch_id # increment it for the next item + if day_sch_id not in applied_day_ids: # make a new rule + rule = ScheduleRule(day_schedule_dict[clean_ep_string(day_sch_id)], + start_date=start_date, end_date=end_date) + if i == 6: + rule.apply_day_by_dow(1) + else: + rule.apply_day_by_dow(i + 2) + schedule_rules.append(rule) + applied_day_ids.append(day_sch_id) + else: # edit one of the existing rules to apply it to the new day + sch_rule_index = applied_day_ids.index(day_sch_id) + rule = schedule_rules[sch_rule_index] + if i == 6: + rule.apply_day_by_dow(1) + else: + rule.apply_day_by_dow(i + 2) + # process any of the specified Holiday or Design Day schedules + holiday = week_vals[7] if len(week_vals) > 7 and week_vals[7] != '&D' \ + else prev_day + winter_dd = week_vals[8] if len(week_vals) > 8 and week_vals[8] != '&D' \ + else holiday + summer_dd = week_vals[9] if len(week_vals) > 9 and week_vals[9] != '&D' \ + else winter_dd + return u_name, schedule_rules, holiday, winter_dd, summer_dd
+ + + +def _inp_week_schedule_dictionary(week_inp_strings, day_sch_dict): + """Get a dictionary of ScheduleRule objects from WEEK-SCHEDULE-PD strings.""" + week_schedule_dict = {} + week_designday_dict = {} + for sch_str in week_inp_strings: + sch_str = sch_str.strip() + try: + u_name, rules, holiday, winter_dd, summer_dd = \ + extract_all_rules_from_inp_schedule_week(sch_str, day_sch_dict) + week_schedule_dict[u_name] = rules + week_designday_dict[u_name] = [ + day_sch_dict[clean_ep_string(holiday)], + day_sch_dict[clean_ep_string(summer_dd)], + day_sch_dict[clean_ep_string(winter_dd)] + ] + except Exception: + pass # schedule is not translate-able + return week_schedule_dict, week_designday_dict + + +def _convert_schedule_year(year_inp_string, week_sch_dict, week_dd_dict): + """Convert an INP string of a year SCHEDULE or SCHEDULE-PD to a ScheduleRuleset. + + Args: + year_inp_string: An INP text string describing a DOE-2 SCHEDULE or SCHEDULE-PD. + week_sch_dict: A dictionary of ScheduleRules from _inp_week_schedule_dictionary. + week_dd_dict: A dictionary of design day ScheduleDay output from the + _inp_week_schedule_dictionary method. + """ + # use the year schedule to bring it all together + u_name, command, keywords, values = parse_inp_string(year_inp_string) + field_dict = {k: v for k, v in zip(keywords, values)} + schedule_type = schedule_type_limit_from_inp(field_dict['TYPE']) + all_rules = [] + if command.upper() == 'SCHEDULE-PD': + week_vals = eval(field_dict['WEEK-SCHEDULES'], {}) + if not isinstance(week_vals, tuple): # only one week for the whole year + week_id = week_vals.replace('"', '') + rules = week_sch_dict[week_id] + all_rules.extend(rules) + else: + month_vals = eval(field_dict['MONTH'], {}) + day_vals = eval(field_dict['DAY'], {}) + prev_month, prev_day = 1, 1 + for month, day, week in zip(month_vals, day_vals, week_vals): + week_id = week.replace('"', '') + rules = week_sch_dict[week_id] + st_date = Date(int(prev_month), int(prev_day)) + end_date = Date(int(month), int(day)) + for rule in rules: + rule.start_date = st_date + rule.end_date = end_date + all_rules.extend(rules) + end_doy = end_date.doy + 1 if end_date.doy != 365 else 365 + next_day = Date.from_doy(end_doy) + prev_month, prev_day = next_day.month, next_day.day + elif command.upper() == 'SCHEDULE': + prev_month, prev_day = 1, 1 + for key, val in zip(keywords, values): + if key.startswith('THRU'): + week_id = val.replace('"', '') + rules = week_sch_dict[week_id] + st_date = Date(int(prev_month), int(prev_day)) + date_vals = key.replace('THRU ', '').split(' ') + date_str = '{} {}'.format(date_vals[1], date_vals[0].title()) + end_date = Date.from_date_string(date_str) + for rule in rules: + rule.start_date = st_date + rule.end_date = end_date + all_rules.extend(rules) + end_doy = end_date.doy + 1 if end_date.doy != 365 else 365 + next_day = Date.from_doy(end_doy) + prev_month, prev_day = next_day.month, next_day.day + + # check to be sure the schedule days don't already have a parent + for rule in all_rules: + if rule.schedule_day._parent is not None: + rule.schedule_day = rule.schedule_day.duplicate() + default_day_schedule = all_rules[0].schedule_day + holiday_sch, summer_dd_sch, winter_dd_sch = week_dd_dict[week_id] + if holiday_sch._parent is not None: + holiday_sch = holiday_sch.duplicate() + if summer_dd_sch._parent is not None: + summer_dd_sch = summer_dd_sch.duplicate() + if winter_dd_sch._parent is not None: + winter_dd_sch = summer_dd_sch.duplicate() + + # create the ScheduleRuleset and apply the design days + sched = ScheduleRuleset(clean_ep_string(u_name), default_day_schedule, + all_rules[1:], schedule_type) + ScheduleRuleset._apply_designdays_with_check( + sched, holiday_sch, summer_dd_sch, winter_dd_sch) + return sched + + +
+[docs] +def schedule_ruleset_from_inp(year_inp_string, week_inp_strings, day_inp_strings): + """Create a ScheduleRuleset from a DOE-2 INP text strings. + + Args: + year_inp_string: An INP text string describing a DOE-2 SCHEDULE or SCHEDULE-PD. + week_inp_strings: A list of INP text strings for all of the WEEK-SCHEDULE-PD + objects used in the SCHEDULE. + day_inp_strings: A list of text strings for all of the DAY-SCHEDULE or + DAY-SCHEDULE-PD objects used in the week_inp_strings. + """ + # process the schedule components + day_schedule_dict = _inp_day_schedule_dictionary(day_inp_strings) + week_sch_dict, week_dd_dict = _inp_week_schedule_dictionary( + week_inp_strings, day_schedule_dict) + + # convert the year_inp_string into a ScheduleRuleset + return _convert_schedule_year(year_inp_string, week_sch_dict, week_dd_dict)
+ + + +
+[docs] +def extract_all_schedule_ruleset_from_inp_file(inp_file): + """Extract all ScheduleRuleset objects from a DOE-2 INP file. + + Args: + inp_file: A path to an INP file containing objects for SCHEDULE + (or SCHEDULE-PD) and corresponding WEEK-SCHEDULE-PD and DAY-SCHEDULE + (or DAY-SCHEDULE-PD) objects. The SCHEDULE will be used to assemble + all of these into a ScheduleRuleset. + + Returns: + schedules -- A list of all Schedule objects in the INP file as + honeybee_energy ScheduleRuleset objects. + """ + # read the file and remove lines of comments + file_contents = clean_inp_file_contents(inp_file) + # extract all of the DAY-SCHEDULE objects + day_pattern1 = re.compile(r'(?i)(".*=.*DAY-SCHEDULE\n[\s\S]*?\.\.)') + day_pattern2 = re.compile(r'(?i)(".*=.*DAY-SCHEDULE-PD\n[\s\S]*?\.\.)') + day_sch_str = day_pattern1.findall(file_contents) + \ + day_pattern2.findall(file_contents) + day_schedule_dict = _inp_day_schedule_dictionary(day_sch_str) + # extract all of the WEEK-SCHEDULE-PD objects + week_pattern = re.compile(r'(?i)(".*=.*WEEK-SCHEDULE-PD\n[\s\S]*?\.\.)') + week_sch_str = week_pattern.findall(file_contents) + week_sch_dict, week_dd_dict = _inp_week_schedule_dictionary( + week_sch_str, day_schedule_dict) + # extract all of the SCHEDULE objects and convert to ScheduleRuleset + year_pattern1 = re.compile(r'(?i)(".*=.*SCHEDULE\n[\s\S]*?\.\.)') + year_pattern2 = re.compile(r'(?i)(".*=.*SCHEDULE-PD\n[\s\S]*?\.\.)') + year_sch_str = year_pattern1.findall(file_contents) + \ + year_pattern2.findall(file_contents) + + # translate each SCHEDULE and check to be sure ScheduleDay objects are unique + schedules = [] + for year_sch in year_sch_str: + try: + yr_sch = _convert_schedule_year(year_sch, week_sch_dict, week_dd_dict) + schedules.append(yr_sch) + except Exception: + pass # schedule is not translate-able + return schedules
+ + + +"""______EXTRA UTILITY FUNCTIONS RELATED TO SCHEDULES______""" + + +
+[docs] +def energy_trans_sch_to_transmittance(shade_obj): + """Try to extract the transmittance from the shade energy properties.""" + trans = 0 + trans_sch = shade_obj.properties.energy.transmittance_schedule + if trans_sch is not None: + if trans_sch.is_constant: + try: # assume ScheduleRuleset + trans = trans_sch.default_day_schedule[0] + except AttributeError: # ScheduleFixedInterval + trans = trans_sch.values[0] + else: # not a constant schedule; use the average transmittance + try: # assume ScheduleRuleset + sch_vals = trans_sch.values() + except Exception: # ScheduleFixedInterval + sch_vals = trans_sch.values + trans = round(sum(sch_vals) / len(sch_vals), 3) + return trans
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/simulation.html b/docs/_modules/honeybee_doe2/simulation.html new file mode 100644 index 0000000..b3922a3 --- /dev/null +++ b/docs/_modules/honeybee_doe2/simulation.html @@ -0,0 +1,615 @@ + + + + + + + honeybee_doe2.simulation — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.simulation

+# coding=utf-8
+"""honeybee-doe2 simulation parameters."""
+from __future__ import division
+
+from honeybee.typing import clean_doe2_string, int_in_range
+from honeybee_energy.simulation.runperiod import RunPeriod
+
+from .config import GEO_CHARS
+from .util import generate_inp_string, header_comment_minor
+
+
+
+[docs] +class SimulationPar(object): + """Complete set of DOE-2 Simulation Settings. + + Args: + title: Text for the title of the project. (Default: *Unnamed*). + run_period: A honeybee-energy RunPeriod object to describe the time period + over which to run the simulation. (Default: Run for the whole year). + site: A SiteData object describing the site where the simulation is + run. (Default: HArtford, CT). + + Properties: + * title + * run_period + * site + """ + __slots__ = ('_title', '_run_period', '_site') + + def __init__(self, title='Unnamed', run_period=None, site=None): + """Initialize SimulationPar.""" + self.title = title + self.run_period = run_period + self.site = site + +
+[docs] + @classmethod + def from_dict(cls, data): + """Create a SimulationPar object from a dictionary. + + Args: + data: A SimulationPar dictionary in following the format below. + + .. code-block:: python + + { + "type": "SimulationPar", + "title": 'sample_project', # Text for the title + "run_period": {}, # Honeybee RunPeriod dictionary + "site": {}, # Honeybee SiteData dictionary + } + """ + assert data['type'] == 'SimulationPar', \ + 'Expected SimulationPar dictionary. Got {}.'.format(data['type']) + title = data['title'] if 'title' in data else 'Unnamed' + run_period = None + if 'run_period' in data and data['run_period'] is not None: + run_period = RunPeriod.from_dict(data['run_period']) + site = None + if 'site' in data and data['site'] is not None: + site = SiteData.from_dict(data['site']) + return cls(title, run_period, site)
+ + + @property + def title(self): + """Get or set text for the title of the project.""" + return self._title + + @title.setter + def title(self, value): + if value: + value = clean_doe2_string(value, GEO_CHARS) + else: + value = None + self._title = value + + @property + def run_period(self): + """Get or set a RunPeriod object for the time period to run the simulation.""" + return self._run_period + + @run_period.setter + def run_period(self, value): + if value is not None: + assert isinstance(value, RunPeriod), 'Expected RunPeriod for ' \ + 'SimulationPar run_period. Got {}.'.format(type(value)) + self._run_period = value + else: + self._run_period = RunPeriod() + + @property + def site(self): + """Get or set a SiteData object for the project site of the simulation.""" + return self._site + + @site.setter + def site(self, value): + if value is not None: + assert isinstance(value, SiteData), 'Expected SiteData for ' \ + 'SimulationPar site. Got {}.'.format(type(value)) + self._site = value + else: + self._site = SiteData() + +
+[docs] + def to_inp(self): + """Get an DOE-2 INP string representation of the SimulationPar.""" + # add the starting headers + sp_str = [] + sp_str.append(header_comment_minor('Abort, Diagnostics')) + sp_str.append(header_comment_minor('Global Parameters')) + sp_str.append(header_comment_minor('Title, Run Periods, Design Days, Holidays')) + # add the title and run period + title_str = \ + 'TITLE\n' \ + ' LINE-1 = *{}*\n' \ + ' ..\n'.format(self.title) + sp_str.append(title_str) + sp_str.append(self.run_period.to_inp()) + # add the site and building data + sp_str.append(header_comment_minor('Compliance Data')) + sp_str.append(header_comment_minor('Site and Building Data')) + sp_str.append(self.site.to_inp()) + return '\n'.join(sp_str)
+ + +
+[docs] + def to_dict(self): + """SimulationPar dictionary representation.""" + return { + 'type': 'SimulationPar', + 'title': self.title, + 'run_period': self.run_period.to_dict(), + 'site': self.site.to_dict(), + }
+ + +
+[docs] + def duplicate(self): + """Get a copy of this object.""" + return self.__copy__()
+ + +
+[docs] + def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + + def __copy__(self): + return SimulationPar( + self.title, self.run_period.duplicate(), self.site.duplicate()) + + def __key(self): + """A tuple based on the object properties, useful for hashing.""" + return (self.title, hash(self.run_period), hash(self.site)) + + def __hash__(self): + return hash(self.__key()) + + def __eq__(self, other): + return isinstance(other, SimulationPar) and self.__key() == other.__key() + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return 'DOE-2 SimulationPar: {}'.format(self.title)
+ + + +
+[docs] +class SiteData(object): + """Object to describe the project site of the simulation. + + Args: + altitude: A number for the altitude of the location above sea level + in Feet. (Default: 150). + + Properties: + * altitude + """ + __slots__ = ('_altitude',) + + def __init__(self, altitude=150): + """Initialize SimulationPar.""" + self.altitude = altitude + +
+[docs] + @classmethod + def from_dict(cls, data): + """Create a SiteData object from a dictionary. + + Args: + data: A SiteData dictionary in following the format below. + + .. code-block:: python + + { + "type": "SiteData", + "altitude": 100 # altitude above sea level (ft) + } + """ + assert data['type'] == 'SiteData', \ + 'Expected SiteData dictionary. Got {}.'.format(data['type']) + altitude = data['altitude'] if 'altitude' in data else 150 + return cls(altitude)
+ + + @property + def altitude(self): + """A number for the altitude of the location above sea level in Feet.""" + return self._altitude + + @altitude.setter + def altitude(self, value): + self._altitude = int_in_range(value, input_name='site data altitude') + +
+[docs] + def to_inp(self): + """Get an DOE-2 INP string representation of the SiteData.""" + # create the INP string for the site + keywords = ('ALTITUDE', 'C-STATE', 'C-WEATHER-FILE', + 'C-COUNTRY', 'C-901-LOCATION') + values = (self.altitude, '21', '*TMY2\\HARTFOCT.bin*', '1', '1092') + site_str = generate_inp_string('Site Data', 'SITE-PARAMETERS', keywords, values) + # create the INP string for the building data + keywords, values = ('HOLIDAYS',), ('"Standard US Holidays"',) + bldg_str = generate_inp_string( + 'Building Data', 'BUILD-PARAMETERS', keywords, values) + return site_str + bldg_str
+ + +
+[docs] + def to_dict(self): + """SiteData dictionary representation.""" + return { + 'type': 'SiteData', + 'altitude': self.altitude + }
+ + +
+[docs] + def duplicate(self): + """Get a copy of this object.""" + return self.__copy__()
+ + +
+[docs] + def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + + def __copy__(self): + return SiteData(self.altitude) + + def __key(self): + """A tuple based on the object properties, useful for hashing.""" + return (self.altitude,) + + def __hash__(self): + return hash(self.__key()) + + def __eq__(self, other): + return isinstance(other, SiteData) and self.__key() == other.__key() + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return self.to_inp()
+ + + +
+[docs] +def run_period_to_inp(run_period): + """Translate a honeybee-energy RunPeriod object to a DOE-2 INP string""" + # create the string for the run period + year = 2020 if run_period.is_leap_year else 2021 + keywords = ('BEGIN-MONTH', 'BEGIN-DAY', 'BEGIN-YEAR', + 'END-MONTH', 'END-DAY', 'END-YEAR') + values = (run_period.start_date.month, run_period.start_date.day, year, + run_period.end_date.month, run_period.end_date.day, year) + rp_str = generate_inp_string('Default Run Period', 'RUN-PERIOD-PD', keywords, values) + # create the string for the holidays + keywords, values = ('LIBRARY-ENTRY',), ('"US"',) + hol_str = generate_inp_string('Standard US Holidays', 'HOLIDAYS', keywords, values) + return rp_str + hol_str
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/util.html b/docs/_modules/honeybee_doe2/util.html new file mode 100644 index 0000000..ae762d7 --- /dev/null +++ b/docs/_modules/honeybee_doe2/util.html @@ -0,0 +1,537 @@ + + + + + + + honeybee_doe2.util — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.util

+# coding=utf-8
+"""Various utilities used throughout the package."""
+from __future__ import division
+
+import re
+import os
+
+
+
+[docs] +def generate_inp_string(u_name, command, keywords, values): + """Get an INP string representation of a DOE-2 object. + + This method is written in a generic way so that it can describe practically + any element of the INP Building Description Language (BDL). + + Args: + u_name: Text for the unique, user-specified name of the object being created. + This must be 32 characters or less and not contain special or non-ASCII + characters. The clean_doe2_string method may be used to convert + strings to a format that is acceptable here. For example, a U-Name + of a space might be "Floor2W ClosedOffice5". + command: Text indicating the type of instruction that the DOE-2 object + executes. Commands are typically in capital letters and examples + include POLYGON, FLOOR, SPACE, EXTERIOR-WALL, WINDOW, CONSTRUCTION, etc. + keywords: A list of text with the same length as the values that denote + the attributes of the DOE-2 object. + values: A list of values with the same length as the keywords that describe + the values of the attributes for the object. + + Returns: + inp_str -- A DOE-2 INP string representing a single object. + """ + space_count = tuple((25 - len(str(n))) for n in keywords) + spc = tuple(s_c * ' ' if s_c > 0 else ' ' for s_c in space_count) + body_str = '\n'.join(' {}{}= {}'.format(kwd, s, val) + for kwd, s, val in zip(keywords, spc, values)) + inp_str = '"{}" = {}\n{}\n ..\n'.format(u_name, command, body_str) + return inp_str
+ + + +
+[docs] +def generate_inp_string_list_format(u_name, command, keywords, values): + """Get an INP string of a DOE-2 object with nicer formatting for list values. + + This method will process any values that are a list or tuple and format them + such that they are indented and more readable. This method is written in a + generic way so that it can describe practically any element of the INP Building + Description Language (BDL). + + Args: + u_name: Text for the unique, user-specified name of the object being created. + This must be 32 characters or less and not contain special or non-ASCII + characters. The clean_doe2_string method may be used to convert + strings to a format that is acceptable here. For example, a U-Name + of a space might be "Floor2W ClosedOffice5". + command: Text indicating the type of instruction that the DOE-2 object + executes. Commands are typically in capital letters and examples + include POLYGON, FLOOR, SPACE, EXTERIOR-WALL, WINDOW, CONSTRUCTION, etc. + keywords: A list of text with the same length as the values that denote + the attributes of the DOE-2 object. + values: A list of values with the same length as the keywords that describe + the values of the attributes for the object. The items in this list + can be list themselves, in which case they will be translated with + nice indented formatting. + + Returns: + inp_str -- A DOE-2 INP string representing a single object. + """ + space_count = tuple((25 - len(str(n))) for n in keywords) + spc = tuple(s_c * ' ' if s_c > 0 else ' ' for s_c in space_count) + body_strs = [] + for kwd, s, val in zip(keywords, spc, values): + if isinstance(val, (list, tuple)): + body_strs.append(' {}{}= ('.format(kwd, s)) + for v in val: + body_strs.append(' {},'.format(v)) + body_strs.append(' )') + else: + body_strs.append(' {}{}= {}'.format(kwd, s, val)) + body_str = '\n'.join(body_strs) + inp_str = '"{}" = {}\n{}\n ..\n'.format(u_name, command, body_str) + return inp_str
+ + + +
+[docs] +def clean_inp_file_contents(inp_file): + """Get the contents of an INP file without any commented lines. + + These comment lines might interfere with regex parsing if they are present. + + Args: + inp_file: A path to an IDF file containing objects to be parsed. + + Returns: + A single string for the clean IDF file contents. + """ + assert os.path.isfile(inp_file), 'Cannot find an INP file at: {}'.format(inp_file) + file_lines = [] + with open(inp_file, 'r') as ep_file: + for line in ep_file: + if not line.startswith('$'): + file_lines.append(line) + return ''.join(file_lines)
+ + + +
+[docs] +def parse_inp_string(inp_string): + """Parse an INP string of a single DOE-2 object into a list of values. + + Note that this method is only equipped to parse DOE-2 test strings + that originate from eQuest or from this package. It has not yet + been generalized to parse all formats of text formats that can + appear in a DOE-2 file. + + Args: + inp_string: An INP string for a single DOE-2 object. + + Returns: + A tuple with four elements. + + - u_name: Text for the unique name of the object. + + - command: Text for the type of instruction that the DOE-2 object executes. + + - keywords: A list of text with the same length as the values that denote + the attributes of the DOE-2 object. + + - values: A list of values with the same length as the keywords that describe + the values of the attributes for the object. + """ + inp_string = inp_string.strip() + inp_strings = inp_string.split('..') + assert len(inp_strings) == 2, 'Received more than one object in inp_string.' + inp_string = re.sub(r'\$.*\n', '\n', inp_strings[0]) # remove all comments + doe2_fields = [e_str.strip() for e_str in inp_string.split('=')] + u_name = doe2_fields.pop(0).replace('"', '') + split_field_1 = doe2_fields[0].split('\n') + command = split_field_1[0].strip() + keywords = [split_field_1[1].strip()] + values = [] + for field in doe2_fields[1:]: + split_field = [f.strip() for f in field.split('\n')] + if len(split_field) == 1: + values.append(split_field[0]) + elif len(split_field) == 2 and not split_field[0].endswith(','): + values.append(split_field[0]) + keywords.append(split_field[1]) + else: + v_lines, end_val = [], False + for row in split_field: + if row.endswith(',') or row.endswith('('): + v_lines.append(row) + elif not end_val: + v_lines.append(row) + end_val = True + else: + keywords.append(row) + values.append(' '.join(v_lines)) + return u_name, command, keywords, values
+ + + +
+[docs] +def header_comment_minor(header_text): + """Create a header given header_text, which can help organize the INP file contents. + """ + return \ + '$ ---------------------------------------------------------\n' \ + '$ {}\n' \ + '$ ---------------------------------------------------------\n'\ + '\n'.format(header_text)
+ + + +
+[docs] +def header_comment_major(header_text): + """Create a header given header_text, which can help organize the INP file contents. + """ + return \ + '$ *********************************************************\n' \ + '$ ** **\n' \ + '$ {}\n' \ + '$ ** **\n' \ + '$ *********************************************************\n'\ + '\n'.format(header_text)
+ + + +
+[docs] +def switch_statement_id(value): + """Convert a string into a 4-character ID that can be used for switch statements. + + This is needed to deal with the major limitations that DOE-2 places on + switch statement IDs, where every ID must be 4 characters + """ + # first remove dangerous characters + val = re.sub(r'[^.A-Za-z0-9:]', '', value) # remove all unusable characters + val = val.replace(' ', '').replace('_', '') # remove spaces and underscores + + # the user has formatted their program id specifically for switch statements + if len(val) <= 4: + return val + + # remove lower-case vowels for readability + val = re.sub(r'[aeiouy_\-]', '', val) + if '::' in val: # program id originating from openstudio-standards + val = val.split('::')[-1] + if len(val) >= 4: + return val[:4] + + # some special user-generated program id + val = val.replace(':', '') + if len(val) >= 4: + return val[-4:] + return val
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/honeybee_doe2/writer.html b/docs/_modules/honeybee_doe2/writer.html new file mode 100644 index 0000000..d254934 --- /dev/null +++ b/docs/_modules/honeybee_doe2/writer.html @@ -0,0 +1,1385 @@ + + + + + + + honeybee_doe2.writer — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for honeybee_doe2.writer

+# coding=utf-8
+"""Methods to write to inp."""
+from __future__ import division
+import os
+import math
+
+from ladybug_geometry.geometry2d import Vector2D, Point2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, LineSegment3D, Plane, Face3D
+from ladybug_geometry.bounding import bounding_box
+from honeybee.typing import clean_doe2_string, clean_string
+from honeybee.boundarycondition import Surface
+from honeybee.facetype import Wall, Floor, RoofCeiling
+from honeybee_energy.schedule.ruleset import ScheduleRuleset
+from honeybee_energy.construction.opaque import OpaqueConstruction
+from honeybee_energy.construction.air import AirBoundaryConstruction
+from honeybee_energy.lib.constructionsets import generic_construction_set
+
+from .config import DOE2_TOLERANCE, DOE2_ANGLE_TOL, GEO_DEC_COUNT, RECT_WIN_SUBD, \
+    DOE2_INTERIOR_BCS, GEO_CHARS, RES_CHARS
+from .util import generate_inp_string, header_comment_minor, \
+    header_comment_major, switch_statement_id
+from .grouping import group_rooms_by_doe2_level, group_rooms_by_doe2_hvac
+from .construction import opaque_material_to_inp, opaque_construction_to_inp, \
+    window_construction_to_inp, door_construction_to_inp, air_construction_to_inp
+from .schedule import energy_trans_sch_to_transmittance
+from .load import people_to_inp, lighting_to_inp, electric_equipment_to_inp, \
+    hot_water_and_gas_to_inp, infiltration_to_inp, setpoint_to_inp, ventilation_to_inp
+from .programtype import program_type_to_inp, switch_dict_to_space_inp, \
+    switch_dict_to_zone_inp
+from .simulation import SimulationPar
+
+
+
+[docs] +def face_3d_to_inp(face_3d, parent_name='HB object'): + """Convert a Face3D into a DOE-2 POLYGON string and info to position it in space. + + In this operation, all holes in the Face3D are ignored since they are not + supported by DOE-2. Collapsing the boundary and holes into a single list + that winds inward to cut out the holes will cause eQuest to raise an error. + + Args: + face_3d: A ladybug-geometry Face3D object for which a INP POLYGON + string will be generated. + parent_name: The name of the parent object that will reference this + POLYGON. This will be used to generate a name for the polygon. + Note that this should ideally have 24 characters or less so that + the result complies with the strict 32 character limit of DOE-2 + identifiers. + + Returns: + A tuple with two elements. + + - polygon_str: Text string for the INP polygon. + + - position_info: A tuple of values used to locate the Polygon in 3D space. + The order of properties in the tuple is as follows: (ORIGIN, TILT, AZIMUTH). + """ + # TODO: Consider adding a workaround for the DOE-2 limit of 40 vertices + # perhaps we can just say NO-SHAPE and specify AREA, VOLUME, and HEIGHT + # get the main properties that place the geometry in 3D space + pts_3d = face_3d.lower_left_counter_clockwise_boundary + tilt, azimuth = math.degrees(face_3d.tilt), math.degrees(face_3d.azimuth) + llc_origin = face_3d.lower_left_corner + llc_coords = [] + for coord in llc_origin: # avoid signed zero + coord = round(coord, GEO_DEC_COUNT) + clean_coord = 0.0 if coord == 0 else coord + llc_coords.append(clean_coord) + llc_origin = Point3D.from_array(llc_coords) + + # get the 2D vertices in the plane of the Face + if DOE2_ANGLE_TOL <= tilt <= 180 - DOE2_ANGLE_TOL: # vertical or tilted + proj_y = Vector3D(0, 0, 1).project(face_3d.normal) + proj_x = proj_y.rotate(face_3d.normal, math.pi / -2) + ref_plane = Plane(face_3d.normal, llc_origin, proj_x) + vertices = [ref_plane.xyz_to_xy(pt) for pt in pts_3d] + else: # horizontal; ensure vertices are always counterclockwise from above + azimuth = 180.0 + llc = Point2D(llc_origin.x, llc_origin.y) + vertices = [Point2D(v.x - llc.x, v.y - llc.y) for v in pts_3d] + if tilt > 180 - DOE2_ANGLE_TOL: + vertices = [Point2D(v.x, -v.y) for v in vertices] + + # format the vertices into a POLYGON string + verts_values = [] + for pt in vertices: + x_coord = round(pt.x, GEO_DEC_COUNT) + y_coord = round(pt.y, GEO_DEC_COUNT) + if x_coord == 0: # avoid signed zero + x_coord = 0.0 + if y_coord == 0: # avoid signed zero + y_coord = 0.0 + verts_values.append('({}, {})'.format(x_coord, y_coord)) + verts_keywords = tuple('V{}'.format(i + 1) for i in range(len(verts_values))) + poly_name = '{} Plg'.format(parent_name) + polygon_str = generate_inp_string(poly_name, 'POLYGON', verts_keywords, verts_values) + position_info = (llc_origin, tilt, azimuth) + return polygon_str, position_info
+ + + +
+[docs] +def face_3d_to_inp_rectangle(face_3d): + """Convert a Face3D into parameters needed to represent it as a rectangle in INP. + + The output of this function will be None if the Face3D cannot be represented + as an INP rectangle without alteration of the geometry. + + Args: + face_3d: A ladybug-geometry Face3D object which will be tested for whether + it can be represented as a rectangle in INP. + + Returns: + Will be None if the Face3D cannot be translated to a WIDTH and HEIGHT + without alteration of the geometry. If the geometry can be successfully + translated, this will be a tuple with five elements. + + - width: A number for the width of the rectangle. + + - height: A number for the height of the rectangle. + + - llc_origin: A Point3D for the lower-left corner of the Shade + geometry origin. + + - tilt: A number for the tilt of the rectangle in degrees. + + - azimuth: A number for the azimuth of the rectangle in degrees. + """ + if face_3d.boundary_polygon2d.is_rectangle(math.radians(DOE2_ANGLE_TOL)): + # check to see at least one of the segments is horizontal + are_segs_hor = [seg.max.z - seg.min.z <= DOE2_TOLERANCE + for seg in face_3d.boundary_segments] + if True in are_segs_hor: + pts_3d = face_3d.lower_left_counter_clockwise_boundary + llc_origin = pts_3d[0] + width = llc_origin.distance_to_point(pts_3d[1]) + height = llc_origin.distance_to_point(pts_3d[-1]) + if all(is_horiz for is_horiz in are_segs_hor): # horizontal; adjust azimuth + tilt = 0.0 + hgt_vec = llc_origin - pts_3d[-1] + hgt_vec_2d = Vector2D(hgt_vec.x, hgt_vec.y) + azimuth = math.degrees(Vector2D(0, 1).angle_clockwise(hgt_vec_2d)) + else: # vertical or tilted; use Face3D azimuth + tilt = math.degrees(face_3d.tilt) + azimuth = math.degrees(face_3d.azimuth) + return width, height, llc_origin, tilt, azimuth + return None
+ + + +
+[docs] +def shade_mesh_to_inp(shade_mesh, equest_version=None): + """Generate an INP string representation of a ShadeMesh. + + Args: + shade_mesh: A honeybee ShadeMesh for which an INP representation + will be returned. + equest_version: An optional text string to denote the version of eQuest + for which the Shade INP definition will be generated. If unspecified + or unrecognized, the latest version of eQuest will be used. + + Returns: + A tuple with two elements. + + - shade_polygons: A list of text strings for the INP polygons needed + to represent the ShadeMesh. + + - shade_defs: A list of text strings for the INP definitions needed + to represent the ShadeMesh. + """ + # extract the transmittance properties of the shade + base_id = clean_doe2_string(shade_mesh.identifier, GEO_CHARS) + trans_kwd = ['TRANSMITTANCE'] + trans_vals = [energy_trans_sch_to_transmittance(shade_mesh)] + t_sch_obj = shade_mesh.properties.energy.transmittance_schedule + if t_sch_obj is not None and not t_sch_obj.is_constant: + trans_kwd.append('SHADE-SCHEDULE') + t_shc_id = clean_doe2_string(t_sch_obj.identifier, RES_CHARS) + trans_vals.append('"{}"'.format(t_shc_id)) + + # set up collector lists and properties for all shades + shade_polygons, shade_defs = [], [] + + # loop through the mesh faces and create individual shade objects + for i, face in enumerate(shade_mesh.geometry.face_vertices): + doe2_id = '{}{}'.format(base_id, i) + f_geo = Face3D(face) + shd_geo = f_geo if f_geo.altitude > 0 else f_geo.flip() + clean_geo = shd_geo.remove_colinear_vertices(DOE2_TOLERANCE) + rect_info = face_3d_to_inp_rectangle(clean_geo) + if equest_version == '3.64': + shade_polygon = '' + if rect_info is not None: + width, height, origin, tilt, az = rect_info + else: # take the bounding rectangle around the Face3D + min_pt, max_pt = clean_geo.min, clean_geo.max + f_tilt = math.degrees(clean_geo.tilt) + if 90 - DOE2_ANGLE_TOL <= f_tilt <= 90 + DOE2_ANGLE_TOL: # vertical + seg_dir = Vector3D(max_pt.x - min_pt.x, max_pt.y - min_pt.y, 0) + seg = LineSegment3D(min_pt, seg_dir) + ext_dir = Vector3D(0, 0, max_pt.z - min_pt.z) + else: # horizontal or tilted + seg = LineSegment3D(min_pt, Vector3D(max_pt.x - min_pt.x, 0, 0)) + ext_dir = Vector3D(0, max_pt.y - min_pt.y, max_pt.z - min_pt.z) + rect_geo = Face3D.from_extrusion(seg, ext_dir) + width, height, origin, tilt, az = face_3d_to_inp_rectangle(rect_geo) + geo_kwd, geo_vals = ['HEIGHT', 'WIDTH'], [height, width] + elif rect_info is not None: # shade is a rectangle; translate it without POLYGON + width, height, origin, tilt, az = rect_info + geo_kwd = ['SHAPE', 'HEIGHT', 'WIDTH'] + geo_vals = ['RECTANGLE', height, width] + else: # otherwise, create the polygon string from the geometry + shade_polygon, pos_info = face_3d_to_inp(clean_geo, doe2_id) + shade_polygons.append(shade_polygon) + origin, tilt, az = pos_info + geo_kwd = ['SHAPE', 'POLYGON'] + geo_vals = ['POLYGON', '"{} Plg"'.format(doe2_id)] + geo_kwd.extend(('X-REF', 'Y-REF', 'Z-REF', 'TILT', 'AZIMUTH')) + geo_vals.extend((round(origin.x, GEO_DEC_COUNT), round(origin.y, GEO_DEC_COUNT), + round(origin.z, GEO_DEC_COUNT), tilt, az)) + # create the final shade definition, which includes the position information + keywords = geo_kwd + trans_kwd + values = geo_vals + trans_vals + shade_def = generate_inp_string(doe2_id, 'FIXED-SHADE', keywords, values) + shade_defs.append(shade_def) + + return shade_polygons, shade_defs
+ + + +
+[docs] +def shade_to_inp(shade, equest_version=None): + """Generate an INP string representation of a Shade. + + Args: + shade: A honeybee Shade for which an INP representation will be returned. + equest_version: An optional text string to denote the version of eQuest + for which the Shade INP definition will be generated. If unspecified + or unrecognized, the latest version of eQuest will be used. + + Returns: + A tuple with two elements. + + - shade_polygon: Text string for the INP polygon for the Shade. + + - shade_def: Text string for the INP definition of the Shade. + """ + # extract the transmittance properties of the shade + doe2_id = clean_doe2_string(shade.identifier, GEO_CHARS) + trans_kwd = ['TRANSMITTANCE'] + trans_vals = [energy_trans_sch_to_transmittance(shade)] + t_sch_obj = shade.properties.energy.transmittance_schedule + if t_sch_obj is not None and not t_sch_obj.is_constant: + trans_kwd.append('SHADE-SCHEDULE') + t_shc_id = clean_doe2_string(t_sch_obj.identifier, RES_CHARS) + trans_vals.append('"{}"'.format(t_shc_id)) + + # extract the geometry properties of the shade + shd_geo = shade.geometry if shade.altitude > 0 else shade.geometry.flip() + clean_geo = shd_geo.remove_colinear_vertices(DOE2_TOLERANCE) + rect_info = face_3d_to_inp_rectangle(clean_geo) + if equest_version == '3.64': + shade_polygon = '' + if rect_info is not None: + width, height, origin, tilt, az = rect_info + else: # take the bounding rectangle around the Face3D + min_pt, max_pt = clean_geo.min, clean_geo.max + f_tilt = math.degrees(clean_geo.tilt) + if 90 - DOE2_ANGLE_TOL <= f_tilt <= 90 + DOE2_ANGLE_TOL: # vertical + seg_dir = Vector3D(max_pt.x - min_pt.x, max_pt.y - min_pt.y, 0) + seg = LineSegment3D(min_pt, seg_dir) + ext_dir = Vector3D(0, 0, max_pt.z - min_pt.z) + else: # horizontal or tilted + seg = LineSegment3D(min_pt, Vector3D(max_pt.x - min_pt.x, 0, 0)) + ext_dir = Vector3D(0, max_pt.y - min_pt.y, max_pt.z - min_pt.z) + rect_geo = Face3D.from_extrusion(seg, ext_dir) + width, height, origin, tilt, az = face_3d_to_inp_rectangle(rect_geo) + geo_kwd, geo_vals = ['HEIGHT', 'WIDTH'], [height, width] + elif rect_info is not None: # shade is a rectangle; translate it without POLYGON + width, height, origin, tilt, az = rect_info + geo_kwd = ['SHAPE', 'HEIGHT', 'WIDTH'] + geo_vals = ['RECTANGLE', height, width] + shade_polygon = '' + else: # otherwise, create the polygon string from the geometry + shade_polygon, pos_info = face_3d_to_inp(clean_geo, doe2_id) + origin, tilt, az = pos_info + geo_kwd = ['SHAPE', 'POLYGON'] + geo_vals = ['POLYGON', '"{} Plg"'.format(doe2_id)] + geo_kwd.extend(('X-REF', 'Y-REF', 'Z-REF', 'TILT', 'AZIMUTH')) + geo_vals.extend((round(origin.x, GEO_DEC_COUNT), round(origin.y, GEO_DEC_COUNT), + round(origin.z, GEO_DEC_COUNT), tilt, az)) + + # create the final shade definition, which includes the position information + keywords = geo_kwd + trans_kwd + values = geo_vals + trans_vals + shade_def = generate_inp_string(doe2_id, 'FIXED-SHADE', keywords, values) + return shade_polygon, shade_def
+ + + +
+[docs] +def door_to_inp(door): + """Generate an INP string representation of a Door. + + Doors assigned to a parent Face will use the parent Face plane in order to + determine their XY coordinates. Otherwise, the Door's own plane will be used. + + Note that the resulting string does not include full construction definitions. + Also note that shades assigned to the Door are not included in the resulting + string. To write these objects into a final string, you must loop through the + Door.shades, and call the to.inp method on each one. + + Args: + door: A honeybee Door for which an INP representation will be returned. + + Returns: + Text string for the INP definition of the Door. + """ + # extract the plane information from the parent geometry + if door.has_parent: + parent_llc = door.parent.geometry.lower_left_corner + rel_plane = door.parent.geometry.plane + else: + parent_llc = door.geometry.lower_left_corner + rel_plane = door.geometry.plane + # get the LLC and URC of the bounding rectangle of the door + apt_llc = door.geometry.lower_left_corner + apt_urc = door.geometry.upper_right_corner + + # determine the width and height and origin in the parent coordinate system + if DOE2_ANGLE_TOL <= door.tilt <= 180 - DOE2_ANGLE_TOL: # vertical or tilted + proj_y = Vector3D(0, 0, 1).project(rel_plane.n) + proj_x = proj_y.rotate(rel_plane.n, math.pi / -2) + else: # located within the XY plane + proj_x = Vector3D(1, 0, 0) + ref_plane = Plane(rel_plane.n, parent_llc, proj_x) + min_2d = ref_plane.xyz_to_xy(apt_llc) + max_2d = ref_plane.xyz_to_xy(apt_urc) + width = round(max_2d.x - min_2d.x, GEO_DEC_COUNT) + height = round(max_2d.y - min_2d.y, GEO_DEC_COUNT) + + # create the aperture definition + doe2_id = clean_doe2_string(door.identifier, GEO_CHARS) + dr_con = door.properties.energy.construction + constr_o_name = dr_con.identifier if isinstance(dr_con, OpaqueConstruction) \ + else dr_con.identifier + '_d' + constr = clean_doe2_string(constr_o_name, RES_CHARS) + keywords = ('X', 'Y', 'WIDTH', 'HEIGHT', 'CONSTRUCTION') + values = (round(min_2d.x, GEO_DEC_COUNT), round(min_2d.y, GEO_DEC_COUNT), + width, height, '"{}"'.format(constr)) + door_def = generate_inp_string(doe2_id, 'DOOR', keywords, values) + return door_def
+ + + +
+[docs] +def aperture_to_inp(aperture): + """Generate an INP string representation of a Aperture. + + Apertures assigned to a parent Face will use the parent Face plane in order to + determine their XY coordinates. Otherwise, the Aperture's own plane will be used. + + Note that the resulting string does not include full construction definitions. + Also note that shades assigned to the Aperture are not included in the resulting + string. To write these objects into a final string, you must loop through the + Aperture.shades, and call the to.inp method on each one. + + Args: + aperture: A honeybee Aperture for which an INP representation will be returned. + + Returns: + Text string for the INP definition of the Aperture. + """ + # extract the plane information from the parent geometry + if aperture.has_parent: + parent_llc = aperture.parent.geometry.lower_left_corner + rel_plane = aperture.parent.geometry.plane + else: + parent_llc = aperture.geometry.lower_left_corner + rel_plane = aperture.geometry.plane + # get the LLC and URC of the bounding rectangle of the aperture + apt_llc = aperture.geometry.lower_left_corner + apt_urc = aperture.geometry.upper_right_corner + + # determine the width and height and origin in the parent coordinate system + if DOE2_ANGLE_TOL <= aperture.tilt <= 180 - DOE2_ANGLE_TOL: # vertical or tilted + proj_y = Vector3D(0, 0, 1).project(rel_plane.n) + proj_x = proj_y.rotate(rel_plane.n, math.pi / -2) + else: # located within the XY plane + proj_x = Vector3D(1, 0, 0) + ref_plane = Plane(rel_plane.n, parent_llc, proj_x) + min_2d = ref_plane.xyz_to_xy(apt_llc) + max_2d = ref_plane.xyz_to_xy(apt_urc) + width = round(max_2d.x - min_2d.x, GEO_DEC_COUNT) + height = round(max_2d.y - min_2d.y, GEO_DEC_COUNT) + + # create the aperture definition + doe2_id = clean_doe2_string(aperture.identifier, GEO_CHARS) + constr_o_name = aperture.properties.energy.construction.identifier + constr = clean_doe2_string(constr_o_name, RES_CHARS) + keywords = ('X', 'Y', 'WIDTH', 'HEIGHT', 'GLASS-TYPE') + values = (round(min_2d.x, GEO_DEC_COUNT), round(min_2d.y, GEO_DEC_COUNT), + width, height, '"{}"'.format(constr)) + aperture_def = generate_inp_string(doe2_id, 'WINDOW', keywords, values) + return aperture_def
+ + + +
+[docs] +def face_to_inp(face, space_origin=Point3D(0, 0, 0), location=None): + """Generate an INP string representation of a Face. + + Note that the resulting string does not include full construction definitions. + + Also note that this does not include any of the shades assigned to the Face + in the resulting string. Nor does it include the strings for the + apertures or doors. To write these objects into a final string, you must + loop through the Face.apertures, and Face.doors and call the to.inp method + on each one. + + Args: + face: A honeybee Face for which an INP representation will be returned. + space_origin: A ladybug-geometry Point3D for the origin of the space + to which the Face is assigned. (Default: (0, 0, 0)). + location: An optional text string to note the DOE-2 LOCATION of the + Face on the parent Room. When this is specified, the Face will be + written without using a POLYGON. (Default: None). + + Returns: + A tuple with two elements. + + - face_polygon: Text string for the INP polygon for the Face. + + - face_def: Text string for the INP definition of the Face. + """ + # set up attributes based on the face type and boundary condition + f_type_str, bc_str = str(face.type), str(face.boundary_condition) + if bc_str == 'Outdoors': + doe2_type = 'EXTERIOR-WALL' # DOE2 uses walls for a lot of things + if f_type_str == 'RoofCeiling': + doe2_type = 'ROOF' + elif bc_str in DOE2_INTERIOR_BCS or f_type_str == 'AirBoundary': + doe2_type = 'INTERIOR-WALL' # DOE2 uses walls for a lot of things + else: # likely ground or some other fancy ground boundary condition + doe2_type = 'UNDERGROUND-WALL' + + # process the face identifier and the construction + doe2_id = clean_doe2_string(face.identifier, GEO_CHARS) + constr_o_name = face.properties.energy.construction.identifier + constr = clean_doe2_string(constr_o_name, RES_CHARS) + + # process the geometry + if location is not None: + keywords = ['CONSTRUCTION', 'LOCATION'] + values = ['"{}"'.format(constr), location] + face_polygon = '' + else: # create the polygon string from the geometry + f_geo = face.geometry.remove_colinear_vertices(DOE2_TOLERANCE) + face_polygon, pos_info = face_3d_to_inp(f_geo, doe2_id) + face_origin, tilt, az = pos_info + origin = face_origin - space_origin + keywords = ['POLYGON', 'CONSTRUCTION', 'TILT', 'AZIMUTH', 'X', 'Y', 'Z'] + values = ['"{} Plg"'.format(doe2_id), '"{}"'.format(constr), tilt, az, + round(origin.x, GEO_DEC_COUNT), + round(origin.y, GEO_DEC_COUNT), + round(origin.z, GEO_DEC_COUNT)] + + # add information related to the boundary condition + if bc_str == 'Surface': + adj_room = face.boundary_condition.boundary_condition_objects[-1] + adj_id = clean_doe2_string(adj_room, GEO_CHARS) + values.append('"{}"'.format(adj_id)) + keywords.append('NEXT-TO') + elif doe2_type == 'INTERIOR-WALL': # assume that it is adiabatic + keywords.append('INT-WALL-TYPE') + values.append('ADIABATIC') + if location is None and f_type_str == 'Floor' and doe2_type != 'INTERIOR-WALL': + keywords.append('LOCATION') + values.append('BOTTOM') + + # create the face definition + face_def = generate_inp_string(doe2_id, doe2_type, keywords, values) + return face_polygon, face_def
+ + + +
+[docs] +def room_to_inp(room, floor_origin=Point3D(0, 0, 0), floor_height=None, + exclude_interior_walls=False, exclude_interior_ceilings=False): + """Generate an INP string representation of a Room. + + This will include the Room's constituent Faces, Apertures and Doors with + each of these elements being a separate item in the list of strings returned. + However, any shades assigned to the Room or its constituent elements are + excluded and should be written by looping through the shades on the parent model. + + The resulting string will also include all internal gain definitions for the + Room (people, lights, equipment), infiltration definitions, ventilation + requirements, and thermostat objects. + + However, complete schedule definitions assigned to these load objects are + excluded as well as any construction or material definitions. + + Args: + floor_origin: A ladybug-geometry Point3D for the origin of the + floor (aka. story) to which the Room is a part of. (Default: (0, 0, 0)). + floor_height: An optional number for the parent story SPACE-HEIGHT, + which will be used to check the Room geometry to determine if + it must be written using POLYGONs. If None, no check will be + performed. (Default: None) + exclude_interior_walls: Boolean to note whether interior wall Faces + should be excluded from the resulting string. (Default: False). + exclude_interior_ceilings: Boolean to note whether interior ceiling + Faces should be excluded from the resulting string. (Default: False). + + Returns: + A tuple with two elements. + + - room_polygons: A list of text strings for the INP polygons needed + to represent the Room and all of its constituent Faces. + + - room_defs: A list of text strings for the INP definitions needed + to represent the Room and all of its constituent Faces, Apertures + and Doors. + """ + # process the room identifier + doe2_id = clean_doe2_string(room.identifier, GEO_CHARS) + + # set up attributes based on the Room's energy properties + energy_attr_keywords = ['ZONE-TYPE'] + energy_attr_values = [room_doe2_conditioning_type(room)] + if room.properties.energy._program_type is not None: + energy_attr_keywords.append('C-ACTIVITY-DESC') + prog_uid = switch_statement_id(room.properties.energy.program_type.identifier) + energy_attr_values.append('*{}*'.format(prog_uid)) + # people + ppl_kwd, ppl_val = people_to_inp(room.properties.energy._people) + energy_attr_keywords.extend(ppl_kwd) + energy_attr_values.extend(ppl_val) + # lighting + lgt_kwd, lgt_val = lighting_to_inp(room.properties.energy._lighting) + energy_attr_keywords.extend(lgt_kwd) + energy_attr_values.extend(lgt_val) + # equipment + eq_kwd, eq_val = electric_equipment_to_inp( + room.properties.energy._electric_equipment) + energy_attr_keywords.extend(eq_kwd) + energy_attr_values.extend(eq_val) + # hot water and gas usage + shw_gas_kwd, shw_gas_val = hot_water_and_gas_to_inp( + room.properties.energy.service_hot_water, + room.properties.energy.gas_equipment, room.floor_area) + energy_attr_keywords.extend(shw_gas_kwd) + energy_attr_values.extend(shw_gas_val) + # infiltration + inf_kwd, inf_val = infiltration_to_inp(room.properties.energy._infiltration) + energy_attr_keywords.extend(inf_kwd) + energy_attr_values.extend(inf_val) + + def _is_room_3d_extruded(hb_room): + """Test if a Room is a pure extrusion. + + Args: + hb_room: The Honeybee Room to be tested. + + Returns: + A tuple with two elements. + + - is_extrusion: True if the geometry is an extrusion. False if not. + + - face_orientations: A list of integers that aligns with the Room.faces + and denotes whether each face is downward (-1), vertical (0) or + upward (+1). + """ + # first check if we have to use POLYGONS because of the parent SPACE-HEIGHT + if floor_height is not None: + room_height = room.max.z - room.min.z + if abs(room_height - floor_height) > DOE2_TOLERANCE: + return False, [] + + # set up the parameters for evaluating vertical or horizontal + vert_vec = Vector3D(0, 0, 1) + min_v_ang = math.radians(DOE2_ANGLE_TOL) + max_v_ang = math.pi - min_v_ang + min_h_ang = (math.pi / 2) - min_v_ang + max_h_ang = (math.pi / 2) + min_v_ang + + # loop through the Room faces and test them + face_orientations = [] + for face in hb_room.faces: + try: # first make sure that the geometry is not degenerate + clean_geo = face.geometry.remove_colinear_vertices(DOE2_TOLERANCE) + v_ang = clean_geo.normal.angle(vert_vec) + if v_ang <= min_v_ang: + face_orientations.append(1) + continue + elif v_ang >= max_v_ang: + face_orientations.append(-1) + continue + elif min_h_ang <= v_ang <= max_h_ang: + face_orientations.append(0) + continue + return False, [] + except AssertionError: # degenerate face to ignore + pass + return True, face_orientations + + # if the room is extruded, determine the locations of each face + face_locations = [] + is_extrusion, face_orientations = _is_room_3d_extruded(room) + if is_extrusion: # try to translate without using POLYGON for the Room faces + if room.properties.doe2.space_polygon_geometry is not None: + r_geo = room.properties.doe2.space_polygon_geometry + else: + try: + r_geo = room.horizontal_boundary( + match_walls=True, tolerance=DOE2_TOLERANCE) + except Exception: # we may need to write it with NO-SHAPE + r_geo = None + if r_geo is not None: + r_geo = r_geo if r_geo.normal.z >= 0 else r_geo.flip() + r_geo = r_geo.remove_duplicate_vertices(DOE2_TOLERANCE) + rm_pts = r_geo.lower_left_counter_clockwise_boundary + rm_height = room.max.z - room.min.z + ceil_count = len([orient for orient in face_orientations if orient == 1]) + floor_count = len([orient for orient in face_orientations if orient == -1]) + for face, orient in zip(room.faces, face_orientations): + if orient == 0: # wall to associate with a room vertex + clean_geo = face.geometry.remove_colinear_vertices(DOE2_TOLERANCE) + face_height = face.max.z - face.min.z + if clean_geo.boundary_polygon2d.is_rectangle(DOE2_ANGLE_TOL) and \ + abs(rm_height - face_height) <= DOE2_TOLERANCE: + f_origin = face.geometry.lower_left_corner + for i, r_pt in enumerate(rm_pts): + if f_origin.is_equivalent(r_pt, DOE2_TOLERANCE): + face_locations.append('SPACE-V{}'.format(i + 1)) + break + else: # not associated with any Room vertex + face_locations.append(None) + else: # not a rectangular geometry + face_locations.append(None) + elif orient == 1: + loc = 'TOP' if ceil_count == 1 and not r_geo.has_holes else None + face_locations.append(loc) + else: + loc = 'BOTTOM' if floor_count == 1 else None + face_locations.append(loc) + + # if the room is not extruded, just use the generic horizontal boundary + if len(face_locations) == 0: + if room.properties.doe2.space_polygon_geometry is not None: + r_geo = room.properties.doe2.space_polygon_geometry + else: + try: + r_geo = room.horizontal_boundary( + match_walls=False, tolerance=DOE2_TOLERANCE) + r_geo = r_geo if r_geo.normal.z >= 0 else r_geo.flip() + r_geo = r_geo.remove_colinear_vertices(tolerance=DOE2_TOLERANCE) + except Exception: # we may need to write it with NO-SHAPE + r_geo = None + face_locations = [None] * len(room.faces) + + # create the space definition + if r_geo is None: # we have to use NO-SHAPE + msg = 'Using NO-SHAPE for SPACE "{}".'.format(room.display_name) + print(msg) + space_origin = room.min + origin = space_origin - floor_origin + keywords = ['SHAPE', 'AZIMUTH', 'X', 'Y', 'Z', 'AREA', 'VOLUME'] + values = ['NO-SHAPE', 0, round(origin.x, GEO_DEC_COUNT), + round(origin.y, GEO_DEC_COUNT), round(origin.z, GEO_DEC_COUNT), + round(room.floor_area, GEO_DEC_COUNT), + round(room.volume, GEO_DEC_COUNT)] + if room.multiplier != 1: + keywords.append('MULTIPLIER') + values.append(room.multiplier) + keywords.extend(energy_attr_keywords) + values.extend(energy_attr_values) + space_def = generate_inp_string(doe2_id, 'SPACE', keywords, values) + room_polygons = [] + room_defs = [space_def] + else: + # create the room polygon string from the geometry + room_polygon, pos_info = face_3d_to_inp(r_geo, doe2_id) + space_origin, _, _ = pos_info + origin = space_origin - floor_origin + # create the space definition, which includes the position info + keywords = ['SHAPE', 'POLYGON', 'AZIMUTH', 'X', 'Y', 'Z', 'VOLUME'] + values = ['POLYGON', '"{} Plg"'.format(doe2_id), 0, + round(origin.x, GEO_DEC_COUNT), round(origin.y, GEO_DEC_COUNT), + round(origin.z, GEO_DEC_COUNT), round(room.volume, GEO_DEC_COUNT)] + if room.multiplier != 1: + keywords.append('MULTIPLIER') + values.append(room.multiplier) + keywords.extend(energy_attr_keywords) + values.extend(energy_attr_values) + space_def = generate_inp_string(doe2_id, 'SPACE', keywords, values) + room_polygons = [room_polygon] + room_defs = [space_def] + + # gather together all face definitions and polygons to define the room + for face, f_loc in zip(room.faces, face_locations): + # first check if this is a face that should be excluded + if isinstance(face.boundary_condition, Surface): + if exclude_interior_walls and isinstance(face.type, Wall): + continue + elif exclude_interior_ceilings and \ + isinstance(face.type, (Floor, RoofCeiling)): + continue + # add the face definition along with all apertures and doors + face_polygon, face_def = face_to_inp(face, space_origin, f_loc) + if face_polygon != '': + room_polygons.append(face_polygon) + room_defs.append(face_def) + for ap in face.apertures: + ap_def = aperture_to_inp(ap) + room_defs.append(ap_def) + if not isinstance(face.boundary_condition, Surface): + for dr in face.doors: + dr_def = door_to_inp(dr) + room_defs.append(dr_def) + return room_polygons, room_defs
+ + + +
+[docs] +def model_to_inp( + model, simulation_par=None, hvac_mapping='Story', + exclude_interior_walls=False, exclude_interior_ceilings=False, equest_version=None +): + """Generate an INP string representation of a Model. + + The resulting string will include all geometry (Rooms, Faces, Apertures, + Doors, Shades), all fully-detailed constructions + materials, all fully-detailed + schedules, and the room properties. It will also include the simulation + parameters. Essentially, the string includes everything needed to simulate + the model. + + Args: + model: A honeybee Model for which an INP representation will be returned. + simulation_par: A honeybee-doe2 SimulationPar object to specify how the + DOE-2 simulation should be run. If None, default simulation + parameters will be generated, which will run the simulation for the + full year. (Default: None). + hvac_mapping: Text to indicate how HVAC systems should be assigned to the + exported model. Story will assign one HVAC system for each distinct + level polygon, Model will use only one HVAC system for the whole model + and AssignedHVAC will follow how the HVAC systems have been assigned + to the Rooms.properties.energy.hvac. Choose from the options + below. (Default: Story). + + * Room + * Story + * Model + * AssignedHVAC + + exclude_interior_walls: Boolean to note whether interior wall Faces + should be excluded from the resulting string. (Default: False). + exclude_interior_ceilings: Boolean to note whether interior ceiling + Faces should be excluded from the resulting string. (Default: False). + equest_version: An optional text string to denote the version of eQuest + for which the INP definition will be generated. If unspecified + or unrecognized, the latest version of eQuest will be used. + + Usage: + + .. code-block:: python + + import os + from ladybug.futil import write_to_file + from honeybee.model import Model + from honeybee.room import Room + from honeybee.config import folders + + # Crate an input Model + room = Room.from_box('Tiny House Zone', 5, 10, 3) + room.properties.energy.program_type = office_program + room.properties.energy.add_default_ideal_air() + model = Model('Tiny House', [room]) + + # create the INP string for the model + inp_str = model.to.inp(model) + + # write the final string into an INP + inp = os.path.join(folders.default_simulation_folder, 'test_file', 'in.inp') + write_to_file(inp, inp_str, True) + """ + # duplicate model to avoid mutating it as we edit it for INP export + original_model = model + model = model.duplicate() + # scale the model if the units are not feet + if model.units != 'Feet': + model.convert_to_units('Feet') + # remove degenerate geometry within native DOE-2 tolerance + try: + model.remove_degenerate_geometry(DOE2_TOLERANCE) + except ValueError: + error = 'Failed to remove degenerate Rooms.\nYour Model units system is: {}. ' \ + 'Is this correct?'.format(original_model.units) + raise ValueError(error) + # convert all of the Aperture geometries to rectangles so they can be translated + model.rectangularize_apertures( + subdivision_distance=RECT_WIN_SUBD, max_separation=0.0, + merge_all=True, resolve_adjacency=False + ) + # reset identifiers to valid DOE-2 U-Names that are derived from the display names + for room in model.rooms: + base_name = clean_doe2_string(room.display_name, GEO_CHARS - 2) + room.display_name = clean_string(base_name) + for face in room.faces: + base_name = clean_doe2_string(face.display_name, GEO_CHARS - 2) + face.display_name = clean_string(base_name) + for ap in face.apertures: + base_name = clean_doe2_string(ap.display_name, GEO_CHARS - 2) + ap.display_name = clean_string(base_name) + for dr in face.doors: + base_name = clean_doe2_string(dr.display_name, GEO_CHARS - 2) + dr.display_name = clean_string(base_name) + for shade in model.shades: + base_name = clean_doe2_string(shade.display_name, GEO_CHARS - 2) + shade.display_name = clean_string(base_name) + for shd_mesh in model.shade_meshes: + base_name = clean_doe2_string(shd_mesh.display_name, GEO_CHARS - 2) + shd_mesh.display_name = clean_string(base_name) + model.reset_ids() + # assign any doe2 properties previously supported through user_data + for room in model.rooms: + room.properties.doe2.apply_properties_from_user_data() + + # write the simulation parameters into the string + model_str = ['INPUT ..\n\n'] + sim_par = simulation_par if simulation_par is not None else SimulationPar() + model_str.append(sim_par.to_inp()) + + # write all of the schedules + all_day_scheds, all_week_scheds, all_year_scheds = [], [], [] + used_day_sched_ids, used_day_count = {}, 1 + all_scheds = model.properties.energy.schedules + for sched in all_scheds: + if isinstance(sched, ScheduleRuleset): + year_schedule, week_schedules = sched.to_inp() + # check that day schedules aren't referenced by other model schedules + day_scheds = [] + for day in sched.day_schedules: + sch_doe2_id = clean_doe2_string(day.identifier, RES_CHARS) + if sch_doe2_id not in used_day_sched_ids: + day_scheds.append(day.to_inp(sched.schedule_type_limit)) + used_day_sched_ids[sch_doe2_id] = day + elif day != used_day_sched_ids[sch_doe2_id]: + new_day = day.duplicate() + new_day.identifier = 'Schedule Day {}'.format(used_day_count) + day_scheds.append(new_day.to_inp(sched.schedule_type_limit)) + for i, week_sch in enumerate(week_schedules): + old_day_id = clean_doe2_string(day.identifier, RES_CHARS) + new_day_id = clean_doe2_string(new_day.identifier, RES_CHARS) + week_schedules[i] = week_sch.replace(old_day_id, new_day_id) + used_day_count += 1 + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + else: # ScheduleFixedInterval + year_schedule, week_schedules, year_schedule = sched.to_inp() + all_day_scheds.extend(day_scheds) + all_week_scheds.extend(week_schedules) + all_year_scheds.append(year_schedule) + model_str.append(header_comment_minor('Day Schedules')) + model_str.extend(all_day_scheds) + model_str.append(header_comment_minor('Week Schedules')) + model_str.extend(all_week_scheds) + model_str.append(header_comment_minor('Annual Schedules')) + model_str.extend(all_year_scheds) + + # write all of the materials and constructions + window_constructions = model.properties.energy.aperture_constructions() + door_constructions = model.properties.energy.door_constructions() + drc_ids = set([con.identifier for con in door_constructions]) + materials = [] + construction_strs = [] + all_constrs = model.properties.energy.constructions + \ + generic_construction_set.constructions_unique + for constr in set(all_constrs): + if isinstance(constr, OpaqueConstruction) and constr.identifier not in drc_ids: + materials.extend(constr.materials) + construction_strs.append(opaque_construction_to_inp(constr)) + elif isinstance(constr, AirBoundaryConstruction): + construction_strs.append(air_construction_to_inp(constr)) + model_str.append(header_comment_minor('Materials / Layers / Constructions')) + model_str.extend([opaque_material_to_inp(mat) for mat in set(materials)]) + model_str.extend(construction_strs) + model_str.append(header_comment_minor('Glass Types')) + for w_con in window_constructions: + model_str.append(window_construction_to_inp(w_con)) + model_str.append(header_comment_minor('Door Construction')) + for dr_con in door_constructions: + if not isinstance(dr_con, OpaqueConstruction): + dr_con = dr_con.duplicate() + dr_con.identifier = dr_con.identifier + '_d' + model_str.append(door_construction_to_inp(dr_con)) + + # gather together all of the program types in a dictionary for switch statements + switch_dict = {} + for program in model.properties.energy.program_types: + program_type_to_inp(program, switch_dict) + + # loop through rooms grouped by floor level and boundary to get polygons + level_room_groups, level_geos, level_names = \ + group_rooms_by_doe2_level(model.rooms, model.tolerance) + bldg_polygons, bldg_geo_defs = [], [] + for flr_rooms, flr_geo, flr_name in zip(level_room_groups, level_geos, level_names): + # create the story definition + rooms_f2c = [room.max.z - room.min.z for room in flr_rooms] + sotry_f2f = max(rooms_f2c) + median_room_f2c = sorted(rooms_f2c)[int(len(rooms_f2c) / 2)] + if flr_geo is None: # write the level with NO-SHAPE + msg = 'Using NO-SHAPE for FLOOR "{}".'.format(flr_name) + print(msg) + flr_origin, _ = bounding_box([room.min for room in flr_rooms]) + flr_area = sum(room.floor_area for room in flr_rooms) + flr_volume = sum(room.volume for room in flr_rooms) + flr_keys = ['SHAPE', 'AREA', 'VOLUME', 'AZIMUTH', 'X', 'Y', 'Z', + 'SPACE-HEIGHT', 'FLOOR-HEIGHT'] + flr_vals = ['NO-SHAPE', round(flr_area, GEO_DEC_COUNT), + round(flr_volume, GEO_DEC_COUNT), 0, + flr_origin.x, flr_origin.y, flr_origin.z, + round(median_room_f2c, 3), round(sotry_f2f, 3)] + else: # write the level with a POLYGON + flr_polygon, pos_info = face_3d_to_inp(flr_geo, flr_name) + flr_origin, _, _ = pos_info + flr_keys = ['SHAPE', 'POLYGON', 'AZIMUTH', 'X', 'Y', 'Z', + 'SPACE-HEIGHT', 'FLOOR-HEIGHT'] + flr_vals = ['POLYGON', '"{} Plg"'.format(flr_name), 0, + flr_origin.x, flr_origin.y, flr_origin.z, + round(median_room_f2c, 3), round(sotry_f2f, 3)] + bldg_polygons.append(flr_polygon) + r_mult = flr_rooms[0].multiplier + if r_mult != 1 and all(room.multiplier == r_mult for room in flr_rooms): + # set the multiplier for the entire story instead of room-by-room + flr_keys.append('MULTIPLIER') + flr_vals.append(r_mult) + for room in flr_rooms: + room.multiplier = 1 + flr_def = generate_inp_string(flr_name, 'FLOOR', flr_keys, flr_vals) + bldg_geo_defs.append(flr_def) + # add the room and face definitions + polygons + for room in flr_rooms: + room_polygons, room_defs = room_to_inp( + room, flr_origin, median_room_f2c, + exclude_interior_walls, exclude_interior_ceilings) + bldg_polygons.extend(room_polygons) + bldg_geo_defs.extend(room_defs) + + # loop through the shades and get their definitions and polygons + shade_polygons, shade_geo_defs = [], [] + for shade in model.shades: + shade_polygon, shade_def = shade_to_inp(shade, equest_version) + if shade_polygon != '': # shade written with a RECTANGLE + shade_polygons.append(shade_polygon) + shade_geo_defs.append(shade_def) + for shade in model.shade_meshes: + shade_polygon, shade_def = shade_mesh_to_inp(shade, equest_version) + shade_polygons.extend(shade_polygon) + shade_geo_defs.extend(shade_def) + + # write the building and shade geometry into the INP + model_str.append(header_comment_minor('Polygons')) + model_str.extend(bldg_polygons) + model_str.append(header_comment_minor('Wall Parameters')) + model_str.append(header_comment_minor('Fixed and Building Shades')) + model_str.extend(shade_polygons) + model_str.extend(shade_geo_defs) + model_str.append(header_comment_minor('Misc Cost Related Objects')) + model_str.append(header_comment_major('Performance Curves')) + model_str.append(header_comment_major('Floors / Spaces / Walls / Windows / Doors')) + model_str.append(switch_dict_to_space_inp(switch_dict)) + model_str.extend(bldg_geo_defs) + + # write in placeholder headers for various HVAC components + model_str.append(header_comment_major('Electric & Fuel Meters')) + for meter in ('Electric Meters', 'Fuel Meters', 'Master Meters'): + model_str.append(header_comment_minor(meter)) + model_str.append(header_comment_major('HVAC Circulation Loops / Plant Equipment')) + hvac_comp_types = ( + 'Pumps', 'Heat Exchangers', 'Circulation Loops', 'Chillers', 'Boilers', + 'Domestic Water Heaters', 'Heat Rejection', 'Tower Free Cooling', + 'Photovoltaic Modules', 'Electric Generators', 'Thermal Storage', + 'Ground Loop Heat Exchangers', 'Compliance DHW (residential dwelling units)') + for comp in hvac_comp_types: + model_str.append(header_comment_minor(comp)) + model_str.append(header_comment_major('Steam & Chilled Water Meters')) + model_str.append(header_comment_minor('Steam Meters')) + model_str.append(header_comment_minor('Chilled Water Meters')) + model_str.append(header_comment_major('HVAC Systems / Zones')) + model_str.append(switch_dict_to_zone_inp(switch_dict)) + + # assign HVAC systems given the specified hvac_mapping + if hvac_mapping.upper() == 'STORY': + hvac_rooms = level_room_groups + hvac_names = ['{}_Sys'.format(name) for name in level_names] + else: + hvac_rooms, hvac_names = group_rooms_by_doe2_hvac(model, hvac_mapping) + for hvac_name, rooms in zip(hvac_names, hvac_rooms): + # create the definition of the HVAC + hvac_keys = ('TYPE', 'HEAT-SOURCE', 'SYSTEM-REPORTS') + hvac_vals = ('SUM', 'NONE', 'NO') + hvac_def = generate_inp_string(hvac_name, 'SYSTEM', hvac_keys, hvac_vals) + model_str.append(hvac_def) + for room in rooms: + space_name = clean_doe2_string(room.identifier, GEO_CHARS) + zone_name = '{}_Zn'.format(space_name) + zone_type = room_doe2_conditioning_type(room) + zone_keys = ['TYPE', 'SIZING-OPTION', 'SPACE'] + zone_vals = [zone_type, 'ADJUST-LOADS', '"{}"'.format(space_name)] + if room.properties.energy.is_conditioned: + if room.properties.energy._setpoint is not None: + stp_kwd, stp_val = setpoint_to_inp(room.properties.energy._setpoint) + zone_keys.extend(stp_kwd) + zone_vals.extend(stp_val) + vt_kwd, vt_val = ventilation_to_inp(room.properties.energy._ventilation) + zone_keys.extend(vt_kwd) + zone_vals.extend(vt_val) + hvac_kwd, hvac_val = room.properties.doe2.to_inp() + zone_keys.extend(hvac_kwd) + zone_vals.extend(hvac_val) + zone_def = generate_inp_string(zone_name, 'ZONE', zone_keys, zone_vals) + model_str.append(zone_def) + + # provide a few last comment headers and end the file + model_str.append(header_comment_major('Metering & Misc HVAC')) + model_str.append(header_comment_minor('Equipment Controls')) + model_str.append(header_comment_minor('Load Management')) + model_str.append(header_comment_major('Utility Rates')) + for rate in ('Ratchets', 'Block Charges', 'Utility Rates'): + model_str.append(header_comment_minor(rate)) + model_str.append(header_comment_major('Output Reporting')) + report_types = ( + 'Loads Non-Hourly Reporting', 'Systems Non-Hourly Reporting', + 'Plant Non-Hourly Reporting', 'Economics Non-Hourly Reporting', + 'Hourly Reporting', 'THE END') + for report in report_types: + model_str.append(header_comment_minor(report)) + model_str.append('END ..\nCOMPUTE ..\nSTOP ..\n') + + # create the final string and ensure that it is windows-compatible + inp_str = '\n'.join(model_str) + if os.name != 'nt': # we are on a unix-based system + inp_str = inp_str.replace('\n', '\r\n') + return inp_str
+ + + +
+[docs] +def room_doe2_conditioning_type(room): + """Get the DOE-2 conditioning type to be assigned to both the Space and Zone. + + Args: + room: A Honeybee Room for which the conditioning type will be returned. + """ + if room.exclude_floor_area: + return 'PLENUM' + elif room.properties.energy.is_conditioned: + return 'CONDITIONED' + else: + return 'UNCONDITIONED'
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/docs/_modules/index.html b/docs/_modules/index.html new file mode 100644 index 0000000..3e0466c --- /dev/null +++ b/docs/_modules/index.html @@ -0,0 +1,322 @@ + + + + + + + Overview: module code — honeybee-doe2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + \ No newline at end of file diff --git a/docs/_sources/cli/index.rst.txt b/docs/_sources/cli/index.rst.txt new file mode 100644 index 0000000..44374ab --- /dev/null +++ b/docs/_sources/cli/index.rst.txt @@ -0,0 +1,15 @@ +CLI Docs +======== + +Installation +------------ + +To check if the command line is installed correctly use ``honeybee-doe2 --help`` + +Commands +-------- +.. toctree:: + :maxdepth: 1 + + translate + __init__ diff --git a/docs/_sources/cli/main.rst.txt b/docs/_sources/cli/main.rst.txt new file mode 100644 index 0000000..4d8dce0 --- /dev/null +++ b/docs/_sources/cli/main.rst.txt @@ -0,0 +1,7 @@ +main +==== + +.. click:: honeybee_doe2.cli.__init__:doe2 + :prog: honeybee-doe2 + :show-nested: + :commands: diff --git a/docs/_sources/cli/translate.rst.txt b/docs/_sources/cli/translate.rst.txt new file mode 100644 index 0000000..28df996 --- /dev/null +++ b/docs/_sources/cli/translate.rst.txt @@ -0,0 +1,6 @@ +translate +========= + +.. click:: honeybee_doe2.cli.translate:translate + :prog: honeybee-doe2 translate + :show-nested: diff --git a/docs/_sources/honeybee_doe2.cli.rst.txt b/docs/_sources/honeybee_doe2.cli.rst.txt new file mode 100644 index 0000000..3bf5136 --- /dev/null +++ b/docs/_sources/honeybee_doe2.cli.rst.txt @@ -0,0 +1,18 @@ +honeybee\_doe2.cli package +========================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + honeybee_doe2.cli.translate + +Module contents +--------------- + +.. automodule:: honeybee_doe2.cli + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.cli.translate.rst.txt b/docs/_sources/honeybee_doe2.cli.translate.rst.txt new file mode 100644 index 0000000..5799cbe --- /dev/null +++ b/docs/_sources/honeybee_doe2.cli.translate.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.cli.translate module +=================================== + +.. automodule:: honeybee_doe2.cli.translate + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.config.rst.txt b/docs/_sources/honeybee_doe2.config.rst.txt new file mode 100644 index 0000000..2ffbeb4 --- /dev/null +++ b/docs/_sources/honeybee_doe2.config.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.config module +============================ + +.. automodule:: honeybee_doe2.config + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.construction.rst.txt b/docs/_sources/honeybee_doe2.construction.rst.txt new file mode 100644 index 0000000..51a6601 --- /dev/null +++ b/docs/_sources/honeybee_doe2.construction.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.construction module +================================== + +.. automodule:: honeybee_doe2.construction + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.grouping.rst.txt b/docs/_sources/honeybee_doe2.grouping.rst.txt new file mode 100644 index 0000000..9e8302d --- /dev/null +++ b/docs/_sources/honeybee_doe2.grouping.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.grouping module +============================== + +.. automodule:: honeybee_doe2.grouping + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.load.rst.txt b/docs/_sources/honeybee_doe2.load.rst.txt new file mode 100644 index 0000000..c0e653d --- /dev/null +++ b/docs/_sources/honeybee_doe2.load.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.load module +========================== + +.. automodule:: honeybee_doe2.load + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.programtype.rst.txt b/docs/_sources/honeybee_doe2.programtype.rst.txt new file mode 100644 index 0000000..26813f8 --- /dev/null +++ b/docs/_sources/honeybee_doe2.programtype.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.programtype module +================================= + +.. automodule:: honeybee_doe2.programtype + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.properties.model.rst.txt b/docs/_sources/honeybee_doe2.properties.model.rst.txt new file mode 100644 index 0000000..ded5eb4 --- /dev/null +++ b/docs/_sources/honeybee_doe2.properties.model.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.properties.model module +====================================== + +.. automodule:: honeybee_doe2.properties.model + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.properties.room.rst.txt b/docs/_sources/honeybee_doe2.properties.room.rst.txt new file mode 100644 index 0000000..bea806d --- /dev/null +++ b/docs/_sources/honeybee_doe2.properties.room.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.properties.room module +===================================== + +.. automodule:: honeybee_doe2.properties.room + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.properties.rst.txt b/docs/_sources/honeybee_doe2.properties.rst.txt new file mode 100644 index 0000000..8037495 --- /dev/null +++ b/docs/_sources/honeybee_doe2.properties.rst.txt @@ -0,0 +1,19 @@ +honeybee\_doe2.properties package +================================= + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + honeybee_doe2.properties.model + honeybee_doe2.properties.room + +Module contents +--------------- + +.. automodule:: honeybee_doe2.properties + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.rst.txt b/docs/_sources/honeybee_doe2.rst.txt new file mode 100644 index 0000000..db6f596 --- /dev/null +++ b/docs/_sources/honeybee_doe2.rst.txt @@ -0,0 +1,35 @@ +honeybee\_doe2 package +====================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + honeybee_doe2.cli + honeybee_doe2.properties + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + honeybee_doe2.config + honeybee_doe2.construction + honeybee_doe2.grouping + honeybee_doe2.load + honeybee_doe2.programtype + honeybee_doe2.schedule + honeybee_doe2.simulation + honeybee_doe2.util + honeybee_doe2.writer + +Module contents +--------------- + +.. automodule:: honeybee_doe2 + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.schedule.rst.txt b/docs/_sources/honeybee_doe2.schedule.rst.txt new file mode 100644 index 0000000..f3c7f8b --- /dev/null +++ b/docs/_sources/honeybee_doe2.schedule.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.schedule module +============================== + +.. automodule:: honeybee_doe2.schedule + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.simulation.rst.txt b/docs/_sources/honeybee_doe2.simulation.rst.txt new file mode 100644 index 0000000..b3f8fa4 --- /dev/null +++ b/docs/_sources/honeybee_doe2.simulation.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.simulation module +================================ + +.. automodule:: honeybee_doe2.simulation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.util.rst.txt b/docs/_sources/honeybee_doe2.util.rst.txt new file mode 100644 index 0000000..a7b8f8a --- /dev/null +++ b/docs/_sources/honeybee_doe2.util.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.util module +========================== + +.. automodule:: honeybee_doe2.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/honeybee_doe2.writer.rst.txt b/docs/_sources/honeybee_doe2.writer.rst.txt new file mode 100644 index 0000000..1eb16c4 --- /dev/null +++ b/docs/_sources/honeybee_doe2.writer.rst.txt @@ -0,0 +1,7 @@ +honeybee\_doe2.writer module +============================ + +.. automodule:: honeybee_doe2.writer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt new file mode 100644 index 0000000..1756db9 --- /dev/null +++ b/docs/_sources/index.rst.txt @@ -0,0 +1,39 @@ +Welcome to honeybee-doe2's documentation! +=================================== + +Honeybee extension for import and export to/from IES-VE + + +Installation +============ + +``pip install honeybee-doe2`` + + +honeybee-doe2 +======= + +CLI Docs +======== + +For command line interface documentation and API documentation see the pages below. + +.. toctree:: + :maxdepth: 2 + + cli//index + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +.. include:: modules.rst + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/_sources/modules.rst.txt b/docs/_sources/modules.rst.txt new file mode 100644 index 0000000..6ac7f63 --- /dev/null +++ b/docs/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +honeybee_doe2 +============= + +.. toctree:: + :maxdepth: 4 + + honeybee_doe2 diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 0000000..f316efc --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 0000000..09e88ce --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-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); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 0000000..f4ede63 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-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)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 0000000..b725064 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]: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; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-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 linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.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 th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.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; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-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-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.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 { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-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; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-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-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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: -moz-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; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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: -moz-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-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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: -moz-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-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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: -moz-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-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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: -moz-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); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.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: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..b6428e6 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]: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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-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 linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-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-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-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;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-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-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));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:-moz-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;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));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:-moz-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-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));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:-moz-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-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));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:-moz-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-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));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:-moz-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)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-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{display:block;line-height:1}.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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png differ diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png differ diff --git a/docs/_static/bootstrap-2.3.2/js/bootstrap.js b/docs/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 0000000..638bb18 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('