diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..eb3415e --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,152 @@ + + + + + + + Overview: module code — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/centrography.html b/_modules/pointpats/centrography.html new file mode 100644 index 0000000..b7388e1 --- /dev/null +++ b/_modules/pointpats/centrography.html @@ -0,0 +1,712 @@ + + + + + + + pointpats.centrography — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.centrography

+"""
+Centrographic measures for point patterns
+
+TODO
+
+- testing
+- documentation
+
+"""
+
+__author__ = "Serge Rey sjsrey@gmail.com"
+
+__all__ = [
+    "mbr",
+    "hull",
+    "mean_center",
+    "weighted_mean_center",
+    "manhattan_median",
+    "std_distance",
+    "euclidean_median",
+    "ellipse",
+    "minimum_rotated_rectangle",
+    "minimum_bounding_rectangle",
+    "skyum",
+    "dtot",
+    "_circle",
+]
+
+
+import sys
+import numpy as np
+import warnings
+import copy
+import math
+
+from math import pi as PI
+from scipy.spatial import ConvexHull
+from libpysal.cg import get_angle_between, Ray, is_clockwise
+from scipy.spatial import distance as dist
+from scipy.optimize import minimize
+import shapely
+
+not_clockwise = lambda x: not is_clockwise(x)
+
+MAXD = sys.float_info.max
+MIND = sys.float_info.min
+
+
+
+[docs] +def minimum_bounding_rectangle(points): + """ + Find minimum bounding rectangle of a point array. + + Parameters + ---------- + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + min_x : float + leftmost value of the vertices of minimum bounding rectangle. + min_y : float + downmost value of the vertices of minimum bounding rectangle. + max_x : float + rightmost value of the vertices of minimum bounding rectangle. + max_y : float + upmost value of the vertices of minimum bounding rectangle. + + """ + points = np.asarray(points) + min_x = min_y = MAXD + max_x = max_y = MIND + x, y = zip(*points) + min_x = min(x) + min_y = min(y) + max_x = max(x) + max_y = max(y) + return min_x, min_y, max_x, max_y
+ + + +def minimum_rotated_rectangle(points, return_angle=False): + """ + Compute the minimum rotated rectangle for an input point set. + + This is the smallest enclosing rectangle (possibly rotated) + for the input point set. It is computed using Shapely. + + Parameters + ---------- + points : numpy.ndarray + A numpy array of shape (n_observations, 2) containing the point + locations to compute the rotated rectangle + return_angle : bool + whether to return the angle (in degrees) of the angle between + the horizontal axis of the rectanle and the first side (i.e. length). + + Returns + ------- + an numpy.ndarray of shape (4, 2) containing the coordinates + of the minimum rotated rectangle. If return_angle is True, + also return the angle (in degrees) of the rotated rectangle. + + """ + points = np.asarray(points) + out_points = shapely.get_coordinates( + shapely.minimum_rotated_rectangle(shapely.multipoints(points)) + )[:-1] + if return_angle: + angle = ( + math.degrees( + math.atan2( + out_points[1][1] - out_points[0][1], + out_points[1][0] - out_points[0][0], + ) + ) + % 90 + ) + return (out_points[::-1], angle) + return out_points[::-1] + + +def mbr(points): + warnings.warn( + "This function will be deprecated in the next release of pointpats.", + FutureWarning, + stacklevel=2, + ) + return minimum_bounding_rectangle(points) + + +mbr.__doc__ = minimum_bounding_rectangle.__doc__ + + +
+[docs] +def hull(points): + """ + Find convex hull of a point array. + + Parameters + ---------- + points: arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : array + (h,2), points defining the hull in counterclockwise order. + """ + + points = np.asarray(points) + h = ConvexHull(points) + return points[h.vertices]
+ + + +
+[docs] +def mean_center(points): + """ + Find mean center of a point array. + + Parameters + ---------- + points: arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : array + (2,), (x,y) coordinates of the mean center. + """ + + points = np.asarray(points) + return points.mean(axis=0)
+ + + +
+[docs] +def weighted_mean_center(points, weights): + """ + Find weighted mean center of a marked point pattern. + + Parameters + ---------- + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + weights : arraylike + a series of attribute values of length n. + + Returns + ------- + _ : array + (2,), (x,y) coordinates of the weighted mean center. + """ + + points, weights = np.asarray(points), np.asarray(weights) + w = weights * 1.0 / weights.sum() + w.shape = (1, len(points)) + return np.dot(w, points)[0]
+ + + +
+[docs] +def manhattan_median(points): + """ + Find manhattan median of a point array. + + Parameters + ---------- + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : array + (2,), (x,y) coordinates of the manhattan median. + """ + + points = np.asarray(points) + if not len(points) % 2: + s = "Manhattan Median is not unique for even point patterns." + warnings.warn(s) + return np.median(points, axis=0)
+ + + +
+[docs] +def std_distance(points): + """ + Calculate standard distance of a point array. + + Parameters + ---------- + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : float + standard distance. + """ + + points = np.asarray(points) + n, p = points.shape + m = points.mean(axis=0) + return np.sqrt(((points * points).sum(axis=0) / n - m * m).sum())
+ + + +
+[docs] +def ellipse(points): + """ + Calculate parameters of standard deviational ellipse for a point pattern. + + Parameters + ---------- + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : float + semi-major axis. + _ : float + semi-minor axis. + theta : float + clockwise rotation angle of the ellipse. + + Notes + ----- + Implements approach from: + + https://www.icpsr.umich.edu/CrimeStat/files/CrimeStatChapter.4.pdf + """ + + points = np.asarray(points) + n, k = points.shape + x = points[:, 0] + y = points[:, 1] + xd = x - x.mean() + yd = y - y.mean() + xss = (xd * xd).sum() + yss = (yd * yd).sum() + cv = (xd * yd).sum() + num = (xss - yss) + np.sqrt((xss - yss) ** 2 + 4 * (cv) ** 2) + den = 2 * cv + theta = np.arctan(num / den) + cos_theta = np.cos(theta) + sin_theta = np.sin(theta) + n_2 = n - 2 + sd_x = (2 * (xd * cos_theta - yd * sin_theta) ** 2).sum() / n_2 + sd_y = (2 * (xd * sin_theta - yd * cos_theta) ** 2).sum() / n_2 + return np.sqrt(sd_x), np.sqrt(sd_y), theta
+ + + +
+[docs] +def dtot(coord, points): + """ + Sum of Euclidean distances between event points and a selected point. + + Parameters + ---------- + coord : arraylike + (x,y) coordinates of a point. + points : arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + d : float + sum of Euclidean distances. + + """ + points = np.asarray(points) + xd = points[:, 0] - coord[0] + yd = points[:, 1] - coord[1] + d = np.sqrt(xd * xd + yd * yd).sum() + return d
+ + + +
+[docs] +def euclidean_median(points): + """ + Calculate the Euclidean median for a point pattern. + + Parameters + ---------- + points: arraylike + (n,2), (x,y) coordinates of a series of event points. + + Returns + ------- + _ : array + (2,), (x,y) coordinates of the Euclidean median. + + """ + points = np.asarray(points) + start = mean_center(points) + res = minimize(dtot, start, args=(points,)) + return res["x"]
+ + + +def minimum_bounding_circle(points): + """ + Implements Skyum (1990)'s algorithm for the minimum bounding circle in R^2. + + Store points clockwise. + Find p in S that maximizes angle(prec(p), p, succ(p) THEN radius(prec( + p), p, succ(p)). This is also called the lexicographic maximum, and is the last + entry of a list of (radius, angle) in lexicographical order. + + * If angle(prec(p), p, succ(p)) <= 90 degrees, then finish. + + * If not, remove p from set. + + Parameters + ---------- + points : numpy.ndarray + a numpy array of shape (n_observations, 2) to compute + the minimum bounding circle + + Returns + ------- + (x,y),center for the minimum bounding circle. + """ + points = hull(points) + if not_clockwise(points): + points = points[::-1] + if not_clockwise(points): + raise Exception("Points are neither clockwise nor counterclockwise") + POINTS = copy.deepcopy(points) + removed = [] + i = 0 + if HAS_NUMBA: + circ = _skyum_numba(POINTS)[0] + else: + circ = _skyum_lists(POINTS)[0] + return (circ[1], circ[2]), circ[0] + + +
+[docs] +def skyum(points): + warnings.warn( + "This function will be deprecated in the next release of pointpats.", + FutureWarning, + stacklevel=2, + ) + return minimum_bounding_circle(points)
+ + + +skyum.__doc__ = ( + "WARNING: This function is deprecated in favor of minimum_bounding_circle\n" + + minimum_bounding_circle.__doc__ +) + + +def _skyum_lists(points): + points = points.tolist() + removed = [] + i = 0 + while True: + angles = [ + _angle( + _prec(p, points), + p, + _succ(p, points), + ) + for p in points + ] + circles = [ + _circle( + _prec(p, points), + p, + _succ(p, points), + ) + for p in points + ] + radii = [c[0] for c in circles] + lexord = np.lexsort((radii, angles)) # confusing as hell defaults... + lexmax = lexord[-1] + candidate = ( + _prec(points[lexmax], points), + points[lexmax], + _succ(points[lexmax], points), + ) + if angles[lexmax] <= (np.pi / 2.0): + # print("Constrained by points: {}".format(candidate)) + return _circle(*candidate), points, removed, candidate + else: + try: + removed.append((points.pop(lexmax), i)) + except IndexError: + raise Exception("Construction of Minimum Bounding Circle failed!") + i += 1 + + +try: + from numba import njit, boolean + + HAS_NUMBA = True + + @njit(fastmath=True) + def _skyum_numba(points): + i = 0 + complete = False + while not complete: + complete, points, candidate, circle = _skyum_iteration(points) + if complete: + return circle, points, None, candidate + + @njit(fastmath=True) + def _skyum_iteration(points): + points = points.reshape(-1, 2) + n = points.shape[0] + angles = np.empty((n,)) + circles = np.empty((n, 3)) + for i in range(n): + p = points[(i - 1) % n] + q = points[i % n] + r = points[(i + 1) % n] + angles[i] = _angle(p, q, r) + circles[i] = _circle(p, q, r) + radii = circles[:, 0] + # workaround for no lexsort in numba + angle_argmax = angles.argmax() + angle_max = angles[angle_argmax] + # the maximum radius for the largest angle + lexmax = (radii * (angles == angle_max)).argmax() + + candidate = (lexmax - 1) % n, lexmax, (lexmax + 1) % n + if angles[lexmax] <= (np.pi / 2.0): + return True, points, lexmax, circles[lexmax] + else: + mask = np.ones((n,), dtype=boolean) + mask[lexmax] = False + new_points = points[mask, :] + return False, new_points, lexmax, circles[lexmax] + + +except ModuleNotFoundError: + + def njit(func, **kwargs): + return func + + +@njit +def _angle(p, q, r): + pq = p - q + rq = r - q + magnitudes = np.linalg.norm(pq) * np.linalg.norm(rq) + return np.abs(np.arccos(np.dot(pq, rq) / magnitudes)) + + +def _prec(p, l): + """ + retrieve the predecessor of p in list l + """ + pos = l.index(p) + if pos - 1 < 0: + return l[-1] + else: + return l[pos - 1] + + +def _succ(p, l): + """ + retrieve the successor of p in list l + """ + pos = l.index(p) + if pos + 1 >= len(l): + return l[0] + else: + return l[pos + 1] + + +@njit +def _euclidean_distance(px, py, qx, qy): + return np.sqrt((px - qx) ** 2 + (py - qy) ** 2) + + +@njit +def _circle(p, q, r, dmetric=_euclidean_distance): + """ + Returns (radius, (center_x, center_y)) of the circumscribed circle by the + triangle pqr. + + note, this does not assume that p!=q!=r + """ + px, py = p + qx, qy = q + rx, ry = r + angle = np.abs(_angle(p, q, r)) + if np.abs(angle - np.pi) < 1e-5: # angle is pi + radius = _euclidean_distance(px, py, rx, ry) / 2.0 + center_x = (px + rx) / 2.0 + center_y = (py + ry) / 2.0 + elif np.abs(angle) < 1e-5: # angle is zero + radius = _euclidean_distance(px, py, qx, qy) / 2.0 + center_x = (px + qx) / 2.0 + center_y = (py + qy) / 2.0 + else: + D = 2 * (px * (qy - ry) + qx * (ry - py) + rx * (py - qy)) + center_x = ( + (px**2 + py**2) * (qy - ry) + + (qx**2 + qy**2) * (ry - py) + + (rx**2 + ry**2) * (py - qy) + ) / float(D) + center_y = ( + (px**2 + py**2) * (rx - qx) + + (qx**2 + qy**2) * (px - rx) + + (rx**2 + ry**2) * (qx - px) + ) / float(D) + radius = _euclidean_distance(center_x, center_y, px, py) + return radius, center_x, center_y +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/distance_statistics.html b/_modules/pointpats/distance_statistics.html new file mode 100644 index 0000000..a3d60c2 --- /dev/null +++ b/_modules/pointpats/distance_statistics.html @@ -0,0 +1,1125 @@ + + + + + + + pointpats.distance_statistics — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.distance_statistics

+import numpy
+import warnings
+from scipy import spatial, interpolate
+from collections import namedtuple
+from .geometry import (
+    area as _area,
+    k_neighbors as _k_neighbors,
+    build_best_tree as _build_best_tree,
+    prepare_hull as _prepare_hull,
+    TREE_TYPES,
+)
+from .random import poisson
+
+
+__all__ = [
+    "f",
+    "g",
+    "k",
+    "j",
+    "l",
+    "f_test",
+    "g_test",
+    "k_test",
+    "j_test",
+    "l_test",
+]
+
+
+def _prepare(coordinates, support, distances, metric, hull, edge_correction):
+    """
+    prepare the arguments to convert into a standard format
+    1. cast the coordinates to a numpy array
+    2. precomputed metrics must have distances provided
+    3. metrics must be callable or string
+    4. warn if distances are specified and metric is not default
+    5. make distances a numpy.ndarray
+    6. construct the support, accepting:
+        - num_steps -> a linspace with len(support) == num_steps
+                       from zero to a quarter of the bounding box's smallest side
+        - (stop, ) -> a linspace with len(support) == 20
+                 from zero to stop
+        - (start, stop) -> a linspace with len(support) == 20
+                           from start to stop
+        - (start, stop, num_steps) -> a linspace with len(support) == num_steps
+                                      from start to stop
+        - numpy.ndarray -> passed through
+    """
+    # Throw early if edge correction is requested
+    if edge_correction is not None:
+        raise NotImplementedError("Edge correction is not currently implemented.")
+
+    # cast to coordinate array
+    if isinstance(coordinates, TREE_TYPES):
+        tree = coordinates
+        coordinates = tree.data
+    else:
+        coordinates = numpy.asarray(coordinates)
+    hull = _prepare_hull(coordinates, hull)
+
+    # evaluate distances
+    if (distances is None) and metric == "precomputed":
+        raise ValueError(
+            "If metric =`precomputed` then distances must"
+            " be provided as a (n,n) numpy array."
+        )
+    if not (isinstance(metric, str) or callable(metric)):
+        raise TypeError(
+            f"`metric` argument must be callable or a string. Recieved: {metric}"
+        )
+    if distances is not None and metric != "euclidean":
+        warnings.warn(
+            "Distances were provided. The specified metric will be ignored."
+            " To use precomputed distances with a custom distance metric,"
+            " do not specify a `metric` argument.",
+            stacklevel=2,
+        )
+        metric = "euclidean"
+
+    if support is None:
+        support = 20
+
+    if isinstance(support, int):  # if just n_steps, use the max nnd
+        # this is O(n log n) for kdtrees & balltrees
+        tmp_tree = _build_best_tree(coordinates, metric=metric)
+        max_dist = _k_neighbors(tmp_tree, coordinates, 1)[0].max()
+        support = numpy.linspace(0, max_dist, num=support)
+    # otherwise, we need to build it using (start, stop, step) semantics
+    elif isinstance(support, tuple):
+        if len(support) == 1:  # assuming this is with zero implicit start
+            support = numpy.linspace(0, support[0], num=20)  # default support n bins
+        elif len(support) == 2:
+            support = numpy.linspace(*support, num=20)  # default support n bins
+        elif len(support) == 3:
+            support = numpy.linspace(support[0], support[1], num=support[2])
+    else:  # try to use it as is
+        try:
+            support = numpy.asarray(support)
+        except:
+            raise TypeError(
+                "`support` must be a tuple (either (start, stop, step), (start, stop) or (stop,)),"
+                " an int describing the number of breaks to use to evalute the function,"
+                " or an iterable containing the breaks to use to evaluate the function."
+                " Recieved object of type {}: {}".format(type(support), support)
+            )
+
+    return coordinates, support, distances, metric, hull, edge_correction
+
+
+# ------------------------------------------------------------#
+# Statistical Functions                                       #
+# ------------------------------------------------------------#
+
+
+
+[docs] +def f( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, +): + """ + Ripley's F function + + The so-called "empty space" function, this is the cumulative density function of + the distances from a random set of points to the known points in the pattern. + + Parameters + ---------- + coordinates : numpy.ndarray of shape (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + + Returns + ------- + a tuple containing the support values used to evalute the function + and the values of the function at each distance value in the support. + """ + coordinates, support, distances, metric, hull, _ = _prepare( + coordinates, support, distances, metric, hull, edge_correction + ) + if distances is not None: + n = coordinates.shape[0] + if distances.ndim == 2: + k, p = distances.shape + if k == p == n: + warnings.warn( + f"A full distance matrix is not required for this function, and" + f" the intput matrix is a square {n},{n} matrix. Only the" + f" distances from p random points to their nearest neighbor within" + f" the pattern is required, as an {n},p matrix. Assuming the" + f" provided distance matrix has rows pertaining to input" + f" pattern and columns pertaining to the output points.", + stacklevel=2, + ) + distances = distances.min(axis=0) + elif k == n: + distances = distances.min(axis=0) + else: + raise ValueError( + f"Distance matrix should have the same rows as the input" + f" coordinates with p columns, where n may be equal to p." + f" Recieved an {k},{p} distance matrix for {n} coordinates" + ) + elif distances.ndim == 1: + p = len(distances) + else: + # Do 1000 empties. Users can control this by computing their own + # empty space distribution. + n_empty_points = 1000 + + randoms = poisson(hull=hull, size=(n_empty_points, 1)) + try: + tree + except NameError: + tree = _build_best_tree(coordinates, metric) + finally: + distances, _ = tree.query(randoms, k=1) + distances = distances.squeeze() + + counts, bins = numpy.histogram(distances, bins=support) + fracs = numpy.cumsum(counts) / counts.sum() + + return bins, numpy.asarray([0, *fracs])
+ + + +
+[docs] +def g( + coordinates, + support=None, + distances=None, + metric="euclidean", + edge_correction=None, +): + """ + Ripley's G function + + The G function is computed from the cumulative density function of the nearest neighbor + distances between points in the pattern. + + Parameters + ----------- + coordinates : numpy.ndarray of shape (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, n) or (n,) + distances from every point in the point to another point in `coordinates` + metric: str or callable + distance metric to use when building search tree + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + + Returns + ------- + a tuple containing the support values used to evalute the function + and the values of the function at each distance value in the support. + + """ + + coordinates, support, distances, metric, *_ = _prepare( + coordinates, support, distances, metric, None, edge_correction + ) + if distances is not None: + if distances.ndim == 2: + if distances.shape[0] == distances.shape[1] == coordinates.shape[0]: + warnings.warn( + "The full distance matrix is not required for this function," + " only the distance to the nearest neighbor within the pattern." + " Computing this and discarding the rest.", + stacklevel=2, + ) + distances = distances.min(axis=1) + else: + k, p = distances.shape + n = coordinates.shape[0] + raise ValueError( + " Input distance matrix has an invalid shape: {k},{p}." + " Distances supplied can either be 2 dimensional" + " square matrices with the same number of rows" + " as `coordinates` ({n}) or 1 dimensional and contain" + " the shortest distance from each point in " + " `coordinates` to some other point in coordinates." + ) + elif distances.ndim == 1: + if distances.shape[0] != coordinates.shape[0]: + raise ValueError( + f"Distances are not aligned with coordinates! Distance" + f" matrix must be (n_coordinates, n_coordinates), but recieved" + f" {distances.shape} instead of ({coordinates.shape[0]},)" + ) + else: + raise ValueError( + "Distances supplied can either be 2 dimensional" + " square matrices with the same number of rows" + " as `coordinates` or 1 dimensional and contain" + " the shortest distance from each point in " + " `coordinates` to some other point in coordinates." + " Input matrix was {distances.ndim} dimensioanl" + ) + else: + try: + tree + except NameError: + tree = _build_best_tree(coordinates, metric) + finally: + distances, indices = _k_neighbors(tree, coordinates, k=1) + + counts, bins = numpy.histogram(distances.squeeze(), bins=support) + fracs = numpy.cumsum(counts) / counts.sum() + + return bins, numpy.asarray([0, *fracs])
+ + + +
+[docs] +def j( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + truncate=True, +): + """ + Ripely's J function + + The so-called "spatial hazard" function, this is a function relating the F and G functions. + + Parameters + ----------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: tuple of numpy.ndarray + precomputed distances to use to evaluate the j function. + The first must be of shape (n,n) or (n,) and is used in the g function. + the second must be of shape (n,p) or (p,) (with p possibly equal to n) + used in the f function. + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern for the f function. + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + truncate: bool (default: True) + whether or not to truncate the results when the F function reaches one. If the + F function is one but the G function is less than one, this function will return + numpy.nan values. + + Returns + ------- + a tuple containing the support values used to evalute the function + and the values of the function at each distance value in the support. + """ + if distances is not None: + g_distances, f_distances = distances + else: + g_distances = f_distances = None + fsupport, fstats = f( + coordinates, + support=support, + distances=f_distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + ) + + gsupport, gstats = g( + coordinates, + support=support, + distances=g_distances, + metric=metric, + edge_correction=edge_correction, + ) + + if isinstance(support, numpy.ndarray): + if not numpy.allclose(gsupport, support): + gfunction = interpolate.interp1d(gsupport, gstats, fill_value=1) + gstats = gfunction(support) + gsupport = support + if not (numpy.allclose(gsupport, fsupport)): + ffunction = interpolate.interp1d(fsupport, fstats, fill_value=1) + fstats = ffunction(gsupport) + fsupport = gsupport + + with numpy.errstate(invalid="ignore", divide="ignore"): + hazard_ratio = (1 - gstats) / (1 - fstats) + both_zero = (gstats == 1) & (fstats == 1) + hazard_ratio[both_zero] = numpy.nan + if truncate: + result = _truncate(gsupport, hazard_ratio) + if len(result[1]) != len(hazard_ratio): + warnings.warn( + f"requested {support} bins to evaluate the J function, but" + f" it reaches infinity at d={result[0][-1]:.4f}, meaning only" + f" {len(result[0])} bins will be used to characterize the J function.", + stacklevel=2, + ) + return result + else: + return gsupport, hazard_ratio
+ + + +
+[docs] +def k( + coordinates, + support=None, + distances=None, + metric="euclidean", + edge_correction=None, +): + """ + Ripley's K function + + This function counts the number of pairs of points that are closer than a given distance. + As d increases, K approaches the number of point pairs. + + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + + Returns + ------- + a tuple containing the support values used to evalute the function + and the values of the function at each distance value in the support. + """ + coordinates, support, distances, metric, hull, edge_correction = _prepare( + coordinates, support, distances, metric, None, edge_correction + ) + n = coordinates.shape[0] + upper_tri_n = n * (n - 1) * 0.5 + if distances is not None: + if distances.ndim == 1: + if distances.shape[0] != upper_tri_n: + raise ValueError( + f"Shape of inputted distances is not square, nor is the upper triangular" + f" matrix matching the number of input points. The shape of the input matrix" + f" is {distances.shape}, but required shape is ({upper_tri_n},) or ({n},{n})" + ) + upper_tri_distances = distances + elif distances.shape[0] == distances.shape[1] == n: + upper_tri_distances = distances[numpy.triu_indices_from(distances, k=1)] + else: + raise ValueError( + f"Shape of inputted distances is not square, nor is the upper triangular" + f" matrix matching the number of input points. The shape of the input matrix" + f" is {distances.shape}, but required shape is ({upper_tri_n},) or ({n},{n})" + ) + else: + upper_tri_distances = spatial.distance.pdist(coordinates, metric=metric) + n_pairs_less_than_d = (upper_tri_distances < support.reshape(-1, 1)).sum(axis=1) + intensity = n / _area(hull) + k_estimate = ((n_pairs_less_than_d * 2) / n) / intensity + return support, k_estimate
+ + + +
+[docs] +def l( + coordinates, + support=None, + permutations=9999, + distances=None, + metric="euclidean", + edge_correction=None, + linearized=False, +): + """ + Ripley's L function + + This is a scaled and shifted version of the K function that accounts for the K function's + increasing expected value as distances increase. This means that the L function, for a + completely random pattern, should be close to zero at all distance values in the support. + + Parameters + ---------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + linearized : bool + whether or not to subtract l from its expected value (support) at each + distance bin. This centers the l function on zero for all distances. + Proposed by Besag (1977) + + Returns + ------- + a tuple containing the support values used to evalute the function + and the values of the function at each distance value in the support. + """ + + support, k_estimate = k( + coordinates, + support=support, + distances=distances, + metric=metric, + edge_correction=edge_correction, + ) + + l = numpy.sqrt(k_estimate / numpy.pi) + + if linearized: + return support, l - support + return support, l
+ + + +# ------------------------------------------------------------# +# Statistical Tests based on Ripley Functions # +# ------------------------------------------------------------# + +FtestResult = namedtuple( + "FtestResult", ("support", "statistic", "pvalue", "simulations") +) +GtestResult = namedtuple( + "GtestResult", ("support", "statistic", "pvalue", "simulations") +) +JtestResult = namedtuple( + "JtestResult", ("support", "statistic", "pvalue", "simulations") +) +KtestResult = namedtuple( + "KtestResult", ("support", "statistic", "pvalue", "simulations") +) +LtestResult = namedtuple( + "LtestResult", ("support", "statistic", "pvalue", "simulations") +) + +_ripley_dispatch = { + "F": (f, FtestResult), + "G": (g, GtestResult), + "J": (j, JtestResult), + "K": (k, KtestResult), + "L": (l, LtestResult), +} + + +def _ripley_test( + calltype, + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + keep_simulations=False, + n_simulations=9999, + **kwargs, +): + stat_function, result_container = _ripley_dispatch.get(calltype) + core_kwargs = dict( + support=support, + metric=metric, + edge_correction=edge_correction, + ) + tree = _build_best_tree(coordinates, metric=metric) + hull = _prepare_hull(coordinates, hull) + if calltype in ("F", "J"): # these require simulations + core_kwargs["hull"] = hull + # amortize to avoid doing this every time + empty_space_points = poisson(coordinates, size=(1000, 1)) + if distances is None: + empty_space_distances, _ = _k_neighbors(tree, empty_space_points, k=1) + if calltype == "F": + distances = empty_space_distances.squeeze() + else: # calltype == 'J': + n_distances, _ = _k_neighbors(tree, coordinates, k=1) + distances = (n_distances.squeeze(), empty_space_distances.squeeze()) + else: + pass + core_kwargs.update(**kwargs) + + observed_support, observed_statistic = stat_function( + tree, distances=distances, **core_kwargs + ) + core_kwargs["support"] = observed_support + n_observations = coordinates.shape[0] + + if keep_simulations: + simulations = numpy.empty((len(observed_support), n_simulations)).T + pvalues = numpy.ones_like(observed_support) + for i_replication in range(n_simulations): + random_i = poisson(hull, size=n_observations) + if calltype in ("F", "J"): + random_tree = _build_best_tree(random_i, metric) + empty_distances, _ = random_tree.query(empty_space_points, k=1) + if calltype == "F": + core_kwargs["distances"] = empty_distances.squeeze() + else: # calltype == 'J': + n_distances, _ = _k_neighbors(random_tree, random_i, k=1) + core_kwargs["distances"] = ( + n_distances.squeeze(), + empty_distances.squeeze(), + ) + rep_support, simulations_i = stat_function(random_i, **core_kwargs) + pvalues += simulations_i >= observed_statistic + if keep_simulations: + simulations[i_replication] = simulations_i + pvalues /= n_simulations + 1 + pvalues = numpy.minimum(pvalues, 1 - pvalues) + return result_container( + observed_support, + observed_statistic, + pvalues, + simulations if keep_simulations else None, + ) + + +
+[docs] +def f_test( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + keep_simulations=False, + n_simulations=9999, +): + """ + Ripley's F function + + The so-called "empty space" function, this is the cumulative density function of + the distances from a random set of points to the known points in the pattern. + + When the estimated statistic is larger than simulated values at a given distance, then + the pattern is considered "dispersed" or "regular" + + Parameters + ----------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + keep_simulations: bool + whether or not to keep the simulation envelopes. If so, + will be returned as the result's simulations attribute + n_simulations: int + how many simulations to conduct, assuming that the reference pattern + has complete spatial randomness. + + Returns + ------- + a named tuple with properties + - support, the exact distance values used to evalute the statistic + - statistic, the values of the statistic at each distance + - pvalue, the percent of simulations that were as extreme as the observed value + - simulations, the distribution of simulated statistics (shaped (n_simulations, n_support_points)) + or None if keep_simulations=False (which is the default) + """ + + return _ripley_test( + "F", + coordinates, + support=support, + distances=distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + keep_simulations=keep_simulations, + n_simulations=n_simulations, + )
+ + + +
+[docs] +def g_test( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + keep_simulations=False, + n_simulations=9999, +): + """ + Ripley's G function + + The G function is computed from the cumulative density function of the nearest neighbor + distances between points in the pattern. + + When the G function is below the simulated values, it suggests dispersion. + + Parameters + ---------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + keep_simulations: bool + whether or not to keep the simulation envelopes. If so, + will be returned as the result's simulations attribute + n_simulations: int + how many simulations to conduct, assuming that the reference pattern + has complete spatial randomness. + + Returns + ------- + a named tuple with properties + - support, the exact distance values used to evalute the statistic + - statistic, the values of the statistic at each distance + - pvalue, the percent of simulations that were as extreme as the observed value + - simulations, the distribution of simulated statistics (shaped (n_simulations, n_support_points)) + or None if keep_simulations=False (which is the default) + """ + return _ripley_test( + "G", + coordinates, + support=support, + distances=distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + keep_simulations=keep_simulations, + n_simulations=n_simulations, + )
+ + + +
+[docs] +def j_test( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + truncate=True, + keep_simulations=False, + n_simulations=9999, +): + """ + Ripley's J function + + The so-called "spatial hazard" function, this is a function relating the F and G functions. + + When the J function is consistently below 1, then it indicates clustering. + When consistently above 1, it suggests dispersion. + + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + keep_simulations: bool + whether or not to keep the simulation envelopes. If so, + will be returned as the result's simulations attribute + n_simulations: int + how many simulations to conduct, assuming that the reference pattern + has complete spatial randomness. + + Returns + ------- + a named tuple with properties + - support, the exact distance values used to evalute the statistic + - statistic, the values of the statistic at each distance + - pvalue, the percent of simulations that were as extreme as the observed value + - simulations, the distribution of simulated statistics (shaped (n_simulations, n_support_points)) + or None if keep_simulations=False (which is the default) + """ + result = _ripley_test( + "J", + coordinates, + support=support, + distances=distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + keep_simulations=keep_simulations, + n_simulations=n_simulations, + truncate=False, + ) + if truncate: + result_trunc = _truncate(*result) + result_trunc = JtestResult(*result_trunc) + if len(result_trunc.statistic) != len(result.statistic): + warnings.warn( + f"requested {support} bins to evaluate the J function, but" + f" it reaches infinity at d={result[0][-1]:.4f}, meaning only" + f" {len(result[0])} bins will be used to characterize the J function.", + stacklevel=2, + ) + return result_trunc + + else: + return result
+ + + +
+[docs] +def k_test( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + keep_simulations=False, + n_simulations=9999, +): + """ + Ripley's K function + + This function counts the number of pairs of points that are closer than a given distance. + As d increases, K approaches the number of point pairs. + + When the K function is below simulated values, it suggests that the pattern is dispersed. + + Parameters + ---------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + keep_simulations: bool + whether or not to keep the simulation envelopes. If so, + will be returned as the result's simulations attribute + n_simulations: int + how many simulations to conduct, assuming that the reference pattern + has complete spatial randomness. + + Returns + ------- + a named tuple with properties + - support, the exact distance values used to evalute the statistic + - statistic, the values of the statistic at each distance + - pvalue, the percent of simulations that were as extreme as the observed value + - simulations, the distribution of simulated statistics (shaped (n_simulations, n_support_points)) + or None if keep_simulations=False (which is the default) + """ + return _ripley_test( + "K", + coordinates, + support=support, + distances=distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + keep_simulations=keep_simulations, + n_simulations=n_simulations, + )
+ + + +
+[docs] +def l_test( + coordinates, + support=None, + distances=None, + metric="euclidean", + hull=None, + edge_correction=None, + linearized=False, + keep_simulations=False, + n_simulations=9999, +): + """ + Ripley's L function + + This is a scaled and shifted version of the K function that accounts for the K function's + increasing expected value as distances increase. This means that the L function, for a + completely random pattern, should be close to zero at all distance values in the support. + + When the L function is negative, this suggests dispersion. + + Parameters + ---------- + coordinates : numpy.ndarray, (n,2) + input coordinates to function + support : tuple of length 1, 2, or 3, int, or numpy.ndarray + tuple, encoding (stop,), (start, stop), or (start, stop, num) + int, encoding number of equally-spaced intervals + numpy.ndarray, used directly within numpy.histogram + distances: numpy.ndarray, (n, p) or (p,) + distances from every point in a random point set of size p + to some point in `coordinates` + metric: str or callable + distance metric to use when building search tree + hull: bounding box, scipy.spatial.ConvexHull, shapely.geometry.Polygon + the hull used to construct a random sample pattern, if distances is None + edge_correction: bool or str + whether or not to conduct edge correction. Not yet implemented. + keep_simulations: bool + whether or not to keep the simulation envelopes. If so, + will be returned as the result's simulations attribute + n_simulations: int + how many simulations to conduct, assuming that the reference pattern + has complete spatial randomness. + + Returns + ------- + a named tuple with properties + - support, the exact distance values used to evalute the statistic + - statistic, the values of the statistic at each distance + - pvalue, the percent of simulations that were as extreme as the observed value + - simulations, the distribution of simulated statistics (shaped (n_simulations, n_support_points)) + or None if keep_simulations=False (which is the default) + """ + return _ripley_test( + "L", + coordinates, + support=support, + distances=distances, + metric=metric, + hull=hull, + edge_correction=edge_correction, + linearized=linearized, + keep_simulations=keep_simulations, + n_simulations=n_simulations, + )
+ + + +def _truncate(support, realizations, *rest): + is_invalid = numpy.isinf(realizations) | numpy.isnan(realizations) + first_inv = is_invalid.argmax() + if not is_invalid.any(): + return support, realizations, *rest + elif first_inv < len(realizations): + return ( + support[:first_inv], + realizations[:first_inv], + *[r[:first_inv] if r is not None else None for r in rest], + ) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/kde.html b/_modules/pointpats/kde.html new file mode 100644 index 0000000..99ad544 --- /dev/null +++ b/_modules/pointpats/kde.html @@ -0,0 +1,309 @@ + + + + + + + pointpats.kde — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.kde

+import numpy as np
+
+
+
+[docs] +def plot_density( + data, + bandwidth, + kernel=None, + resolution=100, + levels=10, + fill=False, + margin=0.1, + ax=None, + figsize=None, + **kwargs, +): + """Plot kernel density of a given point pattern + + The KDE can be done either using :class:`statsmodels.nonparametric.KDEMultivariate`, + which is used when ``kernel=None``, or using :class:`KDEpy.FFTKDE` when kernel is + set. :class:`~KDEpy.FFTKDE` tends to be generally faster in most cases but may need + different than ``"gaussian"`` kernel to resolve in some cases. For small data of up + to 10 000 points, the difference is not noticeable. For larger data, specify + ``bandwidth`` to enforce the use of :class:`~KDEpy.FFTKDE`. Note that while being + faster, :class:`~KDEpy.FFTKDE` may in some case result in erroneous KDE. + + KDE is plotted using matplotlib's :meth:`~matplotlib.pyplot.contour` or + :meth:`~matplotlib.pyplot.contourf` function to plot the density. + + If MultiPoints are given, each point is treated as separate observation. + + Parameters + ---------- + data : array or geopandas object + Array with a shape (2, n) containing coordinates of points + or a geopandas object with (Multi)Point geometry. Assumes + projected coordinates, geographical coordinates (latitude, longitude) + are not supported. + bandwidth : float + bandwidth in the units of CRS in which data is + kernel : str | None, optional + The kernel function. If None, defaults to the Gaussian kernel and statsmodels + implementation. If set, uses KDEpy implementation. See + :meth:`KDEpy.FFTKDE._available_kernels.keys()` for choices. + resolution : int | tuple(int, int), optional + resolution of the grid used to evaluate the probability density + function. If tuple, each dimension of the grid is specified separately. + By default 100 + levels : int or array-like, optional + Determines the number and positions of the contour lines / regions. + See the documentation of :meth:`~matplotlib.pyplot.contour` for details. + By default 10 + fill : bool, optional + Fill the area between contour lines, by default False + margin : float, optional + The factor of the margin by which the extent of the data will be expanded when + creating the grid. 0.1 means 10% on each side, by default 0.1. Only used + with the ``statsmodels`` implementation. + ax : matplotlib.axes.Axes (default None) + axes on which to draw the plot + figsize : tuple of integers (default None) + Size of the resulting ``matplotlib.figure.Figure``. If the argument + ``ax`` is given explicitly, ``figsize`` is ignored. + **kwargs + Keyword arguments passed to :meth:`~matplotlib.pyplot.contour` or + :meth:`~matplotlib.pyplot.contourf` used for further + styling of the plot, for example ``cmap``, ``linewidths``, ``linestyles``, + or `alpha`. See the documentation of :meth:`~matplotlib.pyplot.contour` for + details. + + Returns + ------- + matplotlib.axes.Axes + matplotlib axes instance with the contour plot + """ + if kernel is None: + try: + import statsmodels.api as sm + except ImportError as err: + raise ImportError( + "statsmodels is required for `plot_density` when kernel" + "is not specified." + ) from err + + engine = "sm" + else: + try: + from KDEpy import FFTKDE + except ImportError as err: + raise ImportError( + "KDEpy is required for `plot_density` when kernel is not None." + ) from err + + engine = "kdepy" + + try: + import matplotlib.pyplot as plt + except ImportError as err: + raise ImportError("matplotlib is required for `plot_density`") from err + + if ax is None: + _, ax = plt.subplots(figsize=figsize) + + ax.set_aspect("equal") # bandwidth is fixed, hence aspect shall be equal + + if isinstance(data, np.ndarray): + pass + else: # geopandas + if not data.geom_type.str.contains("Point").all(): + raise ValueError( + "data contain non-point geometries. " + "Only (Multi)Points are supported." + ) + data = data.get_coordinates().values + + if engine == "sm": + dens_u = sm.nonparametric.KDEMultivariate( + data=[data[:, 0], data[:, 1]], + var_type="cc", + bw=[bandwidth, bandwidth], + ) + + xmax = data[:, 0].max() + xmin = data[:, 0].min() + ymax = data[:, 1].max() + ymin = data[:, 1].min() + + # get margin to go beyond the extent to avoid cutting of countour lines + x_margin = (xmax - xmin) * margin + y_margin = (ymax - ymin) * margin + + if isinstance(resolution, tuple): + x_res, y_res = resolution + elif isinstance(resolution, (float, int)): + x_res = resolution + y_res = resolution + elif resolution is None: + x_res = 100 + y_res = 100 + else: + raise ValueError("Unsupported option for `resolution`.") + + # create mesh for predicting KDE on with more space around the points + x_mesh, y_mesh = np.meshgrid( + np.linspace(xmin - x_margin, xmax + x_margin, x_res), + np.linspace(ymin - y_margin, ymax + y_margin, y_res), + ) + + # get the prediction + pred = dens_u.pdf(np.vstack([x_mesh.flatten(), y_mesh.flatten()]).T) + z = pred.reshape(x_mesh.shape) + + else: + kde = FFTKDE(bw=bandwidth, kernel=kernel) + grid, points = kde.fit(data).evaluate(resolution) + x_mesh, y_mesh = np.unique(grid[:, 0]), np.unique(grid[:, 1]) + z = points.reshape(resolution, resolution).T + + if fill: + ax.contourf(x_mesh, y_mesh, z, levels=levels, **kwargs) + else: + ax.contour(x_mesh, y_mesh, z, levels=levels, **kwargs) + + return ax
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/pointpattern.html b/_modules/pointpats/pointpattern.html new file mode 100644 index 0000000..cdad997 --- /dev/null +++ b/_modules/pointpats/pointpattern.html @@ -0,0 +1,716 @@ + + + + + + + pointpats.pointpattern — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.pointpattern

+"""
+Planar Point Pattern Class
+
+"""
+import numpy as np
+import sys
+from libpysal.cg import KDTree
+from .centrography import hull
+from .window import as_window,  poly_from_bbox
+from .util import cached_property
+import pandas as pd
+from matplotlib import pyplot as plt
+from matplotlib.collections import PatchCollection
+from matplotlib.patches import Polygon
+
+__author__ = "Serge Rey sjsrey@gmail.com"
+__all__ = ['PointPattern']
+
+if sys.version_info[0] > 2:
+    xrange = range
+
+
+
+[docs] +class PointPattern(object): + """ + Planar Point Pattern Class 2-D. + + Parameters + ---------- + points: array + (n,p), n points with p >= 2 attributes on each + point. Two attributes must comprise the spatial + coordinate pair. Default is that the first two + attributes are the x and y spatial coordinates. + window: :class:`.Window` + Bounding geometric object for the point pattern. + If not specified, window will be set to the minimum + bounding rectangle of the point pattern. + names: list + The names of the attributes. + coord_names: list + The names of the attributes defining the two spatial + coordinates. + + Examples + -------- + >>> from pointpats import PointPattern + >>> points = [[66.22, 32.54], [22.52, 22.39], [31.01, 81.21], + ... [9.47, 31.02], [30.78, 60.10], [75.21, 58.93], + ... [79.26, 7.68], [8.23, 39.93], [98.73, 77.17], + ... [89.78, 42.53], [65.19, 92.08], [54.46, 8.48]] + >>> pp = PointPattern(points) + >>> pp.n + 12 + >>> pp.mean_nnd + 21.612139802089246 + >>> pp.lambda_mbb + 0.0015710507711240867 + >>> pp.lambda_hull + 0.0022667153468973137 + >>> pp.hull_area + 5294.00395 + >>> pp.mbb_area + 7638.200000000001 + + """ +
+[docs] + def __init__(self, points, window=None, names=None, coord_names=None): + + # first two series in df are x, y unless coor_names and names are + # specified + + self.df = pd.DataFrame(points) + n, p = self.df.shape + self._n_marks = p - 2 + if coord_names is None: + if names is not None: + coord_names = names[:2] + else: + coord_names = ['x', 'y'] + if names is None: + col_names = coord_names + if p > 2: + for m in range(2, p): + col_names.append("mark_{}".format(m-2)) + coord_names = coord_names[:2] + else: + col_names = names + + self.coord_names = coord_names + self._x, self._y = coord_names + self.df.columns = col_names + self.points = self.df.loc[:, [self._x, self._y]] + self._n, self._p = self.points.shape + if window is None: + self.set_window(as_window(poly_from_bbox(self.mbb))) + else: + self.set_window(window) + + self._facade()
+ + + def __len__(self): + """Return the number of points. Use the expression 'len(pp)'. + + Returns + ------- + length : int + The number of points in the point pattern. + + Examples + -------- + >>> from pointpats import PointPattern + >>> points = [[1, 3], [4, 5], [0,0]] + >>> pp = PointPattern(points) + >>> len(pp) + 3 + + """ + return len(self.df) + + def __contains__(self, n): + """Return True if n is a point (a tuple of coordinates), False otherwise. + Use the expression 'n in pp'. + + Examples + -------- + >>> from pointpats import PointPattern + >>> points = [[1, 3], [4, 5], [0,0]] + >>> pp = PointPattern(points) + >>> [1, 3] in pp + True + """ + name = self.df.columns.values.tolist() + return ((self.df[name[0]] == n[0]) & (self.df[name[1]] == n[1])).any() + +
+[docs] + def set_window(self, window): + try: + self._window = window + except: + print("not a valid Window object")
+ + +
+[docs] + def get_window(self): + """ + Bounding geometry for the point pattern + + :class:`.window.Window` + """ + if not hasattr(self, '_window') or self._window is None: + # use bbox as window + self.set_window(as_window(poly_from_bbox(self.mbb))) + return self._window
+ + + window = property(get_window, set_window) + +
+[docs] + def summary(self): + ''' + Description of the point pattern. + ''' + + print('Point Pattern') + print("{} points".format(self.n)) + print("Bounding rectangle [({},{}), ({},{})]".format(*self.mbb)) + print("Area of window: {}".format(self.window.area)) + print("Intensity estimate for window: {}".format(self.lambda_window)) + print(self.head())
+ + +
+[docs] + def add_marks(self, marks, mark_names=None): + if mark_names is None: + nm = range(len(marks)) + mark_names = ["mark_{}".format(self._n_marks+1+j) for j in nm] + for name, mark in zip(mark_names, marks): + self.df[name] = mark + self._n_marks += 1
+ + +
+[docs] + def plot(self, window=False, title="Point Pattern", hull=False, + get_ax=False): + """ + Plot function for a point pattern. + + Parameters + ---------- + window : boolean + If window is True, plot window of the point + pattern. If not, don't plot window. + title : string + Name of the figure. + hull : boolean + If hull is True, plot convex hull of the point + pattern. If not, don't plot convex hull. + get_ax : boolean + If get_ax is True, return the current plot ax. + + Returns + ------- + ax : matplotlib.axes._subplots.AxesSubplot + Current plot ax. Only return it when get_ax is True. + + """ + fig, ax = plt.subplots() + plt.plot(self.df[self._x], self.df[self._y], '.') + # plt.scatter(self.df[self._x], self.df[self._y]) + plt.title(title) + if window: + patches = [] + for part in self.window.parts: + p = Polygon(np.asarray(part)) + patches.append(p) + ax.add_collection( + PatchCollection(patches, facecolor="none", edgecolor="k", alpha=0.3) + ) + if hull: + patches = [] + p = Polygon(self.hull) + patches.append(p) + ax.add_collection( + PatchCollection(patches, facecolor="none", edgecolor="k", alpha=0.3) + ) + ax.set_aspect("equal") + + # plt.plot(x, y, '.') + if get_ax: + return ax
+ + + def _mbb(self): + """ + Minimum bounding box + """ + mins = self.points.min(axis=0) + maxs = self.points.max(axis=0) + return np.hstack((mins, maxs)) + + mbb = cached_property(_mbb) + + def _mbb_area(self): + """ + Area of minimum bounding box + """ + + return np.product(self.mbb[[2, 3]]-self.mbb[[0, 1]]) + + mbb_area = cached_property(_mbb_area) + + def _n(self): + """ + Number of points + """ + return self.points.shape[0] + + n = cached_property(_n) + + def _rot(self): + """ + Ripley's rule of thumb for distance range in plotting k and related functions + + One-quarter the smallest side of the mbb. + """ + w, s, e, n = self.mbb + return 0.25 * min(e-w, n-s) + + rot = cached_property(_rot) + + def _lambda_mbb(self): + """ + Intensity based on minimum bounding box + """ + return self.n * 1. / self.mbb_area + + lambda_mbb = cached_property(_lambda_mbb) + + def _hull(self): + """ + Points defining convex hull in counterclockwise order + """ + return hull(self.points) + + hull = cached_property(_hull) + + def _lambda_window(self): + """ + Intensity estimate based on area of window + + The intensity of a point process at point :math:`s_j` can be defined + as: + + .. math:: + + \\lambda(s_j) = \\lim \\limits_{|\\mathbf{A}s_j| + \\to 0} \\left \\{ \\frac{E(Y(\mathbf{A}s_j)}{|\mathbf{A}s_j|} + \\right \\} + + where :math:`\\mathbf{A}s_j` is a small region surrounding location + :math:`s_j` with area :math:`|\\mathbf{A}s_j|`, and + :math:`E(Y(\\mathbf{A}s_j))` is the expected number of event points in + :math:`\\mathbf{A}s_j`. + + The intensity is the mean number of event points per unit of area at + point :math:`s_j`. + + """ + return self.n / self.window.area + + lambda_window = cached_property(_lambda_window) + + def _hull_area(self): + """ + Area of convex hull + """ + h = self.hull + if not np.alltrue(h[0] == h[-1]): + # not in closed cartographic form + h = np.vstack((h, h[0])) + s = h[:-1, 0] * h[1:, 1] - h[1:, 0] * h[:-1, 1] + return s.sum() / 2. + + hull_area = cached_property(_hull_area) + + def _lambda_hull(self): + """ + Intensity based on convex hull + """ + return self.n * 1. / self.hull_area + + lambda_hull = cached_property(_lambda_hull) + + def _build_tree(self): + return KDTree(self.points) + tree = cached_property(_build_tree) + +
+[docs] + def knn(self, k=1): + """ + Find k nearest neighbors for each point in the pattern + + Parameters + ---------- + k: int + number of nearest neighbors to find + + Returns + ------- + nn: array (n x k) + row i column j contains the id for i's jth nearest neighbor + + nnd: array(n x k) + row i column j contains the distance between i and its jth + nearest neighbor + """ + if k < 1: + raise ValueError('k must be at least 1') + nn = self.tree.query(self.tree.data, k=k+1) + return nn[1][:, 1:], nn[0][:, 1:]
+ + + def _nn_sum(self): + """ + Nearest neighbor distances + """ + ids, nnd = self.knn(1) + return nnd + + nnd = cached_property(_nn_sum) # nearest neighbor distances + + def _min_nnd(self): + """ + Min nearest neighbor distance + """ + return self.nnd.min() + + min_nnd = cached_property(_min_nnd) + + def _max_nnd(self): + """ + Max nearest neighbor distance + """ + return self.nnd.max() + + max_nnd = cached_property(_max_nnd) + + def _mean_nnd(self): + """ + Mean nearest neighbor distance + """ + return self.nnd.mean() + + mean_nnd = cached_property(_mean_nnd) + +
+[docs] + def find_pairs(self, r): + """ + Find all pairs of points in the pattern that are within r units of each + other + + Parameters + ---------- + r: float + diameter of pair circle + + Returns + ------- + s: set + pairs of points within r units of each other + + """ + return self.tree.query_pairs(r)
+ + +
+[docs] + def knn_other(self, other, k=1): + """ + Find k nearest neighbors in the pattern for each point in other + + Parameters + ---------- + other: PointPattern + :py:class:`pointpats.PointPattern` + k: int + number of nearest neighbors to find + + Returns + ------- + nn: array (n x k) + row i column j contains the id for i's jth nearest neighbor + + nnd: array(n x k) + row i column j contains the distance between i and its jth + nearest neighbor + """ + if k < 1: + raise ValueError('k must be at least 1') + try: + nn = self.tree.query(np.asarray(other.points), k=k) + except: + nn = self.tree.query(np.asarray(other), k=k) + return nn[1], nn[0]
+ + +
+[docs] + def explode(self, mark): + """ + Explode a marked point pattern into a sequence of individual point + patterns. If the mark has k unique values, then the sequence will be of + length k. + + Parameters + ---------- + mark: string + The label of the mark to use for the subsetting + + Returns + ------- + pps: list + sequence of :class:`PointPattern` instances + """ + + uv = np.unique(self.df[mark]) + pps = [self.df[self.df[mark] == v] for v in uv] + names = self.df.columns.values.tolist() + cnames = self.coord_names + return[PointPattern(pp, names=names, coord_names=cnames) for pp in pps]
+ + +
+[docs] + def unique(self): + """ Remove duplicate points in the point pattern. + + Two points in a point pattern are deemed to be identical if their + coordinates are the same, and their marks are the same (if any) + + Returns + ------- + pp: list + A deduplicated :class:`PointPattern` instance + + Examples + -------- + >>> from pointpats import PointPattern + >>> points = [[1.2, 2.1], [1.2, 2.1], [0, 1], [1, 2]] + >>> pp = PointPattern(points) + >>> pp.unique().df + x y + 0 1.2 2.1 + 2 0.0 1.0 + 3 1.0 2.0 + """ + names = self.df.columns.values.tolist() + coord_names = self.coord_names + window = self.set_window + unique_df = self.df.drop_duplicates() + return PointPattern(unique_df, names=names, coord_names=coord_names, + window=window)
+ + +
+[docs] + def superimpose(self, point_pattern): + """Returns a superimposed point pattern. + + Parameters + ---------- + point_pattern: + :class:`PointPattern` instance + + Returns + ------- + superimposed : + :class:`PointPattern` instance + + Examples + -------- + >>> from pointpats import PointPattern + >>> points1 = [[1, 3], [4, 5], [0, 0]] + >>> points2 = [[5, 6], [1, 4], [0, 0]] + >>> pp1 = PointPattern(points1) + >>> pp2 = PointPattern(points2) + >>> pp1.superimpose(pp2).points + x y + 0 1 3 + 1 4 5 + 2 0 0 + 0 5 6 + 1 1 4 + """ + names_pp1 = self.df.columns.values.tolist() + cnames_pp1 = self.coord_names + names_pp2 = point_pattern.df.columns.values.tolist() + cnames_pp2 = point_pattern.coord_names + if names_pp1 != names_pp2 or cnames_pp1 != cnames_pp2: + raise TypeError('Both point patterns should have similar\ + attributes and spatial coordinates ') + pp = pd.concat((self.df, point_pattern.df)) + pp = pp.drop_duplicates() + return PointPattern(pp, names=names_pp1, coord_names=cnames_pp1)
+ + +
+[docs] + def flip_coordinates(self): + """ Flips the coordinates of a point pattern. + + Doesn't change the structure of data frame. This function swaps + `_x` and `_y` variables, which are used to represent coordinates. + """ + self._x, self._y = self._y, self._x
+ + + # Pandas facade + def _facade(self): + self.head = self.df.head + self.tail = self.df.tail
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/process.html b/_modules/pointpats/process.html new file mode 100644 index 0000000..a20ced6 --- /dev/null +++ b/_modules/pointpats/process.html @@ -0,0 +1,655 @@ + + + + + + + pointpats.process — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.process

+"""
+Simulation of planar point processes
+
+TODO
+
+- inhibition process(es)
+- optimize draws for complex windows
+- documentation
+"""
+
+__author__ = "Serge Rey sjsrey@gmail.com"
+__all__ = ["PointProcess", "PoissonPointProcess", "PoissonClusterPointProcess"]
+
+import numpy as np
+import libpysal as ps
+from numpy.random import poisson
+from .pointpattern import PointPattern as PP
+import warnings
+
+warnings.filterwarnings(
+    "ignore", "Objects based on the `Geometry` class will", FutureWarning
+)
+
+
+def runif_in_circle(n, radius=1.0, center=(0.0, 0.0), burn=2, verbose=False):
+    """
+    Generate n points within a circle of given radius.
+
+    Parameters
+    ----------
+    n             : int
+                    Number of points.
+    radius        : float
+                    Radius of the circle.
+    center        : tuple
+                    Coordinates of the center.
+
+    Returns
+    -------
+                  : array
+                    (n+1, 2), coordinates of generated points as well as
+                    the center.
+
+    """
+
+    good = np.zeros((n, 2), float)
+    c = 0
+    r = radius
+    r2 = r * r
+    it = 0
+    while c < n:
+        x = np.random.uniform(-r, r, (burn * n, 1))
+        y = np.random.uniform(-r, r, (burn * n, 1))
+        ids = np.where(x * x + y * y <= r2)
+        candidates = np.hstack((x, y))[ids[0]]
+        nc = candidates.shape[0]
+        need = n - c
+        if nc > need:  # more than we need
+            good[c:] = candidates[:need]
+        else:  # use them all and keep going
+            good[c : c + nc] = candidates
+        c += nc
+        it += 1
+    if verbose:
+        print("Iterations: {}".format(it))
+    return good + np.asarray(center)
+
+
+
+[docs] +class PointProcess(object): + """ + Point Process base class. + + Parameters + ---------- + window : :py:class:`~.window.Window` + Bounding geometric object to contain point process + realizations. + n : int + Size of each realization. + samples : list + Number of realizations. + asPP : bool + Control the data type of value in the "realizations" + dictionary. If True, the data type is point + pattern as defined in pointpattern.py; if False, + the data type is an two-dimensional array. + + Attributes + ---------- + realizations : dictionary + The key is the index of each realization, and the + value is simulated event points for each + realization. The data type of the value is + controlled by the parameter "asPP". + parameters : dictionary + Dictionary of a dictionary. + The key is the index of each realization, and the + value is a dictionary with the key 'n' and the + value size of each realization. + + """ + +
+[docs] + def __init__(self, window, n, samples, asPP=False, **args): + super(PointProcess, self).__init__() + self.window = window + self.n = n + self.samples = samples + self.args = args + self.realizations = {} + self.setup() + for sample in range(samples): + self.realizations[sample] = self.draw(self.parameters[sample]) + if asPP: + for sample in self.realizations: + points = self.realizations[sample] + self.realizations[sample] = PP(points, window=self.window) + warnings.warn( + "These point pattern simulators are deprecated! Please replace them" + " with equivalent functions in pointpats.random", + DeprecationWarning, + stacklevel=2, + )
+ + +
+[docs] + def draw(self, parameter): + """ + Generate a series of point coordinates within the given window. + + Parameters + ---------- + parameter : dictionary + Key: 'n'. + Value: size of the realization. + + Returns + ------- + : array + A series of point coordinates. + + """ + c = 0 + sample = [] + n = parameter["n"] + while c < n: + pnts = self.realize(n) + pnts = [ps.cg.shapes.Point((x, y)) for x, y in pnts] + pins = self.window.filter_contained(pnts) + sample.extend(pins) + c = len(sample) + return np.array([np.asarray(p) for p in sample[:n]])
+ + +
+[docs] + def realize(self): + pass
+ + +
+[docs] + def setup(self): + pass
+
+ + + +
+[docs] +class PoissonPointProcess(PointProcess): + """ + Poisson point process including :math:`N`-conditioned CSR process and + :math:`\lambda`-conditioned CSR process. + + Parameters + ---------- + window : :py:class:`~.window.Window` + Bounding geometric object to contain point process + realizations. + n : int + Size of each realization. + samples : list + Number of realizations. + conditioning : bool + If True, use the :math:`\lambda`-conditioned CSR process, + number of events would vary across realizations; + if False, use the :math:`N`-conditioned CSR process. + asPP : bool + Control the data type of value in the "realizations" + dictionary. If True, the data type is point + pattern as defined in pointpattern.py; if False, + the data type is an two-dimensional array. + + Attributes + ---------- + realizations : dictionary + The key is the index of each realization, and the + value is simulated event points for each + realization. The data type of the value is + controlled by the parameter "asPP". + parameters : dictionary + Dictionary of a dictionary. + The key is the index of each realization, and the + value is a dictionary with the key 'n' and the + value: + 1. always equal to the parameter n in the case of + N-conditioned process. + For example, {0:{'n':100},1:{'n':100},2:{'n':100}} + 2. randomly generated from a Possion process in + the case of lambda-conditioned process. + For example, {0:{'n':97},1:{'n':100},2:{'n':98}} + + Examples + -------- + >>> import libpysal as ps + >>> import numpy as np + >>> from pointpats import Window + >>> from libpysal.cg import shapely_ext + + Open the virginia polygon shapefile + + >>> va = ps.io.open(ps.examples.get_path("virginia.shp")) + + Create the exterior polygons for VA from the union of the county shapes + + >>> polys = [shp for shp in va] + >>> state = shapely_ext.cascaded_union(polys) + + Create window from virginia state boundary + + >>> window = Window(state.parts) + + 1. Simulate a :math:`N`-conditioned csr process in the same window (10 + points, 2 realizations) + + >>> np.random.seed(5) + >>> samples1 = PoissonPointProcess(window, 10, 2, conditioning=False, asPP=False) + >>> samples1.realizations[0] # the first realized event points + array([[-81.80326547, 36.77687577], + [-78.5166233 , 37.34055832], + [-77.21660795, 37.7491503 ], + [-79.30361037, 37.40467853], + [-78.61625258, 36.61234487], + [-81.43369537, 37.13784646], + [-80.91302108, 36.60834063], + [-76.90806444, 37.95525903], + [-76.33475868, 36.62635347], + [-79.71621808, 37.27396618]]) + + 2. Simulate a :math:`\lambda`-conditioned csr process in the same window (10 + points, 2 realizations) + + >>> np.random.seed(5) + >>> samples2 = PoissonPointProcess(window, 10, 2, conditioning=True, asPP=True) + >>> samples2.realizations[0].n # the size of first realized point pattern + 10 + >>> samples2.realizations[1].n # the size of second realized point pattern + 13 + + """ + +
+[docs] + def __init__(self, window, n, samples, conditioning=False, asPP=False): + self.conditioning = conditioning + super(PoissonPointProcess, self).__init__(window, n, samples, asPP)
+ + +
+[docs] + def setup(self): + """ + Generate the number of events for each realization. If + "conditioning" is False, all the event numbers are the same; + if it is True, the event number is a random variable + following a Poisson distribution. + + """ + + self.parameters = {} + if self.conditioning: + lambdas = poisson(self.n, self.samples) + for i, l in enumerate(lambdas): + self.parameters[i] = {"n": l} + else: + for i in range(self.samples): + self.parameters[i] = {"n": self.n}
+ + +
+[docs] + def realize(self, n): + """ + Generate n points which are randomly and independently + distributed in the minimum bounding box of "window". + + Parameters + ---------- + n : int + Number of point events. + + Returns + ------- + : array + (n,2), n point coordinates. + + """ + + l, b, r, t = self.window.bbox + xs = np.random.uniform(l, r, (n, 1)) + ys = np.random.uniform(b, t, (n, 1)) + return zip(xs, ys)
+
+ + + +
+[docs] +class PoissonClusterPointProcess(PointProcess): + """ + Poisson cluster point process (Neyman Scott). + Two stages: + 1. parent CSR process: :math:`N`-conditioned or + :math:`\lambda`-conditioned. If parent events follow a + :math:`\lambda`-conditioned CSR process, + the number of parent events varies across realizations. + 2. child process: fixed number of points in circle centered + on each parent. + + Parameters + ---------- + window : :py:class:`~.window.Window` + Bounding geometric object to contain point process + realizations. + n : int + Size of each realization. + parents : int + Number of parents. + radius : float + Radius of the circle centered on each parent. + samples : list + Number of realizations. + asPP : bool + Control the data type of value in the "realizations" + dictionary. If True, the data type is point + pattern as defined in pointpattern.py; if False, + the data type is an two-dimensional array. + conditioning : bool + If True, use the :math:`lambda`-conditioned CSR process + for parent events, leading to varied number of + parent events across realizations; + if False, use the :math:`N`-conditioned CSR process. + + Attributes + ---------- + children : int + Number of childrens centered on each parent. Can + be considered as local intensity. + num_parents : dictionary + The key is the index of each realization. The + value is the number of parent events for each + realization. + realizations : dictionary + The key is the index of each realization, and the + value is simulated event points for each + realization. The data type of the value is + controlled by the parameter "asPP". + parameters : dictionary + Dictionary of a dictionary. + The key is the index of each realization, and the + value is a dictionary with the key 'n' and the + value always equal to the parameter n in the + case of + N-conditioned process. + For example, {0:{'n':100},1:{'n':100},2:{'n':100}} + 2. randomly generated from a Possion process in + the case of lambda-conditioned process. + For example, {0:{'n':97},1:{'n':100},2:{'n':98}} + + Examples + -------- + >>> import libpysal as ps + >>> import numpy as np + >>> from pointpats import Window + >>> from libpysal.cg import shapely_ext + + Open the virginia polygon shapefile + + >>> va = ps.io.open(ps.examples.get_path("virginia.shp")) + + Create the exterior polygons for VA from the union of the county shapes + + >>> polys = [shp for shp in va] + >>> state = shapely_ext.cascaded_union(polys) + + Create window from virginia state boundary + + >>> window = Window(state.parts) + + 1. Simulate a Poisson cluster process of size 200 with 10 parents + and 20 children within 0.5 units of each parent + (parent events: :math:`N`-conditioned CSR) + + >>> np.random.seed(10) + >>> samples1 = PoissonClusterPointProcess(window, 200, 10, 0.5, 1, asPP=True, conditioning=False) + >>> samples1.parameters # number of events for the realization + {0: {'n': 200}} + >>> samples1.num_parents #number of parent events for each realization + {0: 10} + >>> samples1.children # number of children events centered on each parent event + 20 + + 2. Simulate a Poisson cluster process of size 200 with 10 parents + and 20 children within 0.5 units of each parent + (parent events: :math:`\lambda`-conditioned CSR) + + >>> np.random.seed(10) + >>> samples2 = PoissonClusterPointProcess(window, 200, 10, 0.5, 1, asPP=True, conditioning=True) + >>> samples2.parameters # number of events for the realization might not be equal to 200 + {0: {'n': 260}} + >>> samples2.num_parents #number of parent events for each realization + {0: 13} + >>> samples2.children # number of children events centered on each parent event + 20 + + """ + +
+[docs] + def __init__( + self, + window, + n, + parents, + radius, + samples, + keep=False, + asPP=False, + conditioning=False, + ): + self.conditioning = conditioning + self.parents = parents + self.children = int(np.ceil(n * 1.0 / parents)) + self.radius = radius + self.keep = keep + super(PoissonClusterPointProcess, self).__init__(window, n, samples, asPP)
+ + +
+[docs] + def setup(self): + """ + Generate the number of events for each realization. If + "conditioning" is False, all the event numbers are the same; + if it is True, the number of parents is a random variable + following a Poisson distribution, resulting in varied number + of events. + + """ + + self.parameters = {} + self.num_parents = {} + if self.conditioning: + lambdas = poisson(self.parents, self.samples) + for i, l in enumerate(lambdas): + num = l * self.children + self.parameters[i] = {"n": num} + self.num_parents[i] = l + else: + for i in range(self.samples): + self.parameters[i] = {"n": self.n} + self.num_parents[i] = self.parents
+ + +
+[docs] + def realize(self, n): + """ + Generate n points which are distributed in a clustered + fashion in the minimum bounding box of "window". + + Parameters + ---------- + n : int + Number of point events. + + Returns + ------- + res : array + (n,2), n point coordinates. + + """ + l, b, r, t = self.window.bbox + d = self.radius + # get parent points + pxs = np.random.uniform(l, r, (int(n / self.children), 1)) + pys = np.random.uniform(b, t, (int(n / self.children), 1)) + cents = np.hstack((pxs, pys)) + # generate children points + pnts = [runif_in_circle(self.children, d, center) for center in cents] + res = np.vstack(np.asarray(pnts)) + if self.keep: + res = np.vstack((np.asarray(cents), res)) + np.random.shuffle(res) # so we don't truncate in a biased fashion + return res
+
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/quadrat_statistics.html b/_modules/pointpats/quadrat_statistics.html new file mode 100644 index 0000000..9aec797 --- /dev/null +++ b/_modules/pointpats/quadrat_statistics.html @@ -0,0 +1,664 @@ + + + + + + + pointpats.quadrat_statistics — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.quadrat_statistics

+"""
+Quadrat statistics for planar point patterns
+
+
+TODO
+
+- use patch in matplotlib to plot rectangles and hexagons
+- plot chi2 statistics in each cell
+- delete those cells that do not intersect with the window (study area)
+
+"""
+
+__author__ = "Serge Rey, Wei Kang, Hu Shao"
+__all__ = ["RectangleM", "HexagonM", "QStatistic"]
+
+from .pointpattern import PointPattern
+import numpy as np
+from matplotlib import pyplot as plt
+import math
+import scipy
+
+
+
+[docs] +class RectangleM: + """ + Rectangle grid structure for quadrat-based method. + + Parameters + ---------- + pp : :class:`.PointPattern` + Point Pattern instance. + count_column : integer + Number of rectangles in the horizontal + direction. Use in pair with count_row to + fully specify a rectangle. Incompatible with + rectangle_width and rectangle_height. + count_row : integer + Number of rectangles in the vertical + direction. Use in pair with count_column to + fully specify a rectangle. Incompatible with + rectangle_width and rectangle_height. + rectangle_width : float + Rectangle width. Use in pair with + rectangle_height to fully specify a rectangle. + Incompatible with count_column & count_row. + rectangle_height : float + Rectangle height. Use in pair with + rectangle_width to fully specify a rectangle. + Incompatible with count_column & count_row. + + Attributes + ---------- + pp : :class:`.PointPattern` + Point Pattern instance. + mbb : array + Minimum bounding box for the point pattern. + points : array + x,y coordinates of the point points. + count_column : integer + Number of columns. + count_row : integer + Number of rows. + num : integer + Number of rectangular quadrats. + rectangle_width : float + Width of a rectangular quadrat. + rectangle_height : float + Height of a rectangular quadrat. + + """ + +
+[docs] + def __init__( + self, pp, count_column=3, count_row=3, rectangle_width=0, rectangle_height=0 + ): + self.mbb = pp.mbb + self.pp = pp + self.points = np.asarray(pp.points) + x_range = self.mbb[2] - self.mbb[0] + y_range = self.mbb[3] - self.mbb[1] + if rectangle_width and rectangle_height: + self.rectangle_width = rectangle_width + self.rectangle_height = rectangle_height + + # calculate column count and row count + self.count_column = int(math.ceil(x_range / rectangle_width)) + self.count_row = int(math.ceil(y_range / rectangle_height)) + else: + self.count_column = count_column + self.count_row = count_row + + # calculate the actual width and height of cell + self.rectangle_width = x_range / float(count_column) + self.rectangle_height = y_range / float(count_row) + self.num = self.count_column * self.count_row
+ + +
+[docs] + def point_location_sta(self): + """ + Count the point events in each cell. + + Returns + ------- + dict_id_count : dict + keys: rectangle id, values: number of point + events in each cell. + """ + + dict_id_count = {} + for i in range(self.count_row): + for j in range(self.count_column): + dict_id_count[j + i * self.count_column] = 0 + + for point in self.points: + index_x = (point[0] - self.mbb[0]) // self.rectangle_width + index_y = (point[1] - self.mbb[1]) // self.rectangle_height + if index_x == self.count_column: + index_x -= 1 + if index_y == self.count_row: + index_y -= 1 + id = index_y * self.count_column + index_x + dict_id_count[id] += 1 + return dict_id_count
+ + +
+[docs] + def plot(self, title="Quadrat Count"): + """ + Plot rectangle tessellation as well as the number of points falling in each rectangle. + + Parameters + ---------- + title: str, optional + Title of the plot. Default is "Quadrat Count". + + """ + + line_width_cell = 1 + line_color_cell = "red" + + x_min = self.mbb[0] + y_min = self.mbb[1] + + # draw the point pattern along with its window + ax = self.pp.plot(window=True, title=title, get_ax=True) + + # draw cells and counts + x_start_end = [x_min, x_min + self.count_column * self.rectangle_width] + for row in range(self.count_row + 1): + y = y_min + row * self.rectangle_height + ax.plot(x_start_end, [y, y], lw=line_width_cell, color=line_color_cell) + y_start_end = [y_min, y_min + self.count_row * self.rectangle_height] + for column in range(self.count_column + 1): + x = x_min + column * self.rectangle_width + ax.plot([x, x], y_start_end, lw=line_width_cell, color=line_color_cell) + + dict_id_count = self.point_location_sta() + for x in range(self.count_column): + for y in range(self.count_row): + cell_id = x + y * self.count_column + count = dict_id_count[cell_id] + position_x = x_min + self.rectangle_width * (x + 0.5) + position_y = y_min + self.rectangle_height * (y + 0.5) + ax.text(position_x, position_y, str(count), ha="center", va="center") + return ax
+
+ + + +
+[docs] +class HexagonM: + """ + Hexagon grid structure for quadrat-based method. + + Parameters + ---------- + pp : :class:`.PointPattern` + Point Pattern instance. + lh : float + Hexagon length (hexagon). + + Attributes + ---------- + pp : :class:`.PointPattern` + Point Pattern instance. + h_length : float + Hexagon length (hexagon). + mbb : array + Minimum bounding box for the point pattern. + points : array + x,y coordinates of the point points. + h_length : float + Hexagon length (hexagon). + count_row_even : integer + Number of even rows. + count_row_odd : integer + Number of odd rows. + count_column : integer + Number of columns. + num : integer + Number of hexagonal quadrats. + + """ + +
+[docs] + def __init__(self, pp, lh): + + self.points = np.asarray(pp.points) + self.pp = pp + self.h_length = lh + self.mbb = pp.mbb + range_x = self.mbb[2] - self.mbb[0] + range_y = self.mbb[3] - self.mbb[1] + + # calculate column count + self.count_column = 1 + if self.h_length / 2.0 < range_x: + temp = math.ceil((range_x - self.h_length / 2) / (1.5 * self.h_length)) + self.count_column += int(temp) + + # calculate row count for the even columns + self.semi_height = self.h_length * math.cos(math.pi / 6) + self.count_row_even = 1 + if self.semi_height < range_y: + temp = math.ceil((range_y - self.semi_height) / (self.semi_height * 2)) + self.count_row_even += int(temp) + + # for the odd columns + self.count_row_odd = int(math.ceil(range_y / (self.semi_height * 2))) + + # quadrat number + self.num = self.count_row_odd * ( + (self.count_column // 2) + self.count_column % 2 + ) + self.count_row_even * (self.count_column // 2)
+ + +
+[docs] + def point_location_sta(self): + """ + Count the point events in each hexagon cell. + + Returns + ------- + dict_id_count : dict + keys: rectangle id, values: number of point + events in each hexagon cell. + """ + semi_cell_length = self.h_length / 2.0 + dict_id_count = {} + + # even row may be equal with odd row or 1 more than odd row + for i in range(self.count_row_even): + for j in range(self.count_column): + if ( + self.count_row_even != self.count_row_odd + and i == self.count_row_even - 1 + ): + if j % 2 == 1: + continue + dict_id_count[j + i * self.count_column] = 0 + + x_min = self.mbb[0] + y_min = self.mbb[1] + x_max = self.mbb[2] + y_max = self.mbb[3] + points = np.array(self.points) + for point in points: + # find the possible x index + intercept_degree_x = (point[0] - x_min) // semi_cell_length + + # find the possible y index + possible_y_index_even = int( + (point[1] + self.semi_height - y_min) / (self.semi_height * 2) + ) + possible_y_index_odd = int((point[1] - y_min) / (self.semi_height * 2)) + if intercept_degree_x % 3 != 1: + center_index_x = (intercept_degree_x + 1) // 3 + center_index_y = possible_y_index_odd + if center_index_x % 2 == 0: + center_index_y = possible_y_index_even + dict_id_count[center_index_x + center_index_y * self.count_column] += 1 + else: # two columns of cells can be possible + center_index_x = intercept_degree_x // 3 + center_x = center_index_x * semi_cell_length * 3 + x_min + center_index_y = possible_y_index_odd + center_y = (center_index_y * 2 + 1) * self.semi_height + y_min + if center_index_x % 2 == 0: + center_index_y = possible_y_index_even + center_y = center_index_y * self.semi_height * 2 + y_min + + if point[1] > center_y: # compare the upper bound + x0 = center_x + self.h_length + y0 = center_y + x1 = center_x + semi_cell_length + y1 = center_y + self.semi_height + indicator = -( + point[1] + - ( + (y0 - y1) / (x0 - x1) * point[0] + + (x0 * y1 - x1 * y0) / (x0 - x1) + ) + ) + else: # compare the lower bound + x0 = center_x + semi_cell_length + y0 = center_y - self.semi_height + x1 = center_x + self.h_length + y1 = center_y + indicator = point[1] - ( + (y0 - y1) / (x0 - x1) * point[0] + + (x0 * y1 - x1 * y0) / (x0 - x1) + ) + if indicator <= 0: + # we select right hexagon instead of the left + center_index_x += 1 + center_index_y = possible_y_index_odd + if center_index_x % 2 == 0: + center_index_y = possible_y_index_even + dict_id_count[center_index_x + center_index_y * self.count_column] += 1 + return dict_id_count
+ + +
+[docs] + def plot(self, title="Quadrat Count"): + """ + Plot hexagon quadrats as well as the number of points falling in each quadrat. + + Parameters + ---------- + title: str, optional + Title of the plot. Default is "Quadrat Count". + + """ + line_width_cell = 1 + line_color_cell = "red" + + # draw the point pattern along with its window + ax = self.pp.plot(window=True, title=title, get_ax=True) + + x_min = self.mbb[0] + y_min = self.mbb[1] + + # draw cells and counts + dict_id_count = self.point_location_sta() + for id in dict_id_count.keys(): + index_x = id % self.count_column + index_y = id // self.count_column + center_x = index_x * self.h_length / 2.0 * 3.0 + x_min + center_y = index_y * self.semi_height * 2.0 + y_min + if index_x % 2 == 1: # for the odd columns + center_y = (index_y * 2.0 + 1) * self.semi_height + y_min + list_points_cell = [] + list_points_cell.append([center_x + self.h_length, center_y]) + list_points_cell.append( + [center_x + self.h_length / 2, center_y + self.semi_height] + ) + list_points_cell.append( + [center_x - self.h_length / 2, center_y + self.semi_height] + ) + list_points_cell.append([center_x - self.h_length, center_y]) + list_points_cell.append( + [center_x - self.h_length / 2, center_y - self.semi_height] + ) + list_points_cell.append( + [center_x + self.h_length / 2, center_y - self.semi_height] + ) + list_points_cell.append([center_x + self.h_length, center_y]) + ax.plot( + np.array(list_points_cell)[:, 0], + np.array(list_points_cell)[:, 1], + lw=line_width_cell, + color=line_color_cell, + ) + + ax.text(center_x, center_y, str(dict_id_count[id]), ha="center", va="center") + return ax
+
+ + + +
+[docs] +class QStatistic: + """ + Quadrat analysis of point pattern. + + Parameters + ---------- + pp : :class:`.PointPattern` or numpy.ndarray + Point Pattern instance, or (n_observations, 2) array + that can be used to construct a Point Pattern instance. + shape : string + Grid structure. Either "rectangle" or "hexagon". + Default is "rectangle". + nx : integer + Number of rectangles in the horizontal + direction. Only when shape is specified as + "rectangle" will nx be considered. + ny : integer + Number of rectangles in the vertical direction. + Only when shape is specified as "rectangle" + will ny be considered. + rectangle_width : float + Rectangle width. Use in pair with + rectangle_height to fully specify a rectangle. + Incompatible with nx & ny. + rectangle_height : float + Rectangle height. Use in pair with + rectangle_width to fully specify a rectangle. + Incompatible with nx & ny. + lh : float + Hexagon length (hexagon). Only when shape is + specified as "hexagon" will lh be considered. + Incompatible with nx & ny. + realizations : :class:`PointProcess` + Point process instance with more than 1 point + pattern realizations which would be used for + simulation based inference. Default is 0 + where no simulation based inference is + performed. + + Attributes + ---------- + pp : :class:`.PointPattern` + Point Pattern instance. + mr : :class:`.RectangleM` or :class:`.HexagonM` + RectangleM or HexagonM instance. + chi2 : float + Chi-squared test statistic for the observed + point pattern pp. + df : integer + Degree of freedom. + chi2_pvalue : float + p-value based on analytical chi-squared + distribution. + chi2_r_pvalue : float + p-value based on simulated sampling + distribution. Only available when + realizations is correctly specified. + chi2_realizations : array + Chi-squared test statistics calculated for + all the simulated csr point patterns. + """ + +
+[docs] + def __init__(self, pp, shape="rectangle", nx=3, ny=3, rectangle_width=0, + rectangle_height=0, lh=10, realizations=0): + if isinstance(pp, np.ndarray): + pp = PointPattern(pp) + self.pp = pp + if shape == "rectangle": + self.mr = RectangleM(pp, count_column=nx, count_row=ny, + rectangle_width=rectangle_width, + rectangle_height = rectangle_height) + elif shape == "hexagon": + self.mr = HexagonM(pp, lh) + else: + raise ValueError( + f'shape type {shape} not understood. Must be either "rectangle" or' + ' "hexagon"' + ) + + # calculate chi2 test statisitc for the observed point pattern + dict_id_count = self.mr.point_location_sta() + self.chi2, self.chi2_pvalue = scipy.stats.chisquare( + list(dict_id_count.values()) + ) + + self.df = self.mr.num - 1 + + # when realizations is specified, perform simulation based + # inference. + if realizations: + reals = realizations.realizations + sim_n = realizations.samples + chi2_realizations = [] # store test statistics for all the + # similations + + for i in range(sim_n): + if shape == "rectangle": + mr_temp = RectangleM(reals[i], count_column=nx, count_row=ny) + elif shape == "hexagon": + mr_temp = HexagonM(reals[i], lh) + id_count_temp = mr_temp.point_location_sta().values() + + # calculate test statistics for simulated point patterns + chi2_sim, p = scipy.stats.chisquare(list(id_count_temp)) + chi2_realizations.append(chi2_sim) + self.chi2_realizations = np.array(chi2_realizations) + + # calculate pseudo pvalue + above_chi2 = self.chi2_realizations >= self.chi2 + larger_chi2 = sum(above_chi2) + self.chi2_r_pvalue = (larger_chi2 + 1.0) / (sim_n + 1.0)
+ + +
+[docs] + def plot(self, title="Quadrat Count"): + """ + Plot quadrats as well as the number of points falling in each quadrat. + + Parameters + ---------- + title: str, optional + Title of the plot. Default is "Quadrat Count". + + """ + + return self.mr.plot(title=title)
+
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/random.html b/_modules/pointpats/random.html new file mode 100644 index 0000000..866c000 --- /dev/null +++ b/_modules/pointpats/random.html @@ -0,0 +1,612 @@ + + + + + + + pointpats.random — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.random

+import numpy
+from .geometry import (
+    spatial,
+    area as _area,
+    centroid as _centroid,
+    contains as _contains,
+    bbox as _bbox,
+    prepare_hull as _prepare_hull,
+    HULL_TYPES,
+)
+
+# ------------------------------------------------------------ #
+# Utilities                                                    #
+# ------------------------------------------------------------ #
+
+
+def parse_size_and_intensity(hull, intensity=None, size=None):
+    """
+    Given a hull, an intensity, and a size int/tuple, correctly
+    compute the resulting missing quantities. Defaults to 100 points in one
+    replication, meaning the intensity will be computed on the fly
+    if nothing is provided.
+
+    Parameters
+    ----------
+    hull : A geometry-like object
+        This encodes the "space" in which to simulate the normal pattern. All points will
+        lie within this hull. Supported values are:
+        - a bounding box encoded in a numpy array as numpy.array([xmin, ymin, xmax, ymax])
+        - an (N,2) array of points for which the bounding box will be computed & used
+        - a shapely polygon/multipolygon
+        - a scipy convexh hull
+    intensity : float
+        the number of observations per unit area in the hull to use. If provided,
+        then the number of observations is determined using the intensity * area(hull) and
+        the size is assumed to represent n_replications (if provided).
+    size : tuple or int
+        a tuple of (n_observations, n_replications), where the first number is the number
+        of points to simulate in each replication and the second number is the number of
+        total replications. So, (10, 4) indicates 10 points, 4 times.
+        If an integer is provided and intensity is None, n_replications is assumed to be 1.
+        If size is an integer and intensity is also provided, then size indicates n_replications,
+        and the number of observations is computed on the fly using intensity and area.
+    """
+    if size is None:
+        if intensity is not None:
+            # if intensity is provided, assume
+            # n_observations
+            n_observations = int(_area(hull) * intensity)
+        else:
+            # default to 100 points
+            n_observations = 100
+            intensity = n_observations / _area(hull)
+        n_simulations = 1
+        size = (n_observations, n_simulations)
+    elif isinstance(size, tuple):
+        if len(size) == 2 and intensity is None:
+            n_observations, n_simulations = size
+            intensity = n_observations / _area(hull)
+        elif len(size) == 2 and intensity is not None:
+            raise ValueError(
+                "Either intensity or size as (n observations, n simulations)"
+                " can be provided. Providing both creates statistical conflicts."
+                " between the requested intensity and implied intensity by"
+                " the number of observations and the area of the hull. If"
+                " you want to specify the intensity, use the intensity argument"
+                " and set size equal to the number of simulations."
+            )
+        else:
+            raise ValueError(
+                f"Intensity and size not understood. Provide size as a tuple"
+                f" containing (number of observations, number of simulations)"
+                f" with no specified intensity, or an intensity and size equal"
+                f" to the number of simulations."
+                f" Recieved: `intensity={intensity}, size={size}`"
+            )
+    elif isinstance(size, int):
+        # assume int size with specified intensity means n_simulations at x intensity
+        if intensity is not None:
+            n_observations = int(intensity * _area(hull))
+            n_simulations = size
+        else:  # assume we have one replication at the specified number of points
+            n_simulations = 1
+            n_observations = size
+            intensity = n_observations / _area(hull)
+    else:
+        raise ValueError(
+            f"Intensity and size not understood. Provide size as a tuple"
+            f" containing (number of observations, number of simulations)"
+            f" with no specified intensity, or an intensity and size equal"
+            f" to the number of simulations."
+            f" Recieved: `intensity={intensity}, size={size}`"
+        )
+    return (n_observations, n_simulations, intensity)
+
+
+# ------------------------------------------------------------ #
+# Distributions                                                #
+# ------------------------------------------------------------ #
+
+
+
+[docs] +def poisson(hull, intensity=None, size=None): + """ + Simulate a poisson random point process with a specified intensity. + + Parameters + ---------- + hull : A geometry-like object + This encodes the "space" in which to simulate the normal pattern. All points will + lie within this hull. Supported values are: + - a bounding box encoded in a numpy array as numpy.array([xmin, ymin, xmax, ymax]) + - an (N,2) array of points for which the bounding box will be computed & used + - a shapely polygon/multipolygon + - a scipy convexh hull + intensity : float + the number of observations per unit area in the hull to use. If provided, then + size must be an integer describing the number of replications to use. + size : tuple or int + a tuple of (n_observations, n_replications), where the first number is the number + of points to simulate in each replication and the second number is the number of + total replications. So, (10, 4) indicates 10 points, 4 times. + If an integer is provided and intensity is None, n_replications is assumed to be 1. + If size is an integer and intensity is also provided, then size indicates n_replications, + and the number of observations is computed from the intensity. + + Returns + -------- + : numpy.ndarray + either an (n_replications, n_observations, 2) or (n_observations,2) array containing + the simulated realizations. + """ + if isinstance(hull, numpy.ndarray): + if hull.shape == (4,): + hull = hull + else: + hull = _prepare_hull(hull) + n_observations, n_simulations, intensity = parse_size_and_intensity( + hull, intensity=intensity, size=size + ) + + result = numpy.empty((n_simulations, n_observations, 2)) + + bbox = _bbox(hull) + + for i_replication in range(n_simulations): + generating = True + i_observation = 0 + while i_observation < n_observations: + x, y = ( + numpy.random.uniform(bbox[0], bbox[2]), + numpy.random.uniform(bbox[1], bbox[3]), + ) + if _contains(hull, x, y): + result[i_replication, i_observation] = (x, y) + i_observation += 1 + return result.squeeze()
+ + + +
+[docs] +def normal(hull, center=None, cov=None, size=None): + """ + Simulate a multivariate random normal point cluster + + Parameters + ---------- + hull : A geometry-like object + This encodes the "space" in which to simulate the normal pattern. All points will + lie within this hull. Supported values are: + - a bounding box encoded in a numpy array as numpy.array([xmin, ymin, xmax, ymax]) + - an (N,2) array of points for which the bounding box will be computed & used + - a shapely polygon/multipolygon + - a scipy convexh hull + center : iterable of shape (2, ) + A point where the simulations will be centered. + cov : float or a numpy array of shape (2,2) + either the standard deviation of an independent and identically distributed + normal distribution, or a 2 by 2 covariance matrix expressing the covariance + of the x and y for the distribution. Default is half of the width or height + of the hull's bounding box, whichever is larger. + size : tuple or int + a tuple of (n_observations, n_replications), where the first number is the number + of points to simulate in each replication and the second number is the number of + total replications. So, (10, 4) indicates 10 points, 4 times. + If an integer is provided, n_replications is assumed to be 1. + + Returns + -------- + : numpy.ndarray + either an (n_replications, n_observations, 2) or (n_observations,2) array containing + the simulated realizations. + """ + if isinstance(hull, numpy.ndarray): + if hull.shape == (4,): + hull = hull + else: + hull = _prepare_hull(hull) + if center is None: + center = _centroid(hull) + n_observations, n_simulations, intensity = parse_size_and_intensity( + hull, intensity=None, size=size + ) + if cov is None: + bbox = _bbox(hull) + width = bbox[2] - bbox[0] + height = bbox[3] - bbox[1] + cov = numpy.maximum(width / 2, height / 2) ** 2 + + if isinstance(cov, (int, float)): + sd = cov + cov = numpy.eye(2) * sd + elif isinstance(cov, numpy.ndarray): + if cov.ndim == 2: + assert cov.shape == (2, 2), "Bivariate covariance matrices must be 2 by 2" + elif cov.ndim == 3: + assert cov.shape[1:] == ( + 2, + 2, + ), "3-dimensional covariance matrices must have shape (n_simulations, 2,2)" + assert ( + cov.shape[0] == n_simulations + ), "3-dimensional covariance matrices must have shape (n_simulations, 2,2)" + else: + raise ValueError( + "`cov` argument must be a float (signifying a standard deviation)" + " or a 2 by 2 array expressing the covariance matrix of the " + " bivariate normal distribution." + ) + + result = numpy.empty((n_simulations, n_observations, 2)) + + bbox = _bbox(hull) + + for i_replication in range(n_simulations): + generating = True + i_observation = 0 + replication_cov = cov[i] if cov.ndim == 3 else cov + replication_sd = numpy.diagonal(replication_cov) ** 0.5 + replication_cor = (1 / replication_sd) * replication_cov * (1 / replication_sd) + + while i_observation < n_observations: + candidate = numpy.random.multivariate_normal((0, 0), replication_cor) + x, y = center + candidate * replication_sd + if _contains(hull, x, y): + result[i_replication, i_observation] = (x, y) + i_observation += 1 + return result.squeeze()
+ + + +
+[docs] +def cluster_poisson( + hull, intensity=None, size=None, n_seeds=2, cluster_radius=None, +): + """ + Simulate a cluster poisson random point process with a specified intensity & number of seeds. + A cluster poisson process is a poisson process where the center of each "cluster" is + itself distributed according to a spatial poisson process. + + Parameters + ---------- + hull : A geometry-like object + This encodes the "space" in which to simulate the normal pattern. All points will + lie within this hull. Supported values are: + - a bounding box encoded in a numpy array as numpy.array([xmin, ymin, xmax, ymax]) + - an (N,2) array of points for which the bounding box will be computed & used + - a shapely polygon/multipolygon + - a scipy convexh hull + intensity : float + the number of observations per unit area in the hull to use. If provided, then + size must be an integer describing the number of replications to use. + size : tuple or int + a tuple of (n_observations, n_replications), where the first number is the number + of points to simulate in each replication and the second number is the number of + total replications. So, (10, 4) indicates 10 points, 4 times. + If an integer is provided and intensity is None, n_replications is assumed to be 1. + If size is an integer and intensity is also provided, then size indicates n_replications, + and the number of observations is computed from the intensity. + n_seeds : int + the number of sub-clusters to use. + cluster_radius : float or iterable + the radius of each cluster. If a float, the same radius is used for all clusters. + If an array, then there must be the same number of radii as clusters. + If None, 50% of the minimum inter-point distance is used, which may fluctuate across + replications. + + Returns + -------- + : numpy.ndarray + either an (n_replications, n_observations, 2) or (n_observations,2) array containing + the simulated realizations. + """ + if isinstance(hull, numpy.ndarray): + if hull.shape == (4,): + hull = hull + else: + hull = _prepare_hull(hull) + + if isinstance(cluster_radius, numpy.ndarray): + cluster_radii = cluster_radius.flatten() + assert len(cluster_radii) == n_seeds, ( + f"number of radii provided ({len(cluster_radii)})" + f"does not match number of clusters requested" + f" ({n_seeds})." + ) + elif isinstance(cluster_radius, (int, float)): + cluster_radii = [cluster_radius] * n_seeds + + n_observations, n_simulations, intensity = parse_size_and_intensity( + hull, intensity=intensity, size=size + ) + + result = numpy.empty((n_simulations, n_observations, 2)) + hull_area = _area(hull) + for i_replication in range(n_simulations): + seeds = poisson(hull, size=(n_seeds, n_simulations)) + if cluster_radius is None: + # default cluster radius is one half the minimum distance between seeds + cluster_radii = [spatial.distance.pdist(seeds).min() * 0.5] * n_seeds + clusters = numpy.array_split(result[i_replication], n_seeds) + for i_cluster, radius in enumerate(cluster_radii): + seed = seeds[i_cluster] + cluster_points = clusters[i_cluster] + n_in_cluster = len(cluster_points) + if n_in_cluster == 1: + clusters[i_cluster] = seed + continue + if n_in_cluster < 1: + raise Exception( + "There are too many clusters requested for the " + " inputted number of samples. Reduce `n_seeds` or" + " increase the number of sampled points." + ) + candidates = _uniform_circle( + n_in_cluster - 1, radius=radius, center=seed, hull=hull + ) + clusters[i_cluster] = numpy.row_stack((seed, candidates)) + result[i_replication] = numpy.row_stack(clusters) + return result.squeeze()
+ + + +
+[docs] +def cluster_normal(hull, cov=None, size=None, n_seeds=2): + """ + Simulate a cluster poisson random point process with a specified intensity & number of seeds. + A cluster poisson process is a poisson process where the center of each "cluster" is + itself distributed according to a spatial poisson process. + + Parameters + ---------- + hull : A geometry-like object + This encodes the "space" in which to simulate the normal pattern. All points will + lie within this hull. Supported values are: + - a bounding box encoded in a numpy array as numpy.array([xmin, ymin, xmax, ymax]) + - an (N,2) array of points for which the bounding box will be computed & used + - a shapely polygon/multipolygon + - a scipy convexh hull + cov : float, int, or numpy.ndarray of shape (2,2) + The covariance structure for clusters. By default, this is the squared + average distance between cluster seeds. + size : tuple or int + a tuple of (n_observations, n_replications), where the first number is the number + of points to simulate in each replication and the second number is the number of + total replications. So, (10, 4) indicates 10 points, 4 times. + If an integer is provided and intensity is None, n_replications is assumed to be 1. + If size is an integer and intensity is also provided, then size indicates n_replications, + and the number of observations is computed from the intensity. + n_seeds : int + the number of sub-clusters to use. + + Returns + -------- + : numpy.ndarray + either an (n_replications, n_observations, 2) or (n_observations,2) array containing + the simulated realizations. + """ + if isinstance(hull, numpy.ndarray): + if hull.shape == (4,): + hull = hull + else: + hull = _prepare_hull(hull) + n_observations, n_simulations, intensity = parse_size_and_intensity( + hull, intensity=None, size=size + ) + result = numpy.empty((n_simulations, n_observations, 2)) + for i_replication in range(n_simulations): + seeds = poisson(hull, size=(n_seeds, n_simulations)) + if cov is None: + cov = spatial.distance.pdist(seeds).mean() ** 2 + clusters = numpy.array_split(result[i_replication], n_seeds) + for i_cluster, seed in enumerate(seeds): + cluster_points = clusters[i_cluster] + n_in_cluster = len(cluster_points) + if n_in_cluster == 1: + clusters[i_cluster] = seed + continue + if n_in_cluster < 1: + raise Exception( + "There are too many clusters requested for the " + " inputted number of samples. Reduce `n_seeds` or" + " increase the number of sampled points." + ) + candidates = normal(hull, center=seed, cov=cov, size=n_in_cluster - 1) + clusters[i_cluster] = numpy.row_stack((seed, candidates)) + result[i_replication] = numpy.row_stack(clusters) + return result.squeeze()
+ + + +def _uniform_circle(n, radius=1.0, center=(0.0, 0.0), burn=2, verbose=False, hull=None): + """ + Generate n points within a circle of given radius. + + Parameters + ---------- + n : int + Number of points. + radius : float + Radius of the circle. + center : tuple + Coordinates of the center. + burn : int + number of coordinates to simulate at a time. This is the "chunk" + size sent to numpy.random.uniform each iteration of the rejection sampler + + Returns + ------- + : array + (n, 2), coordinates of generated points + + """ + + good = numpy.zeros((n, 2), float) + c = 0 + center_x, center_y = center + r = radius + r2 = r * r + it = 0 + while c < n: + x = numpy.random.uniform(-r, r, (burn * n, 1)) + y = numpy.random.uniform(-r, r, (burn * n, 1)) + if hull is None: + in_hull = True + else: + in_hull = numpy.asarray( + [ + _contains(hull, xi + center_x, yi + center_y) + for xi, yi in numpy.column_stack((x, y)) + ] + ).reshape(-1, 1) + ids, *_ = numpy.where(((x * x + y * y) <= r2) & in_hull) + candidates = numpy.hstack((x, y))[ids] + nc = candidates.shape[0] + need = n - c + if nc > need: # more than we need + good[c:] = candidates[:need] + else: # use them all and keep going + good[c : c + nc] = candidates + c += nc + it += 1 + if verbose: + print("Iterations: {}".format(it)) + return good + numpy.asarray(center) +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/spacetime.html b/_modules/pointpats/spacetime.html new file mode 100644 index 0000000..bb8ae87 --- /dev/null +++ b/_modules/pointpats/spacetime.html @@ -0,0 +1,1805 @@ + + + + + + + pointpats.spacetime — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.spacetime

+"""
+Methods for identifying space-time interaction in spatio-temporal event
+data.
+"""
+
+__author__ = (
+    "Eli Knaap <eknaap@sdsu.edu>",
+    "Nicholas Malizia <nmalizia@asu.edu>",
+    "Sergio J. Rey <srey@sdsu.edu>",
+    "Philip Stephens <philip.stephens@asu.edu",
+)
+
+__all__ = [
+    "SpaceTimeEvents",
+    "knox",
+    "mantel",
+    "jacquez",
+    "modified_knox",
+    "Knox",
+    "KnoxLocal",
+]
+
+import os
+from datetime import date
+from warnings import warn
+
+import geopandas as gpd
+import libpysal as lps
+import numpy as np
+import pandas
+import pandas as pd
+import scipy.stats as stats
+from libpysal import cg
+from libpysal.graph import Graph
+from pandas.api.types import is_numeric_dtype
+from scipy.spatial import KDTree
+from scipy.stats import hypergeom, poisson
+from shapely.geometry import LineString
+
+
+
+[docs] +class SpaceTimeEvents: + """ + Method for reformatting event data stored in a shapefile for use in + calculating metrics of spatio-temporal interaction. + + Parameters + ---------- + path : string + the path to the appropriate shapefile, including the + file name and extension + time : string + column header in the DBF file indicating the column + containing the time stamp. + infer_timestamp : bool, optional + if the column containing the timestamp is formatted as + calendar dates, try to coerce them into Python datetime + objects (the default is False). + + Attributes + ---------- + n : int + number of events. + x : array + (n, 1), array of the x coordinates for the events. + y : array + (n, 1), array of the y coordinates for the events. + t : array + (n, 1), array of the temporal coordinates for the events. + space : array + (n, 2), array of the spatial coordinates (x,y) for the + events. + time : array + (n, 2), array of the temporal coordinates (t,1) for the + events, the second column is a vector of ones. + + Examples + -------- + Read in the example shapefile data, ensuring to omit the file + extension. In order to successfully create the event data the .dbf file + associated with the shapefile should have a column of values that are a + timestamp for the events. This timestamp may be a numerical value + or a date. Date inference was added in version 1.6. + + >>> import libpysal as lps + >>> path = lps.examples.get_path("burkitt.shp") + >>> from pointpats import SpaceTimeEvents + + Create an instance of SpaceTimeEvents from a shapefile, where the + temporal information is stored in a column named "T". + + >>> events = SpaceTimeEvents(path,'T') + + See how many events are in the instance. + + >>> events.n + 188 + + Check the spatial coordinates of the first event. + + >>> events.space[0] + array([300., 302.]) + + Check the time of the first event. + + >>> events.t[0] + array([413.]) + + Calculate the time difference between the first two events. + + >>> events.t[1] - events.t[0] + array([59.]) + + New, in 1.6, date support: + Now, create an instance of SpaceTimeEvents from a shapefile, where the + temporal information is stored in a column named "DATE". + + >>> events = SpaceTimeEvents(path,'DATE') + + See how many events are in the instance. + + >>> events.n + 188 + + Check the spatial coordinates of the first event. + + >>> events.space[0] + array([300., 302.]) + + Check the time of the first event. Note that this value is equivalent to + 413 days after January 1, 1900. + + >>> events.t[0][0] + datetime.date(1901, 2, 16) + + Calculate the time difference between the first two events. + + >>> (events.t[1][0] - events.t[0][0]).days + 59 + """ + +
+[docs] + def __init__(self, path, time_col, infer_timestamp=False): + shp = lps.io.open(path) + head, tail = os.path.split(path) + dbf_tail = tail.split(".")[0] + ".dbf" + dbf = lps.io.open(lps.examples.get_path(dbf_tail)) + + # extract the spatial coordinates from the shapefile + x = [coords[0] for coords in shp] + y = [coords[1] for coords in shp] + + self.n = n = len(shp) + x = np.array(x) + y = np.array(y) + self.x = np.reshape(x, (n, 1)) + self.y = np.reshape(y, (n, 1)) + self.space = np.hstack((self.x, self.y)) + + # extract the temporal information from the database + if infer_timestamp: + col = dbf.by_col(time_col) + if isinstance(col[0], date): + day1 = min(col) + col = [(d - day1).days for d in col] + t = np.array(col) + else: + print( + "Unable to parse your time column as Python datetime \ + objects, proceeding as integers." + ) + t = np.array(col) + else: + t = np.array(dbf.by_col(time_col)) + line = np.ones((n, 1)) + self.t = np.reshape(t, (n, 1)) + self.time = np.hstack((self.t, line)) + + # close open objects + dbf.close() + shp.close()
+
+ + + +def knox(s_coords, t_coords, delta, tau, permutations=99, debug=False): + """ + Knox test for spatio-temporal interaction. :cite:`Knox:1964` + + Parameters + ---------- + s_coords : array + (n, 2), spatial coordinates. + t_coords : array + (n, 1), temporal coordinates. + delta : float + threshold for proximity in space. + tau : float + threshold for proximity in time. + permutations : int, optional + the number of permutations used to establish pseudo- + significance (the default is 99). + debug : bool, optional + if true, debugging information is printed (the default is + False). + + Returns + ------- + knox_result : dictionary + contains the statistic (stat) for the test and the + associated p-value (pvalue). + stat : float + value of the knox test for the dataset. + pvalue : float + pseudo p-value associated with the statistic. + counts : int + count of space time neighbors. + + Examples + -------- + >>> import numpy as np + >>> import libpysal as lps + >>> from pointpats import SpaceTimeEvents, knox + + Read in the example data and create an instance of SpaceTimeEvents. + + >>> path = lps.examples.get_path("burkitt.shp") + >>> events = SpaceTimeEvents(path,'T') + + Set the random seed generator. This is used by the permutation based + inference to replicate the pseudo-significance of our example results - + the end-user will normally omit this step. + + >>> np.random.seed(100) + + Run the Knox test with distance and time thresholds of 20 and 5, + respectively. This counts the events that are closer than 20 units in + space, and 5 units in time. + + >>> result = knox(events.space, events.t, delta=20, tau=5, permutations=99) + + Next, we examine the results. First, we call the statistic from the + results dictionary. This reports that there are 13 events close + in both space and time, according to our threshold definitions. + + >>> result['stat'] == 13 + True + + Next, we look at the pseudo-significance of this value, calculated by + permuting the timestamps and rerunning the statistics. In this case, + the results indicate there is likely no space-time interaction between + the events. + + >>> print("%2.2f"%result['pvalue']) + 0.17 + """ + warn("This function is deprecated. Use Knox", DeprecationWarning, stacklevel=2) + + # Do a kdtree on space first as the number of ties (identical points) is + # likely to be lower for space than time. + + kd_s = cg.KDTree(s_coords) + neigh_s = kd_s.query_pairs(delta) + tau2 = tau * tau + ids = np.array(list(neigh_s)) + + # For the neighboring pairs in space, determine which are also time + # neighbors + + d_t = (t_coords[ids[:, 0]] - t_coords[ids[:, 1]]) ** 2 + n_st = sum(d_t <= tau2) + + knox_result = {"stat": n_st[0]} + + if permutations: + joint = np.zeros((permutations, 1), int) + for p in range(permutations): + np.random.shuffle(t_coords) + d_t = (t_coords[ids[:, 0]] - t_coords[ids[:, 1]]) ** 2 + joint[p] = np.sum(d_t <= tau2) + + larger = sum(joint >= n_st[0]) + if (permutations - larger) < larger: + larger = permutations - larger + p_sim = (larger + 1.0) / (permutations + 1.0) + knox_result["pvalue"] = p_sim + return knox_result + + +
+[docs] +def mantel( + s_coords, t_coords, permutations=99, scon=1.0, spow=-1.0, tcon=1.0, tpow=-1.0 +): + """ + Standardized Mantel test for spatio-temporal interaction. :cite:`Mantel:1967` + + Parameters + ---------- + s_coords : array + (n, 2), spatial coordinates. + t_coords : array + (n, 1), temporal coordinates. + permutations : int, optional + the number of permutations used to establish pseudo- + significance (the default is 99). + scon : float, optional + constant added to spatial distances (the default is 1.0). + spow : float, optional + value for power transformation for spatial distances + (the default is -1.0). + tcon : float, optional + constant added to temporal distances (the default is 1.0). + tpow : float, optional + value for power transformation for temporal distances + (the default is -1.0). + + Returns + ------- + mantel_result : dictionary + contains the statistic (stat) for the test and the + associated p-value (pvalue). + stat : float + value of the knox test for the dataset. + pvalue : float + pseudo p-value associated with the statistic. + + Examples + -------- + >>> import numpy as np + >>> import libpysal as lps + >>> from pointpats import SpaceTimeEvents, mantel + + Read in the example data and create an instance of SpaceTimeEvents. + + >>> path = lps.examples.get_path("burkitt.shp") + >>> events = SpaceTimeEvents(path,'T') + + Set the random seed generator. This is used by the permutation based + inference to replicate the pseudo-significance of our example results - + the end-user will normally omit this step. + + >>> np.random.seed(100) + + The standardized Mantel test is a measure of matrix correlation between + the spatial and temporal distance matrices of the event dataset. The + following example runs the standardized Mantel test without a constant + or transformation; however, as recommended by :cite:`Mantel:1967`, these + should be added by the user. This can be done by adjusting the constant + and power parameters. + + >>> result = mantel(events.space, events.t, 99, scon=1.0, spow=-1.0, tcon=1.0, tpow=-1.0) + + Next, we examine the result of the test. + + >>> print("%6.6f"%result['stat']) + 0.048368 + + Finally, we look at the pseudo-significance of this value, calculated by + permuting the timestamps and rerunning the statistic for each of the 99 + permutations. According to these parameters, the results indicate + space-time interaction between the events. + + >>> print("%2.2f"%result['pvalue']) + 0.01 + + """ + + t = t_coords + s = s_coords + n = len(t) + + # calculate the spatial and temporal distance matrices for the events + distmat = cg.distance_matrix(s) + timemat = cg.distance_matrix(t) + + # calculate the transformed standardized statistic + timevec = (timemat[np.tril_indices(timemat.shape[0], k=-1)] + tcon) ** tpow + distvec = (distmat[np.tril_indices(distmat.shape[0], k=-1)] + scon) ** spow + stat = stats.pearsonr(timevec, distvec)[0].sum() + + # return the results (if no inference) + if not permutations: + return stat + + # loop for generating a random distribution to assess significance + dist = [] + for _i in range(permutations): + trand = _shuffle_matrix(timemat, np.arange(n)) + timevec = (trand[np.tril_indices(trand.shape[0], k=-1)] + tcon) ** tpow + m = stats.pearsonr(timevec, distvec)[0].sum() + dist.append(m) + + # establish the pseudo significance of the observed statistic + distribution = np.array(dist) + greater = np.ma.masked_greater_equal(distribution, stat) + count = np.ma.count_masked(greater) + pvalue = (count + 1.0) / (permutations + 1.0) + + # report the results + mantel_result = {"stat": stat, "pvalue": pvalue} + return mantel_result
+ + + +
+[docs] +def jacquez(s_coords, t_coords, k, permutations=99): + """ + Jacquez k nearest neighbors test for spatio-temporal interaction. + :cite:`Jacquez:1996` + + Parameters + ---------- + s_coords : array + (n, 2), spatial coordinates. + t_coords : array + (n, 1), temporal coordinates. + k : int + the number of nearest neighbors to be searched. + permutations : int, optional + the number of permutations used to establish pseudo- + significance (the default is 99). + + Returns + ------- + jacquez_result : dictionary + contains the statistic (stat) for the test and the + associated p-value (pvalue). + stat : float + value of the Jacquez k nearest neighbors test for the + dataset. + pvalue : float + p-value associated with the statistic (normally + distributed with k-1 df). + + Examples + -------- + >>> import numpy as np + >>> import libpysal as lps + >>> from pointpats import SpaceTimeEvents, jacquez + + Read in the example data and create an instance of SpaceTimeEvents. + + >>> path = lps.examples.get_path("burkitt.shp") + >>> events = SpaceTimeEvents(path,'T') + + The Jacquez test counts the number of events that are k nearest + neighbors in both time and space. The following runs the Jacquez test + on the example data and reports the resulting statistic. In this case, + there are 12 instances where events are nearest neighbors in both space + and time. + # turning off as kdtree changes from scipy < 0.12 return 13 + + >>> np.random.seed(100) + >>> result = jacquez(events.space, events.t ,k=3,permutations=99) + >>> print(result['stat']) + 12 + + The significance of this can be assessed by calling the p- + value from the results dictionary, as shown below. Again, no + space-time interaction is observed. + + >>> result['pvalue'] < 0.01 + False + + """ + time = t_coords + space = s_coords + n = len(time) + + # calculate the nearest neighbors in space and time separately + knnt = lps.weights.KNN.from_array(time, k) + knns = lps.weights.KNN.from_array(space, k) + + nnt = knnt.neighbors + nns = knns.neighbors + knn_sum = 0 + + # determine which events are nearest neighbors in both space and time + for i in range(n): + t_neighbors = nnt[i] + s_neighbors = nns[i] + check = set(t_neighbors) + inter = check.intersection(s_neighbors) + count = len(inter) + knn_sum += count + + stat = knn_sum + + # return the results (if no inference) + if not permutations: + return stat + + # loop for generating a random distribution to assess significance + dist = [] + for _p in range(permutations): + j = 0 + trand = np.random.permutation(time) + knnt = lps.weights.KNN.from_array(trand, k) + nnt = knnt.neighbors + for i in range(n): + t_neighbors = nnt[i] + s_neighbors = nns[i] + check = set(t_neighbors) + inter = check.intersection(s_neighbors) + count = len(inter) + j += count + + dist.append(j) + + # establish the pseudo significance of the observed statistic + distribution = np.array(dist) + greater = np.ma.masked_greater_equal(distribution, stat) + count = np.ma.count_masked(greater) + pvalue = (count + 1.0) / (permutations + 1.0) + + # report the results + jacquez_result = {"stat": stat, "pvalue": pvalue} + return jacquez_result
+ + + +
+[docs] +def modified_knox(s_coords, t_coords, delta, tau, permutations=99): + """ + Baker's modified Knox test for spatio-temporal interaction. + :cite:`Baker:2004` + + Parameters + ---------- + s_coords : array + (n, 2), spatial coordinates. + t_coords : array + (n, 1), temporal coordinates. + delta : float + threshold for proximity in space. + tau : float + threshold for proximity in time. + permutations : int, optional + the number of permutations used to establish pseudo- + significance (the default is 99). + + Returns + ------- + modknox_result : dictionary + contains the statistic (stat) for the test and the + associated p-value (pvalue). + stat : float + value of the modified knox test for the dataset. + pvalue : float + pseudo p-value associated with the statistic. + + Examples + -------- + >>> import numpy as np + >>> import libpysal as lps + >>> from pointpats import SpaceTimeEvents, modified_knox + + Read in the example data and create an instance of SpaceTimeEvents. + + >>> path = lps.examples.get_path("burkitt.shp") + >>> events = SpaceTimeEvents(path, 'T') + + Set the random seed generator. This is used by the permutation based + inference to replicate the pseudo-significance of our example results - + the end-user will normally omit this step. + + >>> np.random.seed(100) + + Run the modified Knox test with distance and time thresholds of 20 and 5, + respectively. This counts the events that are closer than 20 units in + space, and 5 units in time. + + >>> result = modified_knox(events.space, events.t, delta=20, tau=5, permutations=99) + + Next, we examine the results. First, we call the statistic from the + results dictionary. This reports the difference between the observed + and expected Knox statistic. + + >>> print("%2.8f" % result['stat']) + 2.81016043 + + Next, we look at the pseudo-significance of this value, calculated by + permuting the timestamps and rerunning the statistics. In this case, + the results indicate there is likely no space-time interaction. + + >>> print("%2.2f" % result['pvalue']) + 0.11 + + """ + s = s_coords + t = t_coords + n = len(t) + + # calculate the spatial and temporal distance matrices for the events + sdistmat = cg.distance_matrix(s) + tdistmat = cg.distance_matrix(t) + + # identify events within thresholds + spacmat = np.ones((n, n)) + spacbin = sdistmat <= delta + spacmat = spacmat * spacbin + timemat = np.ones((n, n)) + timebin = tdistmat <= tau + timemat = timemat * timebin + + # calculate the observed (original) statistic + knoxmat = timemat * spacmat + obsstat = knoxmat.sum() - n + + # calculate the expectated value + ssumvec = np.reshape((spacbin.sum(axis=0) - 1), (n, 1)) + tsumvec = np.reshape((timebin.sum(axis=0) - 1), (n, 1)) + expstat = (ssumvec * tsumvec).sum() + + # calculate the modified stat + stat = (obsstat - (expstat / (n - 1.0))) / 2.0 + + # return results (if no inference) + if not permutations: + return stat + distribution = [] + + # loop for generating a random distribution to assess significance + for _p in range(permutations): + rtdistmat = _shuffle_matrix(tdistmat, list(range(n))) + timemat = np.ones((n, n)) + timebin = rtdistmat <= tau + timemat = timemat * timebin + + # calculate the observed knox again + knoxmat = timemat * spacmat + obsstat = knoxmat.sum() - n + + # calculate the expectated value again + ssumvec = np.reshape((spacbin.sum(axis=0) - 1), (n, 1)) + tsumvec = np.reshape((timebin.sum(axis=0) - 1), (n, 1)) + expstat = (ssumvec * tsumvec).sum() + + # calculate the modified stat + tempstat = (obsstat - (expstat / (n - 1.0))) / 2.0 + distribution.append(tempstat) + + # establish the pseudo significance of the observed statistic + distribution = np.array(distribution) + greater = np.ma.masked_greater_equal(distribution, stat) + count = np.ma.count_masked(greater) + pvalue = (count + 1.0) / (permutations + 1.0) + + # return results + modknox_result = {"stat": stat, "pvalue": pvalue} + return modknox_result
+ + + +def _shuffle_matrix(X, ids): + """ + Random permutation of rows and columns of a matrix + + Parameters + ---------- + X : array + (k, k), array to be permuted. + ids : array + range (k, ). + + Returns + ------- + : array + (k, k) with rows and columns randomly shuffled. + """ + np.random.shuffle(ids) + return X[ids, :][:, ids] + + +def _knox(s_coords, t_coords, delta, tau, permutations=99, keep=False): + """ + Parameters + ========== + + s_coords: array-like + spatial coordinates + t_coords: array-like + temporal coordinates + delta: float + distance threshold + tau: float + temporal threshold + permutations: int + number of permutations + keep: bool + return values from permutations (default False) + + + Returns + ======= + + summary table observed + summary table h0 + + ns + nt + nst + n + p-value + """ + + n = s_coords.shape[0] + + stree = KDTree(s_coords) + ttree = KDTree(t_coords) + sneighbors = stree.query_ball_tree(stree, r=delta) + sneighbors = [ + set(neighbors).difference([i]) for i, neighbors in enumerate(sneighbors) + ] + tneighbors = ttree.query_ball_tree(ttree, r=tau) + tneighbors = [ + set(neighbors).difference([i]) for i, neighbors in enumerate(tneighbors) + ] + + # number of spatial neighbor pairs + ns = np.array([len(neighbors) for neighbors in sneighbors]) # by i + + NS = ns.sum() / 2 # total + + # number of temporal neigbor pairs + nt = np.array([len(neighbors) for neighbors in tneighbors]) + NT = nt.sum() / 2 + + # s-t neighbors (list of lists) + stneighbors = [ + sneighbors_i.intersection(tneighbors_i) + for sneighbors_i, tneighbors_i in zip(sneighbors, tneighbors) + ] + + # number of spatio-temporal neigbor pairs + nst = np.array([len(neighbors) for neighbors in stneighbors]) + NST = nst.sum() / 2 + + all_pairs = [] + pairs = {} + for i, neigh in enumerate(stneighbors): + if len(neigh) > 0: + all_pairs.extend([sorted((i, j)) for j in neigh]) + st_pairs = {tuple(l) for l in all_pairs} + + # ENST: expected number of spatio-temporal neighbors under HO + pairs = n * (n - 1) / 2 + ENST = NS * NT / pairs + + # observed table + observed = np.zeros((2, 2)) + + NS_ = NS - NST # spatial only + NT_ = NT - NST # temporal only + + observed[0, 0] = NST + observed[0, 1] = NS_ + observed[1, 0] = NT_ + observed[1, 1] = pairs - NST - NS_ - NT_ + + # expected table + + expected = np.zeros((2, 2)) + expected[0, 0] = ENST + expected[0, 1] = NS - expected[0, 0] + expected[1, 0] = NT - expected[0, 0] + expected[1, 1] = pairs - expected.sum() + + p_value_poisson = 1 - poisson.cdf(NST, expected[0, 0]) + + results = {} + results["ns"] = ns.sum() / 2 + results["nt"] = nt.sum() / 2 + results["nst"] = nst.sum() / 2 + results["pairs"] = pairs + results["expected"] = expected + results["observed"] = observed + results["p_value_poisson"] = p_value_poisson + results["st_pairs"] = st_pairs + results["sneighbors"] = sneighbors + results["tneighbors"] = tneighbors + results["stneighbors"] = stneighbors + + if permutations > 0: + exceedence = 0 + n = len(sneighbors) + ids = np.arange(n) + if keep: + ST = np.zeros(permutations) + + for perm in range(permutations): + st = 0 + rids = np.random.permutation(ids) + for i in range(n): + ri = rids[i] + tni = tneighbors[ri] + rjs = [rids[j] for j in sneighbors[i]] + sti = [j for j in rjs if j in tni] + st += len(sti) + st /= 2 + if st >= results["nst"]: + exceedence += 1 + if keep: + ST[perm] = st + results["p_value_sim"] = (exceedence + 1) / (permutations + 1) + results["exceedence"] = exceedence + if keep: + results["st_perm"] = ST + + return results + + +
+[docs] +class Knox: + """Global Knox statistic for space-time interactions + + Parameters + ---------- + s_coords: array-like + spatial coordinates of point events + t_coords: array-like + temporal coordinates of point events (floats or ints, not dateTime) + delta: float + spatial threshold defining distance below which pairs are spatial + neighbors + tau: float + temporal threshold defining distance below which pairs are temporal + neighbors + permutations: int + number of random permutations for inference + keep: bool + whether to store realized values of the statistic under permutations + + + Attributes + ---------- + s_coords: array-like + spatial coordinates of point events + t_coords: array-like + temporal coordinates of point events (floats or ints, not dateTime) + delta: float + spatial threshold defining distance below which pairs are spatial + neighbors + tau: float + temporal threshold defining distance below which pairs are temporal + neighbors + permutations: int + number of random permutations for inference + keep: bool + whether to store realized values of the statistic under permutations + nst: int + number of space-time pairs + p_poisson: float + Analytical p-value under Poisson assumption + p_sim: float + Pseudo p-value based on random permutations + expected: array + Two-by-two array with expected counts under the null of no space-time + interactions. [[NST, NS_], [NT_, N__]] where NST is the expected number + of space-time pairs, NS_ is the expected number of spatial (but not also + temporal) pairs, NT_ is the number of expected temporal (but not also + spatial pairs), N__ is the number of pairs that are neighor spatial or + temporal neighbors. + observed: array + Same structure as expected with the observed pair classifications + sim: array + Global statistics from permutations (if keep=True) + + Notes + ----- + Technical details can be found in :cite:`Rogerson:2001` + + Examples + -------- + >>> import libpysal + >>> path = libpysal.examples.get_path('burkitt.shp') + >>> import geopandas + >>> df = geopandas.read_file(path) + >>> from pointpats.spacetime import Knox + >>> global_knox = Knox(df[['X', 'Y']], df[["T"]], delta=20, tau=5) + >>> global_knox.statistic_ + 13 + >>> global_knox.p_poisson + 0.14624558197140414 + >>> global_knox.observed + array([[1.300e+01, 3.416e+03], + [3.900e+01, 1.411e+04]]) + >>> global_knox.expected + array([[1.01438161e+01, 3.41885618e+03], + [4.18561839e+01, 1.41071438e+04]]) + >>> hasattr(global_knox, 'sim') + False + >>> import numpy + >>> numpy.random.seed(12345) + >>> global_knox = Knox(df[['X', 'Y']], df[["T"]], delta=20, tau=5, keep=True) + >>> hasattr(global_knox, 'sim') + True + >>> global_knox.p_sim + 0.21 + """ + +
+[docs] + def __init__(self, s_coords, t_coords, delta, tau, permutations=99, keep=False): + self.s_coords = s_coords + self.t_coords = t_coords + self.delta = delta + self.tau = tau + self.permutations = permutations + self.keep = keep + results = _knox(s_coords, t_coords, delta, tau, permutations, keep) + self.nst = int(results["nst"]) + if permutations > 0: + self.p_sim = results["p_value_sim"] + if keep: + self.sim = results["st_perm"] + + self.p_poisson = results["p_value_poisson"] + self.observed = results["observed"] + self.expected = results["expected"] + self.statistic_ = self.nst
+ + +
+[docs] + @classmethod + def from_dataframe( + cls, + dataframe, + time_col: int, + delta: int, + tau: int, + permutations: int = 99, + keep: bool = False, + ): + """Compute a Knox statistic from a dataframe of Point observations + + Parameters + ---------- + dataframe : geopandas.GeoDataFrame + geodataframe holding observations. Should be in a projected coordinate + system with geometries stored as Point + time_col : str + column in the dataframe storing the time values (integer coordinate) + for each observation. For example if the observations are stored with + a timestamp, the time_col should be converted to a series of integers + representing, e.g. hours, days, seconds, etc. + delta : int + delta parameter defining the spatial neighbor threshold measured in the + same units as the dataframe CRS + tau : int + tau parameter defining the temporal neihgbor threshold (in the units + measured by `time_col`) + permutations : int, optional + permutations to use for computation inference, by default 99 + keep : bool + whether to store realized values of the statistic under permutations + + Returns + ------- + pointpats.spacetime.Knox + a fitted Knox class + + """ + s_coords, t_coords = _spacetime_points_to_arrays(dataframe, time_col) + + return cls(s_coords, dataframe[[time_col]], delta, tau, permutations, keep)
+
+ + + +def _knox_local(s_coords, t_coords, delta, tau, permutations=99, keep=False): + """ + + Parameters + ---------- + s_coords: array (n,2) + spatial coordinates + t_coords: array (n,1) + temporal coordinates + delta: numeric + spatial threshold distance for neighbor relation + tau: numeric + temporal threshold distance for neighbor relation + permutations: int + number of permutations for conditional randomization inference + keep: bool + whether to store local statistics from the permtuations + + """ + # think about passing in the global object as an option to avoid recomputing the trees + res = _knox(s_coords, t_coords, delta, tau, permutations=permutations) + sneighbors = {i: tuple(ns) for i, ns in enumerate(res["sneighbors"])} + tneighbors = {i: tuple(nt) for i, nt in enumerate(res["tneighbors"])} + + n = len(s_coords) + ids = np.arange(n) + res["nsti"] = np.zeros(n) # number of observed st_pairs for observation i + res["nsi"] = [len(r) for r in res["sneighbors"]] + res["nti"] = [len(r) for r in res["tneighbors"]] + for pair in res["st_pairs"]: + i, j = pair + res["nsti"][i] += 1 + res["nsti"][j] += 1 + + nsti = res["nsti"] + nsi = res["nsi"] + res["nti"] + + # rather than do n*permutations, we reuse the permutations + # ensuring that each permutation is conditional on a focal unit i + # for each of the permutations we loop over i and swap labels between the + # label at index i in the current permutation and the label at the index + # assigned i in the permutation. + + if permutations > 0: + exceedence = np.zeros(n) + if keep: + STI = np.zeros((n, permutations)) + for perm in range(permutations): + rids = np.random.permutation(ids) + for i in range(n): + rids_i = rids.copy() + # set observed value of focal unit i + # swap with value assigned to rids[i] + # example + # 0 1 2 (ids) + # 2 0 1 (rids) + # i=0 + # 0 2 1 (rids_i) + # i=1 + # 2 1 0 (rids_i) + # i=2 + # 1 0 2 (rids_i) + + rids_i[rids == i] = rids[i] + rids_i[i] = i + + # calculate local stat + rjs = [rids_i[j] for j in sneighbors[i]] + tni = tneighbors[i] + sti = [j for j in rjs if j in tni] + count = len(sti) + if count >= res["nsti"][i]: + exceedence[i] += 1 + if keep: + STI[i, perm] = count + + if keep: + res["sti_perm"] = STI + res["exceedence_pvalue"] = (exceedence + 1) / (permutations + 1) + res["exceedences"] = exceedence + + # analytical inference + ntjis = [len(r) for r in res["tneighbors"]] + n1 = n - 1 + hg_pvalues = [ + 1 - hypergeom.cdf(nsti[i] - 1, n1, ntjis, nsi[i]).mean() for i in range(n) + ] + res["hg_pvalues"] = np.array(hg_pvalues) + + # identification of hot spots + + adjlist = [] + for i, j in res["st_pairs"]: + adjlist.append([i, j]) + adjlist.append([j, i]) + adjlist = pandas.DataFrame(data=adjlist, columns=["focal", "neighbor"]) + adjlist = adjlist.sort_values(by=["focal", "neighbor"]) + adjlist.reset_index(drop=True, inplace=True) + + adjlist["orientation"] = "" + for index, row in adjlist.iterrows(): + focal = row["focal"] + neighbor = row["neighbor"] + ft = t_coords[focal] + nt = t_coords[neighbor] + if ft < nt: + adjlist.iloc[index, 2] = "lead" + elif ft > nt: + adjlist.iloc[index, 2] = "lag" + else: + adjlist.iloc[index, 2] = "coincident" + + res["stadjlist"] = adjlist + return res + + +
+[docs] +class KnoxLocal: + """Local Knox statistics for space-time interactions + + Parameters + ---------- + s_coords: array (nx2) + spatial coordinates of point events + t_coords: array (nx1) + temporal coordinates of point events (floats or ints, not dateTime) + delta: float + spatial threshold defining distance below which pairs are spatial + neighbors + tau: float + temporal threshold defining distance below which pairs are temporal + neighbors + permutations: int + number of random permutations for inference + keep: bool + whether to store realized values of the statistic under permutations + conditional: bool + whether to include conditional permutation inference + crit: float + signifcance level for local statistics + crs: str (optional) + coordinate reference system string for s_coords + + Attributes + ---------- + s_coords: array (nx2) + spatial coordinates of point events + t_coords: array (nx1) + temporal coordinates of point events (floats or ints, not dateTime) + delta: float + spatial threshold defining distance below which pairs are spatial + neighbors + tau: float + temporal threshold defining distance below which pairs are temporal + neighbors + permutations: int + number of random permutations for inference + keep: bool + whether to store realized values of the statistic under permutations + nst: int + number of space-time pairs (global) + p_poisson: float + Analytical p-value under Poisson assumption (global) + p_sim: float + Pseudo p-value based on random permutations (global) + expected: array + Two-by-two array with expected counts under the null of no space-time + interactions. [[NST, NS_], [NT_, N__]] where NST is the expected number + of space-time pairs, NS_ is the expected number of spatial (but not also + temporal) pairs, NT_ is the number of expected temporal (but not also + spatial pairs), N__ is the number of pairs that are neighor spatial or + temporal neighbors. (global) + observed: array + Same structure as expected with the observed pair classifications (global) + sim: array + Global statistics from permutations (if keep=True and keep=True) (global) + p_sims: array + Local psuedo p-values from conditional permutations (if permutations>0) + sims: array + Local statistics from conditional permutations (if keep=True and + permutations>0) + nsti: array + Local statistics + p_hypergeom: array + Analytical p-values based on hypergeometric distribution + + Notes + ----- + Technical details can be found in :cite:`Rogerson:2001`. The conditional + permutation inference is unique to pysal.pointpats. + + Examples + ------- + >>> import libpysal + >>> path = libpysal.examples.get_path('burkitt.shp') + >>> import geopandas + >>> df = geopandas.read_file(path) + >>> from pointpats.spacetime import Knox + >>> import numpy + >>> numpy.random.seed(12345) + >>> local_knox = KnoxLocal(df[['X', 'Y']], df[["T"]], delta=20, tau=5, keep=True) + >>> local_knox.statistic_.shape + (188,) + >>> lres = local_knox + >>> gt0ids = numpy.where(lres.nsti>0) + >>> gt0ids # doctest: +NORMALIZE_WHITESPACE + (array([ 25, 26, 30, 31, 35, 36, 41, 42, 46, 47, 51, 52, 102, + 103, 116, 118, 122, 123, 137, 138, 139, 140, 158, 159, 162, 163]),) + >>> lres.nsti[gt0ids] + array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., + 1., 1., 1., 1., 1., 1., 1., 1., 1.]) + >>> lres.p_hypergeom[gt0ids] + array([0.1348993 , 0.14220663, 0.07335085, 0.08400282, 0.1494317 , + 0.21524073, 0.0175806 , 0.04599869, 0.17523687, 0.18209188, + 0.19111321, 0.16830444, 0.13734428, 0.14703242, 0.06796364, + 0.03192559, 0.13734428, 0.17523687, 0.12998154, 0.1933476 , + 0.13244507, 0.13244507, 0.12502644, 0.14703242, 0.12502644, + 0.12998154]) + >>> lres.p_sims[gt0ids] + array([0.3 , 0.33, 0.11, 0.17, 0.3 , 0.42, 0.06, 0.06, 0.33, 0.34, 0.36, + 0.38, 0.3 , 0.29, 0.41, 0.19, 0.31, 0.39, 0.18, 0.39, 0.48, 0.41, + 0.22, 0.41, 0.39, 0.32]) + """ + +
+[docs] + def __init__( + self, + s_coords, + t_coords, + delta, + tau, + permutations=99, + keep=False, + crit=0.05, + crs=None, + ids=None, + ): + if not isinstance(t_coords, np.ndarray): + raise ValueError("t_coords should be numpy.ndarray type") + if not isinstance(s_coords, np.ndarray): + raise ValueError("s_coords should be numpy.ndarray type") + n_s, k = s_coords.shape + rangeids = list(range(n_s)) + if k < 2: + raise ValueError("s_coords shape required to be nx2") + n_t, k = t_coords.shape + if n_s != n_t: + raise ValueError("t_coords and s_coords need to be same length") + if ids is not None: + if len(ids) != n_s: + raise ValueError("`ids` must have the same length as the inputs") + else: + ids = rangeids + + self._ids = ids + self.s_coords = s_coords + self.t_coords = t_coords + self.delta = delta + self.tau = tau + self.permutations = permutations + self.keep = keep + self.crit = crit + results = _knox_local(s_coords, t_coords, delta, tau, permutations, keep) + self.adjlist = results["stadjlist"] + self.nst = int(results["nst"]) + if permutations > 0: + self.p_sim = results["p_value_sim"] + if keep: + self.sim = results["sti_perm"] + + self.p_poisson = results["p_value_poisson"] + self.observed = results["observed"] + self.expected = results["expected"] + self.p_hypergeom = results["hg_pvalues"] + if permutations > 0: + self.p_sims = results["exceedence_pvalue"] + if keep: + self.sims = results["sti_perm"] + self.nsti = results["nsti"] + # self.hotspots = results["hotspots"] + self._crs = crs + self.statistic_ = self.nsti + self._id_map = dict(zip(rangeids, self._ids)) + self.adjlist["focal"] = self.adjlist["focal"].replace(self._id_map) + self.adjlist["neighbor"] = self.adjlist["neighbor"].replace(self._id_map) + # reconstruct df + geom = gpd.points_from_xy(self.s_coords[:, 0], self.s_coords[:, 1]) + _gdf = gpd.GeoDataFrame(geometry=geom, crs=self._crs, index=self._ids) + _gdf["time"] = self.t_coords + if permutations > 0: + _gdf["p_sim"] = self.p_sims + _gdf["p_hypergeom"] = self.p_hypergeom + self._gdf_static = _gdf
+ + + @property + def _gdf(self): + return self._gdf_static.copy() + +
+[docs] + @classmethod + def from_dataframe( + cls, + dataframe, + time_col: str, + delta: int, + tau: int, + permutations: int = 99, + keep: bool = False, + ): + """Compute a set of local Knox statistics from a dataframe of Point observations + + Parameters + ---------- + dataframe : geopandas.GeoDataFrame + dataframe holding observations. Should be in a projected coordinate system + with geometries stored as Points + time_col : str + column in the dataframe storing the time values (integer coordinate) + for each observation. For example if the observations are stored with + a timestamp, the time_col should be converted to a series of integers + representing, e.g. hours, days, seconds, etc. + delta : int + delta parameter defining the spatial neighbor threshold measured in the + same units as the dataframe CRS + tau : int + tau parameter defining the temporal neihgbor threshold (in the units + measured by `time_col`) + permutations : int, optional + permutations to use for computational inference, by default 99 + keep : bool + whether to store realized values of the statistic under permutations + + Returns + ------- + pointpats.spacetime.LocalKnox + a fitted KnoxLocal class + + """ + s_coords, t_coords = _spacetime_points_to_arrays(dataframe, time_col) + + return cls( + s_coords, + t_coords, + delta, + tau, + permutations, + keep, + crs=dataframe.crs, + ids=dataframe.index.values, + )
+ + +
+[docs] + def hotspots(self, crit=0.05, inference="permutation", keep_neighbors=True): + """Table of significant space-time clusters that define local hotspots. + + Parameters + ---------- + crit : float, optional + critical value for statistical inference, by default 0.05 + inference : str, optional + whether p-values should use permutation or analutical inference, by default + "permutation" + keep_neighbors: bool + whether to included nonsignificant members of hotspots. While these + observations are not themselves significant, these still define the spatial + extent of the cluster, and the the focal observation cannot become + significant without their presence. If True, return all members of a + significant hotspot, else return only the significant locations + + Returns + ------- + pandas.DataFrame + dataframe of significant hotspots + + Raises + ------ + ValueError + if `inference` is not in {'permutation', 'analytic'} + """ + if inference == "permutation": + if not hasattr(self, "p_sim"): + warn( + "Pseudo-p values not availalable. Permutation-based p-values require " + "fitting the KnoxLocal class using `permutations` set to a large " + "number. Using analytic p-values instead", + stacklevel=1, + ) + col = "p_hypergeom" + else: + col = "p_sim" + elif inference == "analytic": + col = "p_hypergeom" + else: + raise ValueError("inference must be either `permutation` or `analytic`") + # determine hot spots + pdf_sig = self._gdf[self._gdf[col] <= crit][[col, "time"]].rename( + columns={col: "pvalue", "time": "focal_time"} + ) + + # if keep_neighbors, we want to include a 'cluster' column denoting which + # cluster nonsig observations belong to. Need to use a graph for that + temp_neighbors = self.adjlist[ + (self.adjlist.focal.isin(pdf_sig.index.values)) + | self.adjlist.neighbor.isin(pdf_sig.index.values) + ] + pdf_sig = pd.concat([pdf_sig, + self._gdf[self._gdf.index.isin(temp_neighbors.neighbor.values) + + ][[col, "time"]].rename( + columns={col: "pvalue", "time": "focal_time"} + ) + ]) + + pdf_sig = pdf_sig.merge( + temp_neighbors, how='outer', left_index=True, right_on="focal" + ).reset_index(drop=True) + # significant focals can be neighbors of others (dupes) + pdf_sig = pdf_sig.groupby("focal").first().reset_index() + graph = Graph.from_adjacency(pdf_sig.assign(weight=1)) + pdf_sig["cluster"] = graph.component_labels.values + if not keep_neighbors : + pdf_sig = pdf_sig[pdf_sig.pvalue<=crit] + + return self._gdf[["geometry"]].merge( + pdf_sig.copy(), left_index=True, right_on="focal" + )
+ + +
+[docs] + def plot( + self, + colors: dict = {"focal": "red", "neighbor": "yellow", "nonsig": "grey"}, + crit: float = 0.05, + inference: str = "permutation", + point_kwargs: dict = None, + plot_edges: bool = True, + edge_color: str = "black", + edge_kwargs: dict = None, + ax=None, + ): + """plot hotspots + + Parameters + ---------- + colors : dict, optional + mapping of colors to hotspot values, by default + {"focal": "red", "neighbor": "yellow", "nonsig": "grey"} + crit : float, optional + critical value for assessing statistical sgifnicance, by default 0.05 + inference : str, optional + whether to use permutation or analytic inference, by default "permutation" + point_kwargs : dict, optional + additional keyword arguments passsed to point plot, by default None + plot_edges : bool, optional + whether to plot edges connecting members of the same hotspot subgraph, + by default True + edge_color : str, optional + color of edges when plot_edges is True, by default 'black' + edge_kwargs : dict, optional + additional keyword arguments passsed to edge plot, by default None + ax : matplotlib.axes.Axes, optional + axes object on which to create the plot, by default None + + Returns + ------- + matplotlib.axes.Axes + plot of local space-time hotspots + """ + + if point_kwargs is None: + point_kwargs = dict() + if edge_kwargs is None: + edge_kwargs = dict() + g = self._gdf.copy() + + g["color"] = colors["nonsig"] + g["pvalue"] = self.p_hypergeom + if inference == "permutation": + if not hasattr(self, "p_sims"): + warn( + "Pseudo-p values not availalable. Permutation-based p-values require " + "fitting the KnoxLocal class using `permutations` set to a large " + "number. Using analytic p-values instead" + ) + g["pvalue"] = self.p_hypergeom + else: + g["pvalue"] = self.p_sims + elif inference == "analytic": + g["pvalue"] = self.p_hypergeom + else: + raise ValueError("inference must be either `permutation` or `analytic`") + + mask = g[g.pvalue <= crit].index.values + neighbors = self.adjlist[self.adjlist.focal.isin(mask)].neighbor.unique() + g.loc[neighbors, "color"] = colors["neighbor"] + g.loc[g.pvalue <= crit, "color"] = colors["focal"] + m = g[g.color == colors["nonsig"]].plot( + color=colors["nonsig"], ax=ax, **point_kwargs + ) + g[g.color == colors["neighbor"]].plot( + ax=m, color=colors["neighbor"], **point_kwargs + ) + g[g.color == colors["focal"]].plot(ax=m, color=colors["focal"], **point_kwargs) + + if plot_edges: + # edges between hotspot and st-neighbors + ghs = self.hotspots(crit=crit, inference=inference) + ghs = ghs.dropna() + origins = g.loc[ghs.focal].geometry + destinations = g.loc[ghs.neighbor].geometry + ods = zip(origins, destinations) + lines = gpd.GeoSeries([LineString(od) for od in ods], crs=g.crs) + lines.plot(ax=m, color=edge_color, **edge_kwargs) + + return m
+ + +
+[docs] + def explore( + self, + crit: float = 0.05, + inference: str = "permutation", + radius: int = 5, + style_kwds: dict = None, + tiles: str = "CartoDB Positron", + plot_edges: bool = True, + edge_weight: int = 2, + edge_color: str = "black", + colors: dict = {"focal": "red", "neighbor": "yellow", "nonsig": "grey"}, + ): + """Interactive plotting for space-time hotspots. + + Parameters + ---------- + crit : float, optional + critical value for statistical inference, by default 0.05 + inference : str, optional + which p-value to use for determining hotspots. Either "permutation" or + "analytic", by default "permutation" + radius : int, optional + radius of the circlemarker plotted by folium, passed to + geopandas.GeoDataFrame.explore style_kwds as a convenience. Ignored if + `style_kwds` is passed directly, by default 5 + style_kwds : dict, optional + additional style kewords passed to GeoDataFrame.explore, by default None + tiles : str, optional + tileset passed to GeoDataFrame.explore `tiles` argument, by default + "CartoDB Positron" + plot_edges : bool, optional + Whether to include lines drawn between members of a singnificant hotspot, by + default True + edge_weight : int, optional + line thickness when `plot_edges=True`, by default 2 + edge_color : str, optional + color of line when `plot_edges=True`, by default "black" + colors : dict, optional + mapping of observation type to color, + by default {"focal": "red", "neighbor": "yellow", "nonsig": "grey"} + + Returns + ------- + folium.Map + an interactive map showing locally-significant spacetime hotspots + """ + if style_kwds is None: + style_kwds = {"radius": radius} + g = self._gdf.copy() + + g["color"] = colors["nonsig"] + + if inference == "permutation": + if not hasattr(self, "p_sims"): + warn( + "Pseudo-p values not availalable. Permutation-based p-values require " + "fitting the KnoxLocal class using `permutations` set to a large " + "number. Using analytic p-values instead" + ) + g["pvalue"] = self.p_hypergeom + else: + g["pvalue"] = self.p_sims + elif inference == "analytic": + g["pvalue"] = self.p_hypergeom + else: + raise ValueError("inference must be either `permutation` or `analytic`") + + mask = g[g.pvalue <= crit].index.values + neighbors = self.adjlist[self.adjlist.focal.isin(mask)].neighbor.unique() + + # this is clunky, but enforces plotting order so significance is prioritized + g.loc[neighbors, "color"] = colors["neighbor"] + g.loc[g.pvalue <= crit, "color"] = colors["focal"] + nbs = self.adjlist.groupby("focal").agg(list)["neighbor"] + g = g.reset_index().merge(nbs, left_on="index", right_index=True, how="left") + + m = g[g.color == colors["nonsig"]].explore( + color="grey", style_kwds=style_kwds, tiles=tiles + ) + blues = g[g.color == colors["neighbor"]] + if blues.shape[0] == 0: + warn("empty neighbor set.") + else: + m = blues.explore(m=m, color=colors["neighbor"], style_kwds=style_kwds) + m = g[g.color == colors["focal"]].explore( + m=m, color=colors["focal"], style_kwds=style_kwds + ) + + if plot_edges: + # edges between hotspot and st-neighbors + g = g.set_index("index") + ghs = self.hotspots(crit=crit, inference=inference) + ghs = ghs.dropna() + origins = g.loc[ghs.focal].geometry + destinations = g.loc[ghs.neighbor].geometry + ods = zip(origins, destinations) + lines = gpd.GeoSeries([LineString(od) for od in ods], crs=g.crs) + lines.explore(m=m, color=edge_color, style_kwds={"weight": edge_weight}) + + return m
+ + + def _gdfhs(self, crit=0.05, inference="permutation"): + # merge df with self.hotspots + return gpd.GeoDataFrame( + self._gdf.merge( + self.hotspots(crit=crit, inference=inference), + left_index=True, + right_on="focal", + ) + )
+ + + +def _spacetime_points_to_arrays(dataframe, time_col): + """convert long-form geodataframe into arrays for kdtree + + Parameters + ---------- + dataframe : geopandas.GeoDataFrame + geodataframe with point geometries + time_col : str + name of the column on dataframe that stores time values + + Returns + ------- + tuple + two numpy arrays holding spatial coodinates s_coords (n,2) + and temporal coordinates t_coords (n,1) + + """ + if dataframe.crs is None: + warn( + "There is no CRS set on the dataframe. The KDTree will assume coordinates " + "are stored in Euclidean distances" + ) + else: + if dataframe.crs.is_geographic: + raise ValueError( + "The input dataframe must be in a projected coordinate system." + ) + + assert dataframe.geom_type.unique().tolist() == [ + "Point" + ], "The Knox statistic is only defined for Point geometries" + + # kdtree wont operate on datetime + if is_numeric_dtype(dataframe[time_col].dtype) is False: + raise ValueError( + "The time values must be stored as " + f"a numeric dtype but the column {time_col} is stored as " + f"{dataframe[time_col].dtype}" + ) + + s_coords = np.vstack((dataframe.geometry.x.values, dataframe.geometry.y.values)).T + t_coords = np.vstack(dataframe[time_col].values) + + return s_coords, t_coords +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/pointpats/window.html b/_modules/pointpats/window.html new file mode 100644 index 0000000..4469d04 --- /dev/null +++ b/_modules/pointpats/window.html @@ -0,0 +1,240 @@ + + + + + + + pointpats.window — pointpats v2.3.0 Manual + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for pointpats.window

+"""
+Window class for point patterns
+"""
+
+__author__ = "Serge Rey sjsrey@gmail.com"
+
+import warnings
+
+import libpysal as ps
+import numpy as np
+
+__all__ = ["as_window", "poly_from_bbox", "to_ccf", "Window"]
+
+
+warnings.filterwarnings(
+    "ignore", "Objects based on the `Geometry` class will", FutureWarning
+)
+
+
+
+[docs] +def poly_from_bbox(bbox): + l, b, r, t = bbox + c = [(l, b), (l, t), (r, t), (r, b), (l, b)] + return ps.cg.shapes.Polygon(c)
+ + + +
+[docs] +def to_ccf(poly): + if poly[-1] != poly[0]: + poly.append(poly[0]) + return poly
+ + + +
+[docs] +def as_window(pysal_polygon): + """ + Convert a libpysal polygon to a Window. + + Parameters + ---------- + pysal_polygon: libpysal.cg.shapes.Polygon + libpysal Polygon instance. + + Returns + ------- + Window + A Window instance. + """ + + if pysal_polygon.holes == [[]]: + return Window(pysal_polygon.parts) + else: + return Window(pysal_polygon.parts, pysal_polygon.holes)
+ + + +
+[docs] +class Window(ps.cg.Polygon): + """ + Geometric container for point patterns. + + A window is used to define the area over which the pattern is observed. + This area is used in estimating the intensity of the point pattern. + See :attr:`PointPattern.lambda_window`. + + Parameters + ---------- + parts: sequence + A sequence of rings which bound the positive space point + pattern. + holes: sequence + A sequence of rings which bound holes in the polygons that bound the + point pattern. + + """ + +
+[docs] + def __init__(self, parts, holes=[]): + if holes: + super(Window, self).__init__(parts, holes) + else: + super(Window, self).__init__(parts)
+ + +
+[docs] + def filter_contained(self, points): + return [np.asarray(pnt) for pnt in points if self.contains_point(pnt)]
+
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_sources/api.rst.txt b/_sources/api.rst.txt new file mode 100644 index 0000000..96494e3 --- /dev/null +++ b/_sources/api.rst.txt @@ -0,0 +1,135 @@ +.. _api_ref: + +.. currentmodule:: pointpats + +API reference +============= + +.. _pointpattern_api: + +Point Pattern +-------------- + +.. autosummary:: + :toctree: generated/ + + PointPattern + +.. _pointprocess_api: + +Point Processes +--------------- + +.. autosummary:: + :toctree: generated/ + + PointProcess + PoissonPointProcess + PoissonClusterPointProcess + +.. _centrgraphy_api: + +Centrography +------------ + +.. autosummary:: + :toctree: generated/ + + minimum_bounding_rectangle + hull + mean_center + weighted_mean_center + manhattan_median + std_distance + euclidean_median + ellipse + skyum + dtot + + +.. _density_api: + +Density +------- + +.. autosummary:: + :toctree: generated/ + + plot_density + +.. _quadrat_api: + +Quadrat Based Statistics +------------------------ + +.. autosummary:: + :toctree: generated/ + + RectangleM + HexagonM + QStatistic + + +.. _distance_api: + +Distance Based Statistics +-------------------------- + +.. autosummary:: + :toctree: generated/ + + f + g + k + j + l + f_test + g_test + k_test + j_test + l_test + +.. _window_api: + +Window functions +---------------- + +.. autosummary:: + :toctree: generated/ + + Window + as_window + poly_from_bbox + to_ccf + +Random distributions +-------------------- + +.. autosummary:: + :toctree: generated/ + + random.poisson + random.normal + random.cluster_poisson + random.cluster_normal + +Space-Time Interaction Tests +----------------------------- + +.. autosummary:: + :toctree: generated/ + + SpaceTimeEvents + Knox + KnoxLocal + mantel + jacquez + modified_knox + +Visualization +--------------- + +.. autosummary:: + :toctree: generated/ + + plot_density \ No newline at end of file diff --git a/_sources/generated/pointpats.HexagonM.rst.txt b/_sources/generated/pointpats.HexagonM.rst.txt new file mode 100644 index 0000000..911e181 --- /dev/null +++ b/_sources/generated/pointpats.HexagonM.rst.txt @@ -0,0 +1,24 @@ +pointpats.HexagonM +================== + +.. currentmodule:: pointpats + +.. autoclass:: HexagonM + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~HexagonM.__init__ + ~HexagonM.plot + ~HexagonM.point_location_sta + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.Knox.rst.txt b/_sources/generated/pointpats.Knox.rst.txt new file mode 100644 index 0000000..af72659 --- /dev/null +++ b/_sources/generated/pointpats.Knox.rst.txt @@ -0,0 +1,23 @@ +pointpats.Knox +============== + +.. currentmodule:: pointpats + +.. autoclass:: Knox + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Knox.__init__ + ~Knox.from_dataframe + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.KnoxLocal.rst.txt b/_sources/generated/pointpats.KnoxLocal.rst.txt new file mode 100644 index 0000000..e0443b1 --- /dev/null +++ b/_sources/generated/pointpats.KnoxLocal.rst.txt @@ -0,0 +1,26 @@ +pointpats.KnoxLocal +=================== + +.. currentmodule:: pointpats + +.. autoclass:: KnoxLocal + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~KnoxLocal.__init__ + ~KnoxLocal.explore + ~KnoxLocal.from_dataframe + ~KnoxLocal.hotspots + ~KnoxLocal.plot + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.PointPattern.rst.txt b/_sources/generated/pointpats.PointPattern.rst.txt new file mode 100644 index 0000000..3ed03df --- /dev/null +++ b/_sources/generated/pointpats.PointPattern.rst.txt @@ -0,0 +1,54 @@ +pointpats.PointPattern +====================== + +.. currentmodule:: pointpats + +.. autoclass:: PointPattern + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~PointPattern.__init__ + ~PointPattern.add_marks + ~PointPattern.explode + ~PointPattern.find_pairs + ~PointPattern.flip_coordinates + ~PointPattern.get_window + ~PointPattern.knn + ~PointPattern.knn_other + ~PointPattern.plot + ~PointPattern.set_window + ~PointPattern.summary + ~PointPattern.superimpose + ~PointPattern.unique + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~PointPattern.hull + ~PointPattern.hull_area + ~PointPattern.lambda_hull + ~PointPattern.lambda_mbb + ~PointPattern.lambda_window + ~PointPattern.max_nnd + ~PointPattern.mbb + ~PointPattern.mbb_area + ~PointPattern.mean_nnd + ~PointPattern.min_nnd + ~PointPattern.n + ~PointPattern.nnd + ~PointPattern.rot + ~PointPattern.tree + ~PointPattern.window + + \ No newline at end of file diff --git a/_sources/generated/pointpats.PointProcess.rst.txt b/_sources/generated/pointpats.PointProcess.rst.txt new file mode 100644 index 0000000..3139736 --- /dev/null +++ b/_sources/generated/pointpats.PointProcess.rst.txt @@ -0,0 +1,25 @@ +pointpats.PointProcess +====================== + +.. currentmodule:: pointpats + +.. autoclass:: PointProcess + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~PointProcess.__init__ + ~PointProcess.draw + ~PointProcess.realize + ~PointProcess.setup + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.PoissonClusterPointProcess.rst.txt b/_sources/generated/pointpats.PoissonClusterPointProcess.rst.txt new file mode 100644 index 0000000..133be0b --- /dev/null +++ b/_sources/generated/pointpats.PoissonClusterPointProcess.rst.txt @@ -0,0 +1,25 @@ +pointpats.PoissonClusterPointProcess +==================================== + +.. currentmodule:: pointpats + +.. autoclass:: PoissonClusterPointProcess + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~PoissonClusterPointProcess.__init__ + ~PoissonClusterPointProcess.draw + ~PoissonClusterPointProcess.realize + ~PoissonClusterPointProcess.setup + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.PoissonPointProcess.rst.txt b/_sources/generated/pointpats.PoissonPointProcess.rst.txt new file mode 100644 index 0000000..aee7a68 --- /dev/null +++ b/_sources/generated/pointpats.PoissonPointProcess.rst.txt @@ -0,0 +1,25 @@ +pointpats.PoissonPointProcess +============================= + +.. currentmodule:: pointpats + +.. autoclass:: PoissonPointProcess + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~PoissonPointProcess.__init__ + ~PoissonPointProcess.draw + ~PoissonPointProcess.realize + ~PoissonPointProcess.setup + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.QStatistic.rst.txt b/_sources/generated/pointpats.QStatistic.rst.txt new file mode 100644 index 0000000..f6ca16d --- /dev/null +++ b/_sources/generated/pointpats.QStatistic.rst.txt @@ -0,0 +1,23 @@ +pointpats.QStatistic +==================== + +.. currentmodule:: pointpats + +.. autoclass:: QStatistic + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~QStatistic.__init__ + ~QStatistic.plot + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.RectangleM.rst.txt b/_sources/generated/pointpats.RectangleM.rst.txt new file mode 100644 index 0000000..75fbdb3 --- /dev/null +++ b/_sources/generated/pointpats.RectangleM.rst.txt @@ -0,0 +1,24 @@ +pointpats.RectangleM +==================== + +.. currentmodule:: pointpats + +.. autoclass:: RectangleM + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~RectangleM.__init__ + ~RectangleM.plot + ~RectangleM.point_location_sta + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.SpaceTimeEvents.rst.txt b/_sources/generated/pointpats.SpaceTimeEvents.rst.txt new file mode 100644 index 0000000..e3919a2 --- /dev/null +++ b/_sources/generated/pointpats.SpaceTimeEvents.rst.txt @@ -0,0 +1,22 @@ +pointpats.SpaceTimeEvents +========================= + +.. currentmodule:: pointpats + +.. autoclass:: SpaceTimeEvents + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~SpaceTimeEvents.__init__ + + + + + + \ No newline at end of file diff --git a/_sources/generated/pointpats.Window.rst.txt b/_sources/generated/pointpats.Window.rst.txt new file mode 100644 index 0000000..ba387cd --- /dev/null +++ b/_sources/generated/pointpats.Window.rst.txt @@ -0,0 +1,39 @@ +pointpats.Window +================ + +.. currentmodule:: pointpats + +.. autoclass:: Window + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Window.__init__ + ~Window.build_quad_tree_structure + ~Window.contains_point + ~Window.filter_contained + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~Window.area + ~Window.bbox + ~Window.bounding_box + ~Window.centroid + ~Window.holes + ~Window.len + ~Window.parts + ~Window.perimeter + ~Window.vertices + + \ No newline at end of file diff --git a/_sources/generated/pointpats.as_window.rst.txt b/_sources/generated/pointpats.as_window.rst.txt new file mode 100644 index 0000000..5517b9a --- /dev/null +++ b/_sources/generated/pointpats.as_window.rst.txt @@ -0,0 +1,6 @@ +pointpats.as\_window +==================== + +.. currentmodule:: pointpats + +.. autofunction:: as_window \ No newline at end of file diff --git a/_sources/generated/pointpats.dtot.rst.txt b/_sources/generated/pointpats.dtot.rst.txt new file mode 100644 index 0000000..915d699 --- /dev/null +++ b/_sources/generated/pointpats.dtot.rst.txt @@ -0,0 +1,6 @@ +pointpats.dtot +============== + +.. currentmodule:: pointpats + +.. autofunction:: dtot \ No newline at end of file diff --git a/_sources/generated/pointpats.ellipse.rst.txt b/_sources/generated/pointpats.ellipse.rst.txt new file mode 100644 index 0000000..3115002 --- /dev/null +++ b/_sources/generated/pointpats.ellipse.rst.txt @@ -0,0 +1,6 @@ +pointpats.ellipse +================= + +.. currentmodule:: pointpats + +.. autofunction:: ellipse \ No newline at end of file diff --git a/_sources/generated/pointpats.euclidean_median.rst.txt b/_sources/generated/pointpats.euclidean_median.rst.txt new file mode 100644 index 0000000..b92cee6 --- /dev/null +++ b/_sources/generated/pointpats.euclidean_median.rst.txt @@ -0,0 +1,6 @@ +pointpats.euclidean\_median +=========================== + +.. currentmodule:: pointpats + +.. autofunction:: euclidean_median \ No newline at end of file diff --git a/_sources/generated/pointpats.f.rst.txt b/_sources/generated/pointpats.f.rst.txt new file mode 100644 index 0000000..df786a6 --- /dev/null +++ b/_sources/generated/pointpats.f.rst.txt @@ -0,0 +1,6 @@ +pointpats.f +=========== + +.. currentmodule:: pointpats + +.. autofunction:: f \ No newline at end of file diff --git a/_sources/generated/pointpats.f_test.rst.txt b/_sources/generated/pointpats.f_test.rst.txt new file mode 100644 index 0000000..65df655 --- /dev/null +++ b/_sources/generated/pointpats.f_test.rst.txt @@ -0,0 +1,6 @@ +pointpats.f\_test +================= + +.. currentmodule:: pointpats + +.. autofunction:: f_test \ No newline at end of file diff --git a/_sources/generated/pointpats.g.rst.txt b/_sources/generated/pointpats.g.rst.txt new file mode 100644 index 0000000..109db55 --- /dev/null +++ b/_sources/generated/pointpats.g.rst.txt @@ -0,0 +1,6 @@ +pointpats.g +=========== + +.. currentmodule:: pointpats + +.. autofunction:: g \ No newline at end of file diff --git a/_sources/generated/pointpats.g_test.rst.txt b/_sources/generated/pointpats.g_test.rst.txt new file mode 100644 index 0000000..e9fb391 --- /dev/null +++ b/_sources/generated/pointpats.g_test.rst.txt @@ -0,0 +1,6 @@ +pointpats.g\_test +================= + +.. currentmodule:: pointpats + +.. autofunction:: g_test \ No newline at end of file diff --git a/_sources/generated/pointpats.hull.rst.txt b/_sources/generated/pointpats.hull.rst.txt new file mode 100644 index 0000000..cfe4f65 --- /dev/null +++ b/_sources/generated/pointpats.hull.rst.txt @@ -0,0 +1,6 @@ +pointpats.hull +============== + +.. currentmodule:: pointpats + +.. autofunction:: hull \ No newline at end of file diff --git a/_sources/generated/pointpats.j.rst.txt b/_sources/generated/pointpats.j.rst.txt new file mode 100644 index 0000000..91de02c --- /dev/null +++ b/_sources/generated/pointpats.j.rst.txt @@ -0,0 +1,6 @@ +pointpats.j +=========== + +.. currentmodule:: pointpats + +.. autofunction:: j \ No newline at end of file diff --git a/_sources/generated/pointpats.j_test.rst.txt b/_sources/generated/pointpats.j_test.rst.txt new file mode 100644 index 0000000..07912b2 --- /dev/null +++ b/_sources/generated/pointpats.j_test.rst.txt @@ -0,0 +1,6 @@ +pointpats.j\_test +================= + +.. currentmodule:: pointpats + +.. autofunction:: j_test \ No newline at end of file diff --git a/_sources/generated/pointpats.jacquez.rst.txt b/_sources/generated/pointpats.jacquez.rst.txt new file mode 100644 index 0000000..5e970da --- /dev/null +++ b/_sources/generated/pointpats.jacquez.rst.txt @@ -0,0 +1,6 @@ +pointpats.jacquez +================= + +.. currentmodule:: pointpats + +.. autofunction:: jacquez \ No newline at end of file diff --git a/_sources/generated/pointpats.k.rst.txt b/_sources/generated/pointpats.k.rst.txt new file mode 100644 index 0000000..325e08a --- /dev/null +++ b/_sources/generated/pointpats.k.rst.txt @@ -0,0 +1,6 @@ +pointpats.k +=========== + +.. currentmodule:: pointpats + +.. autofunction:: k \ No newline at end of file diff --git a/_sources/generated/pointpats.k_test.rst.txt b/_sources/generated/pointpats.k_test.rst.txt new file mode 100644 index 0000000..3f0c9fd --- /dev/null +++ b/_sources/generated/pointpats.k_test.rst.txt @@ -0,0 +1,6 @@ +pointpats.k\_test +================= + +.. currentmodule:: pointpats + +.. autofunction:: k_test \ No newline at end of file diff --git a/_sources/generated/pointpats.l.rst.txt b/_sources/generated/pointpats.l.rst.txt new file mode 100644 index 0000000..759ddd9 --- /dev/null +++ b/_sources/generated/pointpats.l.rst.txt @@ -0,0 +1,6 @@ +pointpats.l +=========== + +.. currentmodule:: pointpats + +.. autofunction:: l \ No newline at end of file diff --git a/_sources/generated/pointpats.l_test.rst.txt b/_sources/generated/pointpats.l_test.rst.txt new file mode 100644 index 0000000..8ce0e12 --- /dev/null +++ b/_sources/generated/pointpats.l_test.rst.txt @@ -0,0 +1,6 @@ +pointpats.l\_test +================= + +.. currentmodule:: pointpats + +.. autofunction:: l_test \ No newline at end of file diff --git a/_sources/generated/pointpats.manhattan_median.rst.txt b/_sources/generated/pointpats.manhattan_median.rst.txt new file mode 100644 index 0000000..8fb7418 --- /dev/null +++ b/_sources/generated/pointpats.manhattan_median.rst.txt @@ -0,0 +1,6 @@ +pointpats.manhattan\_median +=========================== + +.. currentmodule:: pointpats + +.. autofunction:: manhattan_median \ No newline at end of file diff --git a/_sources/generated/pointpats.mantel.rst.txt b/_sources/generated/pointpats.mantel.rst.txt new file mode 100644 index 0000000..4c0d886 --- /dev/null +++ b/_sources/generated/pointpats.mantel.rst.txt @@ -0,0 +1,6 @@ +pointpats.mantel +================ + +.. currentmodule:: pointpats + +.. autofunction:: mantel \ No newline at end of file diff --git a/_sources/generated/pointpats.mean_center.rst.txt b/_sources/generated/pointpats.mean_center.rst.txt new file mode 100644 index 0000000..040dcae --- /dev/null +++ b/_sources/generated/pointpats.mean_center.rst.txt @@ -0,0 +1,6 @@ +pointpats.mean\_center +====================== + +.. currentmodule:: pointpats + +.. autofunction:: mean_center \ No newline at end of file diff --git a/_sources/generated/pointpats.minimum_bounding_rectangle.rst.txt b/_sources/generated/pointpats.minimum_bounding_rectangle.rst.txt new file mode 100644 index 0000000..5ae9e9b --- /dev/null +++ b/_sources/generated/pointpats.minimum_bounding_rectangle.rst.txt @@ -0,0 +1,6 @@ +pointpats.minimum\_bounding\_rectangle +====================================== + +.. currentmodule:: pointpats + +.. autofunction:: minimum_bounding_rectangle \ No newline at end of file diff --git a/_sources/generated/pointpats.modified_knox.rst.txt b/_sources/generated/pointpats.modified_knox.rst.txt new file mode 100644 index 0000000..93965fe --- /dev/null +++ b/_sources/generated/pointpats.modified_knox.rst.txt @@ -0,0 +1,6 @@ +pointpats.modified\_knox +======================== + +.. currentmodule:: pointpats + +.. autofunction:: modified_knox \ No newline at end of file diff --git a/_sources/generated/pointpats.plot_density.rst.txt b/_sources/generated/pointpats.plot_density.rst.txt new file mode 100644 index 0000000..ec9e954 --- /dev/null +++ b/_sources/generated/pointpats.plot_density.rst.txt @@ -0,0 +1,6 @@ +pointpats.plot\_density +======================= + +.. currentmodule:: pointpats + +.. autofunction:: plot_density \ No newline at end of file diff --git a/_sources/generated/pointpats.poly_from_bbox.rst.txt b/_sources/generated/pointpats.poly_from_bbox.rst.txt new file mode 100644 index 0000000..02350af --- /dev/null +++ b/_sources/generated/pointpats.poly_from_bbox.rst.txt @@ -0,0 +1,6 @@ +pointpats.poly\_from\_bbox +========================== + +.. currentmodule:: pointpats + +.. autofunction:: poly_from_bbox \ No newline at end of file diff --git a/_sources/generated/pointpats.random.cluster_normal.rst.txt b/_sources/generated/pointpats.random.cluster_normal.rst.txt new file mode 100644 index 0000000..f6fa2f9 --- /dev/null +++ b/_sources/generated/pointpats.random.cluster_normal.rst.txt @@ -0,0 +1,6 @@ +pointpats.random.cluster\_normal +================================ + +.. currentmodule:: pointpats.random + +.. autofunction:: cluster_normal \ No newline at end of file diff --git a/_sources/generated/pointpats.random.cluster_poisson.rst.txt b/_sources/generated/pointpats.random.cluster_poisson.rst.txt new file mode 100644 index 0000000..3de4329 --- /dev/null +++ b/_sources/generated/pointpats.random.cluster_poisson.rst.txt @@ -0,0 +1,6 @@ +pointpats.random.cluster\_poisson +================================= + +.. currentmodule:: pointpats.random + +.. autofunction:: cluster_poisson \ No newline at end of file diff --git a/_sources/generated/pointpats.random.normal.rst.txt b/_sources/generated/pointpats.random.normal.rst.txt new file mode 100644 index 0000000..986d615 --- /dev/null +++ b/_sources/generated/pointpats.random.normal.rst.txt @@ -0,0 +1,6 @@ +pointpats.random.normal +======================= + +.. currentmodule:: pointpats.random + +.. autofunction:: normal \ No newline at end of file diff --git a/_sources/generated/pointpats.random.poisson.rst.txt b/_sources/generated/pointpats.random.poisson.rst.txt new file mode 100644 index 0000000..151a426 --- /dev/null +++ b/_sources/generated/pointpats.random.poisson.rst.txt @@ -0,0 +1,6 @@ +pointpats.random.poisson +======================== + +.. currentmodule:: pointpats.random + +.. autofunction:: poisson \ No newline at end of file diff --git a/_sources/generated/pointpats.skyum.rst.txt b/_sources/generated/pointpats.skyum.rst.txt new file mode 100644 index 0000000..47dbd74 --- /dev/null +++ b/_sources/generated/pointpats.skyum.rst.txt @@ -0,0 +1,6 @@ +pointpats.skyum +=============== + +.. currentmodule:: pointpats + +.. autofunction:: skyum \ No newline at end of file diff --git a/_sources/generated/pointpats.std_distance.rst.txt b/_sources/generated/pointpats.std_distance.rst.txt new file mode 100644 index 0000000..da87753 --- /dev/null +++ b/_sources/generated/pointpats.std_distance.rst.txt @@ -0,0 +1,6 @@ +pointpats.std\_distance +======================= + +.. currentmodule:: pointpats + +.. autofunction:: std_distance \ No newline at end of file diff --git a/_sources/generated/pointpats.to_ccf.rst.txt b/_sources/generated/pointpats.to_ccf.rst.txt new file mode 100644 index 0000000..c4514d9 --- /dev/null +++ b/_sources/generated/pointpats.to_ccf.rst.txt @@ -0,0 +1,6 @@ +pointpats.to\_ccf +================= + +.. currentmodule:: pointpats + +.. autofunction:: to_ccf \ No newline at end of file diff --git a/_sources/generated/pointpats.weighted_mean_center.rst.txt b/_sources/generated/pointpats.weighted_mean_center.rst.txt new file mode 100644 index 0000000..442a0bc --- /dev/null +++ b/_sources/generated/pointpats.weighted_mean_center.rst.txt @@ -0,0 +1,6 @@ +pointpats.weighted\_mean\_center +================================ + +.. currentmodule:: pointpats + +.. autofunction:: weighted_mean_center \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index 68ae867..b502e24 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -1,20 +1,62 @@ -.. No Errors Test Project documentation master file, created by - sphinx-quickstart on Fri Aug 30 17:07:56 2019. +.. pointpats documentation master file, created by + sphinx-quickstart on Mon Nov 12 16:37:22 2018. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to No Errors Test Project's documentation! -================================================== +Point Pattern Analysis (pointpats) +======================================== -.. toctree:: - :maxdepth: 2 - :caption: Hello World! +pointpats is an open-source python library for the statistical analysis of planar point patterns. +It is a subpackage of `PySAL`_ (Python Spatial Analysis Library) and is under active development +for the inclusion of many newly proposed analytics for point patterns. + + +.. raw:: html +
+
+
+
+ + + +
+
+
+
+ + +.. toctree:: + :hidden: + :maxdepth: 3 + :caption: Contents: + Installation + API + References -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +.. _PySAL: https://github.com/pysal/pysal diff --git a/_sources/installation.rst.txt b/_sources/installation.rst.txt new file mode 100644 index 0000000..92dc493 --- /dev/null +++ b/_sources/installation.rst.txt @@ -0,0 +1,49 @@ +.. Installation + +Installation +============ + +From version 2.1.0, pointpats supports python `3.6`_ and `3.7`_ only. +Please make sure that you are operating in a python 3 environment. + +Installing released version +--------------------------- + +pointpats is available on the `Python Package Index`_. Therefore, you can either +install directly with `pip` from the command line:: + + pip install -U pointpats + + +or download the source distribution (.tar.gz) and decompress it to your selected +destination. Open a command shell and navigate to the decompressed folder. +Type:: + + pip install . + +You may also install the latest stable pointpats via `conda-forge`_ channel by +running:: + + $ conda install --channel conda-forge pointpats + +Installing development version +------------------------------ + +Potentially, you might want to use the newest features in the development +version of pointpats on github - `pysal/pointpats`_ while have not been incorporated +in the Pypi released version. You can achieve that by installing `pysal/pointpats`_ +by running the following from a command shell:: + + pip install git+https://github.com/pysal/pointpats.git + +You can also `fork`_ the `pysal/pointpats`_ repo and create a local clone of +your fork. By making changes +to your local clone and submitting a pull request to `pysal/pointpats`_, you can +contribute to the pointpats development. + +.. _3.6: https://docs.python.org/3.6/ +.. _3.7: https://docs.python.org/3.7/ +.. _Python Package Index: https://pypi.org/project/pointpats/ +.. _pysal/pointpats: https://github.com/pysal/pointpats +.. _fork: https://help.github.com/articles/fork-a-repo/ +.. _conda-forge: https://github.com/conda-forge/pointpats-feedstock \ No newline at end of file diff --git a/_sources/references.rst.txt b/_sources/references.rst.txt new file mode 100644 index 0000000..09d2529 --- /dev/null +++ b/_sources/references.rst.txt @@ -0,0 +1,7 @@ +.. reference for the docs + +References +========== + +.. bibliography:: _static/references.bib + :cited: diff --git a/_static/basic.css b/_static/basic.css index 0119285..f316efc 100644 --- a/_static/basic.css +++ b/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,6 +15,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -124,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -216,7 +222,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -231,14 +237,8 @@ a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -271,25 +271,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +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, object.align-right { +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, object.align-center { +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 { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -313,24 +313,35 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + 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 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -352,10 +363,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -366,9 +373,34 @@ div.body p.centered { 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; } @@ -398,10 +430,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -416,32 +444,34 @@ table.citation td { border-bottom: none; } -th > p:first-child, -td > p:first-child { +th > :first-child, +td > :first-child { margin-top: 0px; } -th > p:last-child, -td > p:last-child { +th > :last-child, +td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -468,10 +498,71 @@ table.field-list td, table.field-list th { /* -- 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 ----------------------------------------------------- */ @@ -495,26 +586,53 @@ ol.upperroman { list-style: upper-roman; } -li > p:first-child { +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { margin-top: 0px; } -li > p:last-child { +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } -dl.footnote > dt, -dl.citation > dt { - float: left; +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; } -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; } -dl.footnote > dd:after, -dl.citation > dd:after { +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; } @@ -531,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -546,7 +660,7 @@ dl { margin-bottom: 15px; } -dd > p:first-child { +dd > :first-child { margin-top: 0px; } @@ -560,6 +674,21 @@ dd { 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; } @@ -573,14 +702,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -621,8 +742,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -630,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { @@ -637,29 +767,69 @@ pre { 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 { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + 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; } @@ -668,12 +838,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +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 { @@ -685,21 +857,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -740,8 +898,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 0000000..09e88ce --- /dev/null +++ b/_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/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 0000000..f4ede63 --- /dev/null +++ b/_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/_static/bootstrap-2.3.2/css/bootstrap.css b/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 0000000..b725064 --- /dev/null +++ b/_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/_static/bootstrap-2.3.2/css/bootstrap.min.css b/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..b6428e6 --- /dev/null +++ b/_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/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png differ diff --git a/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/_static/bootstrap-2.3.2/img/glyphicons-halflings.png differ diff --git a/_static/bootstrap-2.3.2/js/bootstrap.js b/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 0000000..638bb18 --- /dev/null +++ b/_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 + $('