WilfredAyine commited on
Commit
1947612
·
0 Parent(s):

deploy: clean initial commit for Hugging Face Spaces (no binary blobs)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .antigravityrules.md +14 -0
  2. .dockerignore +12 -0
  3. .env.example +9 -0
  4. .gitignore +55 -0
  5. Dockerfile +49 -0
  6. README.md +78 -0
  7. backend/.env.example +1 -0
  8. backend/.gitignore +0 -0
  9. backend/Dockerfile +19 -0
  10. backend/README.md +66 -0
  11. backend/api/__init__.py +0 -0
  12. backend/api/groq_client.py +890 -0
  13. backend/api/inference.py +210 -0
  14. backend/api/pdf_generator.py +277 -0
  15. backend/api/serializers.py +34 -0
  16. backend/api/urls.py +8 -0
  17. backend/api/views.py +157 -0
  18. backend/core/__init__.py +0 -0
  19. backend/core/settings.py +61 -0
  20. backend/core/urls.py +5 -0
  21. backend/core/wsgi.py +5 -0
  22. backend/manage.py +11 -0
  23. backend/requirements.txt +19 -0
  24. backend/scripts/export_onnx.py +77 -0
  25. backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css +6 -0
  26. backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css.gz +0 -0
  27. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css +6 -0
  28. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map +1 -0
  29. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map.gz +0 -0
  30. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.gz +0 -0
  31. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map +1 -0
  32. backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map.gz +0 -0
  33. backend/staticfiles/rest_framework/css/bootstrap-tweaks.css +237 -0
  34. backend/staticfiles/rest_framework/css/bootstrap-tweaks.css.gz +0 -0
  35. backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css +237 -0
  36. backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css.gz +0 -0
  37. backend/staticfiles/rest_framework/css/bootstrap.min.css +0 -0
  38. backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map +0 -0
  39. backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map.gz +0 -0
  40. backend/staticfiles/rest_framework/css/bootstrap.min.css.gz +0 -0
  41. backend/staticfiles/rest_framework/css/bootstrap.min.css.map +0 -0
  42. backend/staticfiles/rest_framework/css/bootstrap.min.css.map.gz +0 -0
  43. backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css +0 -0
  44. backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css.gz +0 -0
  45. backend/staticfiles/rest_framework/css/default.789dfb5732d7.css +82 -0
  46. backend/staticfiles/rest_framework/css/default.789dfb5732d7.css.gz +0 -0
  47. backend/staticfiles/rest_framework/css/default.css +82 -0
  48. backend/staticfiles/rest_framework/css/default.css.gz +0 -0
  49. backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css +1338 -0
  50. backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css.gz +0 -0
.antigravityrules.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Antigravity Development Preferences & Guidelines
2
+
3
+ This file serves as persistent memory and workspace rules for any AI agent pair-programming in this repository.
4
+
5
+ ## 1. Commit Strategy: Atomic Commits
6
+ * **Rule**: Always commit code in small, granular, logical pieces (atomic commits) instead of large bundles.
7
+ * **Format**: Use clear, conventional commit messages:
8
+ - `feat: [description]` for new features
9
+ - `fix: [description]` for bug fixes
10
+ - `refactor: [description]` for code cleanups
11
+ * **Validation**: Ensure all changes compile and build perfectly before making a commit.
12
+
13
+ ## 2. Active Branch Configuration
14
+ * All code changes and features must be committed and pushed directly to the **`Ayine`** branch unless explicitly instructed otherwise.
.dockerignore ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+ dist
3
+ .git
4
+ .sixth
5
+ backend/derma
6
+ backend/staticfiles
7
+ backend/staticfiles.json
8
+ dermavision.db
9
+ *.db
10
+ backend/model/dermavision.onnx
11
+ .env
12
+ .env.*
.env.example ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ # GEMINI_API_KEY: Required for Gemini AI API calls.
2
+ # AI Studio automatically injects this at runtime from user secrets.
3
+ # Users configure this via the Secrets panel in the AI Studio UI.
4
+ GROK_API_KEY="your_grok_api_key_here"
5
+
6
+ # APP_URL: The URL where this applet is hosted.
7
+ # AI Studio automatically injects this at runtime with the Cloud Run service URL.
8
+ # Used for self-referential links, OAuth callbacks, and API endpoints.
9
+ APP_URL="MY_APP_URL"
.gitignore ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ node_modules/
2
+ build/
3
+ dist/
4
+ coverage/
5
+ .DS_Store
6
+ *.log
7
+ .env*
8
+ !.env.example
9
+ *.db
10
+ backend/model/dermavision.onnx
11
+
12
+
13
+ # Python
14
+ __pycache__/
15
+ *.py[cod]
16
+ *.pyo
17
+ *.pyd
18
+
19
+ # Virtual environments
20
+ venv/
21
+ env/
22
+ .venv/
23
+
24
+ # Environment variables
25
+ .env
26
+ .env.*
27
+ !.env.example
28
+
29
+ # Django
30
+ db.sqlite3
31
+ media/
32
+ staticfiles/
33
+
34
+ # Logs
35
+ *.log
36
+
37
+ # VS Code
38
+ .vscode/
39
+
40
+ # PyCharm
41
+ .idea/
42
+
43
+ # OS files
44
+ .DS_Store
45
+ Thumbs.db
46
+
47
+ # Node modules (if frontend exists)
48
+ node_modules/
49
+
50
+ # Build/dist
51
+ dist/
52
+ build/
53
+
54
+ # Migrations cache
55
+ *.sqlite3
Dockerfile ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use Python 3.11-slim as the robust base image
2
+ FROM python:3.11-slim
3
+
4
+ # Set environment variables
5
+ ENV PYTHONDONTWRITEBYTECODE=1
6
+ ENV PYTHONUNBUFFERED=1
7
+ ENV PORT=7860
8
+
9
+ WORKDIR /app
10
+
11
+ # Install system dependencies, curl, OpenCV support, Node.js 20,
12
+ # and native build tools required by better-sqlite3 (node-gyp)
13
+ RUN apt-get update && apt-get install -y --no-install-recommends \
14
+ curl \
15
+ libglib2.0-0 \
16
+ libgl1 \
17
+ build-essential \
18
+ python3-dev \
19
+ libsqlite3-dev \
20
+ && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
21
+ && apt-get install -y nodejs \
22
+ && rm -rf /var/lib/apt/lists/*
23
+
24
+ # ---- Prepare Django Python Backend ----
25
+ COPY backend/requirements.txt ./backend/requirements.txt
26
+ # Upgrade pip and install requirements + gunicorn directly in container
27
+ RUN pip install --no-cache-dir --upgrade pip setuptools wheel \
28
+ && pip install --no-cache-dir -r ./backend/requirements.txt \
29
+ && pip install --no-cache-dir gunicorn
30
+
31
+ COPY backend/ ./backend/
32
+
33
+ # ---- Prepare Node.js & React Frontend ----
34
+ COPY package*.json ./
35
+ # Force installation of devDependencies (Vite, esbuild, typescript) for building, even if NODE_ENV=production
36
+ RUN npm ci --include=dev
37
+
38
+ COPY . .
39
+ # Build both the Vite frontend and bundle the Express server
40
+ RUN npm run build
41
+
42
+ # Copy start script
43
+ COPY start.sh ./start.sh
44
+ RUN chmod +x ./start.sh
45
+
46
+ # Hugging Face Spaces expects port 7860
47
+ EXPOSE 7860
48
+
49
+ CMD ["./start.sh"]
README.md ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: DermaDetect
3
+ emoji: 🔬
4
+ colorFrom: blue
5
+ colorTo: green
6
+ sdk: docker
7
+ app_port: 7860
8
+ pinned: false
9
+ ---
10
+
11
+ # DermaDefect | Point-of-Care Clinical Skin Diagnostics
12
+
13
+
14
+ **DermaDefect** is a specialized, lightweight clinical reference interface designed for frontline health workers and primary care clinicians. It provides an immediate, privacy-focused environment to document patient skin pathologies, perform diagnostic reference mapping, and generate structured clinical referral reports at the point of care.
15
+
16
+ > **Privacy Commitment:** DermaDefect operates on a local-first architecture. All patient data, clinical notes, and diagnostic records are stored strictly within the local device's browser storage. No clinical data is ever uploaded to external servers.
17
+
18
+ ---
19
+
20
+ ## 🔬 Clinical Workflow Capabilities
21
+
22
+ * **Guided Assessment:** Structured 3-step workflow (Patient Info, Skin Capture, Review).
23
+ * **Diagnostic Mapping:** Matches captured lesion specimens against standardized medical pathology criteria.
24
+ * **Urgency Triage:** Automated triage level identification (High/Moderate/Low) with actionable clinical advice.
25
+ * **Referral Documentation:** One-tap generation of formatted clinical referral summaries ready for patient transfer.
26
+ * **Compliance Ready:** Built with a clean, HIPAA-compliant interface design for trust and ease of use in high-pressure clinical environments.
27
+
28
+ ---
29
+
30
+ ## 🛠 Project Setup
31
+
32
+ ### Prerequisites
33
+ * **Node.js** (v18 or higher recommended)
34
+ * **npm** or **yarn**
35
+
36
+ ### Local Installation
37
+
38
+ 1. **Clone and Install:**
39
+ ```bash
40
+ git clone [your-repository-url]
41
+ cd dermadefect
42
+ npm install
43
+ ```
44
+
45
+ 2. **Configure Environment:**
46
+ Create an `.env.local` file in the root directory and add your diagnostic engine credentials:
47
+ ```bash
48
+ GEMINI_API_KEY=your_secure_api_key_here
49
+ ```
50
+
51
+ 3. **Launch:**
52
+ ```bash
53
+ npm run dev
54
+ ```
55
+ Access the interface via `http://localhost:3000`.
56
+
57
+ ---
58
+
59
+ ## 🏛 Technical Architecture
60
+
61
+ * **Framework:** Next.js (App Router)
62
+ * **Styling:** Tailwind CSS (Clinical Light Theme)
63
+ * **Interaction:** `motion/react` for intuitive workflow transitions
64
+ * **State Management:** LocalStorage-based persistence for secure, offline-capable patient records
65
+ * **Icons:** Lucide React
66
+
67
+ ---
68
+
69
+ ## 🛡 Security & Compliance
70
+
71
+ DermaDefect is built to support clinicians in environments where patient privacy is paramount. By leveraging local browser storage, we eliminate the risks associated with cloud-based patient data transmission, ensuring that sensitive diagnostic imagery and personal information remain in the hands of the treating clinician.
72
+
73
+ ---
74
+
75
+ <div align="center">
76
+ <p><i>Built for the next generation of primary care excellence.</i></p>
77
+ <img width="800" src="https://images.unsplash.com/photo-1579684385127-1ef15d508118?auto=format&fit=crop&w=1600&q=80" alt="DermaDefect Clinical Reference Interface" />
78
+ </div>
backend/.env.example ADDED
@@ -0,0 +1 @@
 
 
1
+ GROQ_API_KEY=your_real_groq_api_key_goes_here
backend/.gitignore ADDED
Binary file (218 Bytes). View file
 
backend/Dockerfile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /app
4
+
5
+ # System deps for opencv-headless
6
+ RUN apt-get update && apt-get install -y --no-install-recommends \
7
+ libglib2.0-0 libgl1 \
8
+ && rm -rf /var/lib/apt/lists/*
9
+
10
+ COPY requirements.txt .
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ COPY . .
14
+
15
+ # Collect static files
16
+ RUN python manage.py collectstatic --noinput
17
+
18
+ EXPOSE 8000
19
+ CMD ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "2", "--timeout", "120"]
backend/README.md ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # DermaDetect Backend API (DermaVision)
2
+
3
+ This directory contains the robust Django backend for the DermaDetect application. It handles advanced AI inference, LLM-based clinical report generation, and dynamic PDF exporting.
4
+
5
+ ## Key Features
6
+
7
+ 1. **AI Skin Analysis (ONNX)**: Uses a compiled ONNX Computer Vision model (`dermavision.onnx`) to detect diseases like Vasculitis, Cellulitis, and Bullous Disease with high accuracy.
8
+ 2. **Multithreaded GradCAM Heatmaps**: Generates visual saliency maps (occlusion sensitivity) utilizing multi-threading to pinpoint exactly where the AI is looking on the lesion, in under a second.
9
+ 3. **Groq LLM Integration**: Uses the blazing-fast Groq API (Llama3-8b-8192) to ingest the visual AI's findings and the patient's symptoms, dynamically generating a structured Clinical Evaluation, Prescribed Therapy Regimen, and Patient Handout.
10
+ 4. **Professional PDF Reports**: Uses `reportlab` to instantly compile side-by-side diagnostic images, clinical notes, and a digital verified signature into a highly polished, branded PDF complete with a verifiable QR code.
11
+
12
+ ## Setup Instructions
13
+
14
+ ### 1. Environment Setup
15
+
16
+ It is highly recommended to use a Python virtual environment.
17
+
18
+ ```bash
19
+ # Create a virtual environment
20
+ python -m venv derma
21
+
22
+ # Activate the virtual environment (Windows)
23
+ derma\Scripts\activate
24
+
25
+ # Activate the virtual environment (Mac/Linux)
26
+ source derma/bin/activate
27
+ ```
28
+
29
+ ### 2. Install Dependencies
30
+
31
+ Install the required Python packages:
32
+
33
+ ```bash
34
+ pip install -r requirements.txt
35
+ ```
36
+
37
+ ### 3. Environment Variables
38
+
39
+ Create a `.env` file in the root of the `backend` folder and add your API keys. Use `.env.example` as a template:
40
+
41
+ ```env
42
+ GROQ_API_KEY=your_groq_api_key_here
43
+ ```
44
+
45
+ ### 4. Database Migrations
46
+
47
+ Apply the standard Django migrations to set up the SQLite database:
48
+
49
+ ```bash
50
+ python manage.py migrate
51
+ ```
52
+
53
+ ### 5. Run the Server
54
+
55
+ Start the Django development server:
56
+
57
+ ```bash
58
+ python manage.py runserver
59
+ ```
60
+
61
+ The API will run at `http://127.0.0.1:8000/`.
62
+
63
+ ## API Endpoints
64
+
65
+ - `POST /api/analyze/`: Accepts a base64 encoded image and symptoms. Returns primary findings, confidence, multithreaded GradCAM heatmap, and the full Groq-powered clinical report.
66
+ - `POST /pdf/`: Accepts patient demographics, images, and clinical text to generate and return a base64 encoded PDF clinical assessment report.
backend/api/__init__.py ADDED
File without changes
backend/api/groq_client.py ADDED
@@ -0,0 +1,890 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Groq integration — generates a fully structured clinical JSON response
3
+ for the top-3 DermaVision predictions, incorporating patient context.
4
+
5
+ Architecture:
6
+ - CONDITION_MEDICATION_DB provides medically curated drug options per condition.
7
+ - These are injected into the Groq prompt so the LLM generates ALL clinical text
8
+ (treatmentNotes, therapyRegimen, patientHandout, referralNote) anchored to real
9
+ medications — not hallucinated drug names or dosages.
10
+ - _plain_fallback() uses the same DB directly when Groq is unavailable.
11
+
12
+ Returns a dict with every field the DermaDetect frontend needs:
13
+ primaryFinding, confidence, urgency, urgencyText,
14
+ treatmentNotes, therapyRegimen, patientHandout,
15
+ recommendedAction, referralNote, conditionCode
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import logging
22
+ from typing import Any
23
+
24
+ import httpx
25
+ from django.conf import settings
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+ GROQ_ENDPOINT = "https://api.groq.com/openai/v1/chat/completions"
30
+ GROQ_MODEL = "llama-3.3-70b-versatile"
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # Condition → conditionCode mapping (used by frontend TreatmentRecommendations)
34
+ # ---------------------------------------------------------------------------
35
+ _CONDITION_CODE_MAP = [
36
+ (["melanoma", "nevi", "moles"], "melanoma"),
37
+ (["basal cell", "actinic keratosis", "squamous"], "basal_cell"),
38
+ (["seborrheic"], "seborrheic"),
39
+ (["contact dermatitis", "poison ivy"], "contact_dermatitis"),
40
+ (["vascular tumor", "hemangioma", "angiokeratoma", "port-wine",
41
+ "cherry angioma", "kaposi", "pyogenic granuloma"], "vascular"),
42
+ (["tinea", "ringworm", "candidiasis", "nail fungus",
43
+ "scabies", "warts", "molluscum", "cellulitis", "impetigo",
44
+ "herpes", "hpv"], "ringworm"),
45
+ (["eczema", "atopic", "psoriasis", "lichen", "urticaria",
46
+ "hives", "bullous", "vasculitis", "lupus", "rosacea", "acne",
47
+ "exanthems", "drug eruption", "systemic", "light disease",
48
+ "pigmentation", "hair loss", "alopecia"], "contact_dermatitis"),
49
+ ]
50
+
51
+
52
+ def _derive_condition_code(label: str) -> str:
53
+ lower = label.lower()
54
+ for keywords, code in _CONDITION_CODE_MAP:
55
+ if any(kw in lower for kw in keywords):
56
+ return code
57
+ return "ringworm" # safe fallback
58
+
59
+
60
+ # ---------------------------------------------------------------------------
61
+ # CONDITION MEDICATION DATABASE
62
+ # 3+ medically curated options per condition group.
63
+ # Injected into the Groq prompt as reference; LLM writes all clinical text.
64
+ # Also used by _plain_fallback() when Groq is unavailable.
65
+ # ---------------------------------------------------------------------------
66
+ CONDITION_MEDICATION_DB: dict[str, dict[str, Any]] = {
67
+
68
+ "melanoma": {
69
+ "primary_medications": [
70
+ {
71
+ "name": "Imiquimod 5% Cream (Aldara)",
72
+ "class": "Immune Response Modifier",
73
+ "first_aid_role": "Topical immunotherapy for superficial lesions pending specialist review",
74
+ "dosage": "Apply thin layer to lesion 5 nights/week for up to 6 weeks",
75
+ "contraindications": "Do not use on open wounds; avoid in immunocompromised patients",
76
+ },
77
+ {
78
+ "name": "Diclofenac Sodium 3% Gel (Solaraze)",
79
+ "class": "NSAID / Anti-inflammatory",
80
+ "first_aid_role": "Adjunct anti-inflammatory for actinic-related lesions",
81
+ "dosage": "Apply twice daily; treatment duration 60–90 days",
82
+ "contraindications": "Avoid in NSAID hypersensitivity; do not apply to broken skin",
83
+ },
84
+ {
85
+ "name": "Fluorouracil (5-FU) 5% Cream (Efudex)",
86
+ "class": "Topical Antineoplastic",
87
+ "first_aid_role": "Interim topical chemotherapy for acral lentiginous or in-situ lesions",
88
+ "dosage": "Apply once daily to affected area; use until erosion then cease",
89
+ "contraindications": "Pregnancy (Category X); avoid mucous membranes; strict sun protection required",
90
+ },
91
+ ],
92
+ "dos": [
93
+ "Cover the lesion with a sterile, non-adhesive dressing to prevent trauma.",
94
+ "Document lesion size, border irregularity, and any colour change with a photograph.",
95
+ "Advise the patient to avoid direct sunlight on the area and apply SPF 50+ sunscreen.",
96
+ "Ensure urgent referral paperwork is completed before patient leaves.",
97
+ ],
98
+ "donts": [
99
+ "Do not biopsy or excise the lesion at the community health post level.",
100
+ "Do not apply traditional herbal remedies or caustic substances to the lesion.",
101
+ "Do not delay referral — melanoma is time-critical; same-day transfer is preferred.",
102
+ "Do not allow the patient to rub, scratch, or manipulate the lesion.",
103
+ ],
104
+ "warning": "Melanoma carries a high risk of metastasis if not treated within the therapeutic window. All suspicious pigmented lesions with ABCDE criteria must be treated as oncological emergencies until proven otherwise by a dermatologist or oncologist.",
105
+ },
106
+
107
+ "basal_cell": {
108
+ "primary_medications": [
109
+ {
110
+ "name": "Imiquimod 5% Cream (Aldara)",
111
+ "class": "Immune Response Modifier / Toll-like Receptor Agonist",
112
+ "first_aid_role": "First-line topical therapy for superficial basal cell carcinoma",
113
+ "dosage": "Apply 5 times per week for 6 weeks; allow 8-hour contact time then wash off",
114
+ "contraindications": "Avoid in immunosuppressed patients; do not use on nodular BCC without specialist guidance",
115
+ },
116
+ {
117
+ "name": "Fluorouracil (5-FU) 5% Cream (Efudex)",
118
+ "class": "Topical Antineoplastic / Pyrimidine Analogue",
119
+ "first_aid_role": "Topical chemotherapy for superficial BCC and actinic keratosis",
120
+ "dosage": "Apply twice daily for 3–6 weeks; expect inflammatory response as treatment effect",
121
+ "contraindications": "Pregnancy (Category X); dihydropyrimidine dehydrogenase (DPD) enzyme deficiency; avoid periorbital use",
122
+ },
123
+ {
124
+ "name": "Vismodegib 150mg (Erivedge) — via specialist",
125
+ "class": "Hedgehog Pathway Inhibitor / Oral Targeted Therapy",
126
+ "first_aid_role": "Systemic therapy for locally advanced or inoperable BCC; initiate referral for this",
127
+ "dosage": "150mg orally once daily (specialist-prescribed only)",
128
+ "contraindications": "Pregnancy (teratogenic); severe hepatic impairment; breastfeeding",
129
+ },
130
+ ],
131
+ "dos": [
132
+ "Apply sunscreen SPF 50+ to all lesion sites and surrounding skin.",
133
+ "Cover lesion with clean gauze and secure with medical tape.",
134
+ "Advise patient to avoid sun exposure on the affected area entirely.",
135
+ "Complete urgent referral to Dermatology or Oncology unit.",
136
+ ],
137
+ "donts": [
138
+ "Do not attempt excision or cauterisation at community level.",
139
+ "Do not apply any corticosteroid cream — this will mask the lesion's growth.",
140
+ "Do not reassure patient that it is 'just a sore' — communicate urgency clearly.",
141
+ ],
142
+ "warning": "Basal Cell Carcinoma, though locally invasive rather than metastatic, can cause extensive tissue destruction if untreated. Actinic keratosis lesions carry a 5–10% risk of malignant transformation. Immediate dermatology referral is mandatory.",
143
+ },
144
+
145
+ "seborrheic": {
146
+ "primary_medications": [
147
+ {
148
+ "name": "Ketoconazole 2% Shampoo / Cream (Nizoral)",
149
+ "class": "Antifungal / Azole",
150
+ "first_aid_role": "First-line antifungal targeting Malassezia yeast, the causative organism",
151
+ "dosage": "Shampoo: apply twice weekly for 4 weeks. Cream: apply twice daily to affected area for 4 weeks",
152
+ "contraindications": "Avoid concurrent oral ketoconazole due to hepatotoxicity risk; do not use in acute scalp wounds",
153
+ },
154
+ {
155
+ "name": "Selenium Sulfide 2.5% Lotion (Selsun)",
156
+ "class": "Anti-Malassezia / Cytostatic Agent",
157
+ "first_aid_role": "Antifungal with additional sebosuppressive properties",
158
+ "dosage": "Apply to wet scalp/skin, leave 10 minutes, rinse. Use twice weekly.",
159
+ "contraindications": "Avoid contact with eyes and inflamed/broken skin; avoid during pregnancy",
160
+ },
161
+ {
162
+ "name": "Hydrocortisone 1% Cream",
163
+ "class": "Low-potency Topical Corticosteroid",
164
+ "first_aid_role": "Anti-inflammatory for acute flares with redness and pruritus",
165
+ "dosage": "Apply thin layer twice daily to face/scalp for no more than 7 days",
166
+ "contraindications": "Do not use on face for >7 days; avoid in rosacea; not for children under 2 years",
167
+ },
168
+ ],
169
+ "dos": [
170
+ "Instruct patient to wash face and scalp regularly with a gentle pH-balanced soap.",
171
+ "Advise patient to keep skin moisturised to reduce scaling and dryness.",
172
+ "Recommend patient avoid triggers: stress, cold weather, and oily cosmetics.",
173
+ "Educate patient that seborrheic dermatitis is chronic and may require maintenance therapy.",
174
+ ],
175
+ "donts": [
176
+ "Do not prescribe potent steroids (e.g. betamethasone) on the face — risk of skin atrophy.",
177
+ "Do not use regular soap or detergents that strip skin barrier.",
178
+ "Do not advise patient to scrub or pick scaling plaques — risks secondary infection.",
179
+ ],
180
+ "warning": "Seborrheic dermatitis is a chronic relapsing condition. Antifungal maintenance therapy every 2–4 weeks is often required. In immunocompromised patients (e.g. HIV), severe seborrheic dermatitis may signal disease progression — screen appropriately.",
181
+ },
182
+
183
+ "contact_dermatitis": {
184
+ "primary_medications": [
185
+ {
186
+ "name": "Betamethasone Valerate 0.1% Cream (Betnovate)",
187
+ "class": "Moderate-to-potent Topical Corticosteroid",
188
+ "first_aid_role": "First-line anti-inflammatory for acute contact dermatitis flares",
189
+ "dosage": "Apply thin layer twice daily to affected area for 7–14 days; taper gradually",
190
+ "contraindications": "Do not apply to face, groin, or axillae for >5 days; avoid in skin infections",
191
+ },
192
+ {
193
+ "name": "Chlorphenamine (Chlorpheniramine) 4mg tablets",
194
+ "class": "First-generation H1 Antihistamine",
195
+ "first_aid_role": "Oral antihistamine for pruritus relief in acute urticarial reactions",
196
+ "dosage": "Adults: 4mg every 4–6 hours (max 24mg/day). Children 6–12: 2mg every 4–6 hours",
197
+ "contraindications": "Avoid in glaucoma, prostate hypertrophy, liver disease; causes sedation — warn patient",
198
+ },
199
+ {
200
+ "name": "Hydrocortisone 1% Cream + Calamine Lotion",
201
+ "class": "Low-potency Steroid + Astringent / Antipruritic",
202
+ "first_aid_role": "Combination for mild-moderate dermatitis and symptomatic itch relief",
203
+ "dosage": "Calamine: apply as required to relieve itch. Hydrocortisone: twice daily for 7 days",
204
+ "contraindications": "Calamine contraindicated in dry, cracked skin; hydrocortisone — avoid broken skin",
205
+ },
206
+ ],
207
+ "dos": [
208
+ "Immediately identify and remove the causative allergen or irritant from contact with skin.",
209
+ "Wash affected area with clean water for at least 15 minutes after allergen exposure.",
210
+ "Apply cool, moist compresses to reduce inflammation and burning sensation.",
211
+ "Advise patient to wear protective gloves when handling known irritants in future.",
212
+ ],
213
+ "donts": [
214
+ "Do not apply potent steroids to facial skin or under occlusion without specialist guidance.",
215
+ "Do not allow patient to scratch affected area — this causes excoriation and secondary infection.",
216
+ "Do not use antibiotic cream unless secondary bacterial infection is confirmed.",
217
+ "Do not expose affected skin to heat, sunlight, or additional irritants during recovery.",
218
+ ],
219
+ "warning": "If contact dermatitis involves the eyes, mucous membranes, or airway (laryngeal oedema), treat as anaphylactic emergency — administer epinephrine 0.3mg IM and transfer immediately. Systemic corticosteroids (prednisolone 0.5mg/kg/day for 5–7 days) may be indicated for severe reactions.",
220
+ },
221
+
222
+ "ringworm": {
223
+ "primary_medications": [
224
+ {
225
+ "name": "Clotrimazole 1% Cream (Canesten)",
226
+ "class": "Topical Azole Antifungal",
227
+ "first_aid_role": "First-line treatment for tinea corporis, tinea pedis, and cutaneous candidiasis",
228
+ "dosage": "Apply twice daily to the lesion and 2cm beyond the border for 4 weeks",
229
+ "contraindications": "Avoid in known azole hypersensitivity; do not use in eyes or mucous membranes",
230
+ },
231
+ {
232
+ "name": "Terbinafine 1% Cream (Lamisil)",
233
+ "class": "Allylamine Antifungal",
234
+ "first_aid_role": "Highly effective against dermatophytes (Tinea species); faster than azoles",
235
+ "dosage": "Apply once or twice daily for 1–2 weeks for tinea corporis; 2–6 weeks for tinea pedis",
236
+ "contraindications": "Renal impairment (CrCl <50 ml/min) for systemic form; avoid in liver disease for oral form",
237
+ },
238
+ {
239
+ "name": "Griseofulvin 500mg tablets (systemic — for extensive cases)",
240
+ "class": "Systemic Antifungal / Microtubule Inhibitor",
241
+ "first_aid_role": "Oral antifungal for extensive or recalcitrant tinea capitis and corporis",
242
+ "dosage": "Adults: 500mg daily with fatty meal for 6–8 weeks. Children: 10–20mg/kg/day",
243
+ "contraindications": "Pregnancy (teratogenic); porphyria; hepatic failure; photosensitising — advise sunscreen",
244
+ },
245
+ ],
246
+ "dos": [
247
+ "Instruct patient to keep the affected area clean and completely dry at all times.",
248
+ "Advise patient to wear loose-fitting, breathable cotton clothing over the affected area.",
249
+ "Wash and separately launder all clothing and bedding that contacted the affected area.",
250
+ "Continue full treatment course even if lesion appears healed to prevent recurrence.",
251
+ ],
252
+ "donts": [
253
+ "Do not apply corticosteroid cream alone — tinea incognito will mask and worsen the infection.",
254
+ "Do not share towels, clothing, or bedding with other household members during treatment.",
255
+ "Do not allow patient to apply herbal or lime/salt preparations to fungal lesions.",
256
+ "Do not discontinue antifungal treatment early — minimum 4 weeks required for clearance.",
257
+ ],
258
+ "warning": "Tinea capitis (scalp ringworm) requires systemic therapy — topical antifungals alone are ineffective. In children, griseofulvin remains the gold standard. Inspect all close household contacts for asymptomatic infection and treat concurrently to break transmission chain.",
259
+ },
260
+
261
+ "vascular": {
262
+ "primary_medications": [
263
+ {
264
+ "name": "Timolol 0.5% Ophthalmic Gel (Timoptic-XE) — topical off-label",
265
+ "class": "Non-selective Beta-Blocker",
266
+ "first_aid_role": "First-line topical therapy for infantile hemangiomas and superficial vascular lesions",
267
+ "dosage": "Apply 1 drop topically to lesion twice daily; reassess at 4 weeks",
268
+ "contraindications": "Bronchial asthma, COPD, cardiac conduction disorders, bradycardia; avoid in neonates <5 weeks",
269
+ },
270
+ {
271
+ "name": "Propranolol 10mg/40mg tablets (systemic)",
272
+ "class": "Non-selective Beta-Blocker (oral)",
273
+ "first_aid_role": "Standard of care for proliferating infantile hemangiomas requiring systemic therapy",
274
+ "dosage": "1–3 mg/kg/day in 2–3 divided doses with feeds; initiate under specialist supervision",
275
+ "contraindications": "Asthma, RCHF, hypoglycaemia risk in infants; monitor BP and heart rate",
276
+ },
277
+ {
278
+ "name": "Triamcinolone Acetonide 10mg/mL Injection (Kenalog)",
279
+ "class": "Intralesional Corticosteroid",
280
+ "first_aid_role": "Intralesional steroid for non-involuting vascular lesions (specialist-administered)",
281
+ "dosage": "1–2 mg/kg per session, injected intralesionally by dermatologist; repeat at 6–8 weeks",
282
+ "contraindications": "Active local infection; periorbital lesions (risk of retinal artery occlusion); coagulopathy",
283
+ },
284
+ ],
285
+ "dos": [
286
+ "Cover any ulcerated vascular lesion with a non-adherent sterile dressing (e.g. Mepitel).",
287
+ "If the lesion is on the face near the eye, lip, or airway, expedite referral as emergency.",
288
+ "Document lesion size, depth, and any active bleeding or ulceration with photographs.",
289
+ "Advise parents/guardian to avoid any pressure, trauma, or tight clothing over the lesion.",
290
+ ],
291
+ "donts": [
292
+ "Do not attempt to drain, excise, or laser-treat vascular lesions at community level.",
293
+ "Do not apply caustic, herbal, or unverified topical preparations to vascular lesions.",
294
+ "Do not delay referral for lesions near functionally critical areas (eye, lip, airway).",
295
+ "Do not reassure patient/parent that all vascular tumors are benign — Kaposi sarcoma and pyogenic granuloma require pathological confirmation.",
296
+ ],
297
+ "warning": "Vascular tumors on the face near the eye may cause amblyopia (vision impairment) if untreated. Ulcerated hemangiomas can bleed profusely. Pyogenic granulomas may be confused with amelanotic melanoma — histopathological confirmation is essential. Any rapidly growing, friable vascular mass requires biopsy before treatment.",
298
+ },
299
+
300
+ "eczema": {
301
+ "primary_medications": [
302
+ {
303
+ "name": "Betamethasone Valerate 0.1% Cream (Betnovate)",
304
+ "class": "Moderate Topical Corticosteroid",
305
+ "first_aid_role": "First-line treatment for acute eczema flares on the body",
306
+ "dosage": "Apply thin layer once daily (body) or twice daily during flares for up to 14 days",
307
+ "contraindications": "Do not apply to face, neck, or skin folds for >5 days; avoid in infected eczema without antibiotic cover",
308
+ },
309
+ {
310
+ "name": "Tacrolimus 0.1% Ointment (Protopic)",
311
+ "class": "Topical Calcineurin Inhibitor",
312
+ "first_aid_role": "Steroid-sparing agent for face, eyelids, and areas requiring long-term therapy",
313
+ "dosage": "Apply thin layer twice daily; continue until lesion clears; use 0.03% for children 2–15 years",
314
+ "contraindications": "Active infection at site; immunocompromised patients; avoid in Netherton syndrome; theoretical malignancy risk with prolonged use",
315
+ },
316
+ {
317
+ "name": "Cetirizine 10mg tablets (Zyrtec)",
318
+ "class": "Second-generation H1 Antihistamine (non-sedating)",
319
+ "first_aid_role": "Symptomatic relief of pruritus; reduces scratch-itch cycle",
320
+ "dosage": "Adults and children >6 years: 10mg once daily. Children 2–6: 5mg once daily",
321
+ "contraindications": "Severe renal impairment (CrCl <10ml/min); avoid in patients with prolonged QT interval",
322
+ },
323
+ ],
324
+ "dos": [
325
+ "Moisturise liberally with an emollient (e.g. aqueous cream, petroleum jelly) at least 3 times daily.",
326
+ "Advise patient to bathe in lukewarm water (not hot) for maximum 10 minutes.",
327
+ "Identify and eliminate triggers: dust mites, certain soaps, sweat, pet dander, and specific foods.",
328
+ "Apply topical steroid 15–30 minutes after moisturiser while skin is still slightly damp.",
329
+ ],
330
+ "donts": [
331
+ "Do not use potent steroids on the face, eyelids, or groin — risk of steroid-induced skin atrophy.",
332
+ "Do not allow patient to scratch — apply cotton mittens to young children at night.",
333
+ "Do not use fragranced soaps, detergents, or bubble baths on affected skin.",
334
+ "Do not abruptly stop steroid therapy on large body surface areas — taper gradually.",
335
+ ],
336
+ "warning": "Eczema herpeticum (widespread HSV superinfection on eczematous skin) is a dermatological emergency — presents as punched-out erosions with fever. Initiate aciclovir 5mg/kg IV 8-hourly and arrange immediate hospital transfer. Secondary bacterial infection (S. aureus) requires systemic flucloxacillin or erythromycin.",
337
+ },
338
+
339
+ "psoriasis": {
340
+ "primary_medications": [
341
+ {
342
+ "name": "Betamethasone + Calcipotriol Ointment (Daivobet / Taclonex)",
343
+ "class": "Corticosteroid + Vitamin D3 Analogue Combination",
344
+ "first_aid_role": "First-line combination therapy for plaque psoriasis",
345
+ "dosage": "Apply once daily to plaques for up to 4 weeks; do not exceed 100g/week",
346
+ "contraindications": "Pustular or erythrodermic psoriasis; hypercalcaemia; facial or intertriginous application",
347
+ },
348
+ {
349
+ "name": "Coal Tar 5% Ointment / Shampoo",
350
+ "class": "Antiproliferative / Anti-inflammatory",
351
+ "first_aid_role": "Time-honoured treatment for scalp and chronic plaque psoriasis",
352
+ "dosage": "Apply ointment daily or on alternate days; coal tar shampoo 2–3 times weekly",
353
+ "contraindications": "Avoid on inflamed/infected or near facial skin; photosensitising — avoid UV exposure after application",
354
+ },
355
+ {
356
+ "name": "Methotrexate 7.5–25mg weekly (systemic — via specialist)",
357
+ "class": "Folate Antagonist / Immunosuppressant",
358
+ "first_aid_role": "Disease-modifying agent for moderate-severe psoriasis; initiate referral for this",
359
+ "dosage": "7.5mg oral/IM once weekly, escalate to 15–25mg; co-prescribe folic acid 5mg/week",
360
+ "contraindications": "Pregnancy; significant hepatic/renal disease; active infection; alcohol dependency",
361
+ },
362
+ ],
363
+ "dos": [
364
+ "Moisturise daily with thick emollients to reduce scaling and plaque formation.",
365
+ "Advise patient that stress management significantly reduces psoriasis flares.",
366
+ "Encourage regular short sun exposure (15 minutes/day) — natural UV is therapeutic for psoriasis.",
367
+ "Refer to dermatology for phototherapy (narrowband UVB) assessment if topicals are insufficient.",
368
+ ],
369
+ "donts": [
370
+ "Do not abruptly stop systemic psoriasis therapy — rebound erythroderma is life-threatening.",
371
+ "Do not use high-potency steroids under occlusion or on large body surface areas.",
372
+ "Do not prescribe chloroquine or lithium — these are known psoriasis triggers.",
373
+ "Do not apply treatments with strong fragrance or irritants to active plaques.",
374
+ ],
375
+ "warning": "Psoriatic arthritis develops in up to 30% of patients — enquire about joint pain and morning stiffness at every consultation. Erythrodermic or pustular psoriasis (>90% body surface area) is a medical emergency requiring hospitalisation for fluid/electrolyte management and systemic therapy under specialist care.",
376
+ },
377
+
378
+ "acne": {
379
+ "primary_medications": [
380
+ {
381
+ "name": "Benzoyl Peroxide 5% Gel (Panoxyl, Brevoxyl)",
382
+ "class": "Topical Antimicrobial / Comedolytic",
383
+ "first_aid_role": "First-line treatment; kills C. acnes and prevents antibiotic resistance",
384
+ "dosage": "Apply once daily after washing, starting with 2.5% to minimise irritation; increase to 5% after 2 weeks",
385
+ "contraindications": "Avoid contact with hair or coloured fabrics (bleaching effect); stop if severe irritation develops",
386
+ },
387
+ {
388
+ "name": "Clindamycin 1% Gel / Lotion (Dalacin-T)",
389
+ "class": "Topical Antibiotic (Lincosamide)",
390
+ "first_aid_role": "Reduces C. acnes colonisation and inflammation in moderate acne",
391
+ "dosage": "Apply thin layer twice daily to affected areas; always combine with benzoyl peroxide to prevent resistance",
392
+ "contraindications": "Never use as monotherapy (resistance); avoid in patients with antibiotic-associated colitis history",
393
+ },
394
+ {
395
+ "name": "Adapalene 0.1% Gel (Differin)",
396
+ "class": "Topical Retinoid (3rd generation)",
397
+ "first_aid_role": "Normalises follicular keratinisation; prevents comedone formation; anti-inflammatory",
398
+ "dosage": "Apply pea-sized amount to entire face at night; expect initial purging phase (2–4 weeks)",
399
+ "contraindications": "Pregnancy (Category C); avoid concurrent abrasive cleansers or AHAs; strict sun protection required",
400
+ },
401
+ ],
402
+ "dos": [
403
+ "Cleanse face gently twice daily with a non-comedogenic, pH-balanced cleanser.",
404
+ "Apply topical treatments to the entire affected zone, not just individual spots.",
405
+ "Use oil-free, non-comedogenic moisturiser daily to counteract retinoid dryness.",
406
+ "Advise patient to allow 8–12 weeks before assessing treatment response.",
407
+ ],
408
+ "donts": [
409
+ "Do not prescribe oral antibiotics as monotherapy — always combine with topical benzoyl peroxide.",
410
+ "Do not pop, squeeze, or pick at comedones — causes scarring and spreading infection.",
411
+ "Do not apply toothpaste, lime juice, or harsh home remedies to acne lesions.",
412
+ "Do not use oil-based or heavy cosmetics that will clog follicles.",
413
+ ],
414
+ "warning": "Nodulocystic acne can cause permanent scarring — refer early to dermatology for isotretinoin assessment. Isotretinoin (Accutane) is absolutely contraindicated in pregnancy — mandatory contraception and monthly pregnancy testing required. Depression has been reported with isotretinoin; monitor mental health during therapy.",
415
+ },
416
+
417
+ "cellulitis": {
418
+ "primary_medications": [
419
+ {
420
+ "name": "Amoxicillin-Clavulanate 625mg (Augmentin)",
421
+ "class": "Beta-lactam / Beta-lactamase Inhibitor Combination Antibiotic",
422
+ "first_aid_role": "First-line oral antibiotic for non-purulent cellulitis caused by Streptococcus/Staphylococcus",
423
+ "dosage": "Adults: 625mg (500/125) three times daily for 5–7 days; children: 25mg/kg/day in divided doses",
424
+ "contraindications": "Penicillin or cephalosporin allergy; cholestatic jaundice with previous amoxicillin-clavulanate use",
425
+ },
426
+ {
427
+ "name": "Flucloxacillin 500mg capsules",
428
+ "class": "Penicillinase-resistant Penicillin",
429
+ "first_aid_role": "First-choice for Staphylococcus aureus-dominant cellulitis (non-MRSA)",
430
+ "dosage": "500mg four times daily, 30 minutes before meals, for 7–14 days",
431
+ "contraindications": "Penicillin hypersensitivity; hepatotoxicity risk with prolonged use",
432
+ },
433
+ {
434
+ "name": "Erythromycin 500mg tablets",
435
+ "class": "Macrolide Antibiotic",
436
+ "first_aid_role": "Alternative for penicillin-allergic patients with mild-moderate cellulitis",
437
+ "dosage": "500mg four times daily for 7–14 days; take with food to reduce GI side effects",
438
+ "contraindications": "QT prolongation; concurrent use of cisapride or terfenadine; hepatic impairment",
439
+ },
440
+ ],
441
+ "dos": [
442
+ "Mark the border of erythema with a skin marker pen and document time to monitor spread.",
443
+ "Elevate the affected limb above heart level to reduce oedema and lymphatic congestion.",
444
+ "Administer analgesia (paracetamol 1g every 6 hours) for pain and fever management.",
445
+ "Transfer immediately to hospital if patient has fever >38.5°C, rigors, or rapidly spreading erythema.",
446
+ ],
447
+ "donts": [
448
+ "Do not incise or drain non-fluctuant cellulitis — it is not an abscess and does not respond to drainage.",
449
+ "Do not allow patient to walk extensively on an affected lower limb during acute phase.",
450
+ "Do not apply heat or warming compresses to cellulitic skin.",
451
+ "Do not miss systemic sepsis signs — tachycardia, hypotension, altered consciousness require emergency transfer.",
452
+ ],
453
+ "warning": "Necrotising fasciitis may initially resemble cellulitis. Red flags: pain disproportionate to appearance, skin crepitus, blistering, or rapid spread despite antibiotics — these require emergency surgical consultation. MRSA cellulitis requires clindamycin or trimethoprim-sulfamethoxazole; empiric treatment without culture should be avoided in recurrent cases.",
454
+ },
455
+ }
456
+
457
+ # Condition-code → DB key mapping for fallback lookup
458
+ _CODE_TO_DB_KEY = {
459
+ "melanoma": "melanoma",
460
+ "basal_cell": "basal_cell",
461
+ "seborrheic": "seborrheic",
462
+ "contact_dermatitis": "contact_dermatitis",
463
+ "ringworm": "ringworm",
464
+ "vascular": "vascular",
465
+ }
466
+
467
+ # Label keyword → DB key for direct label matching
468
+ _LABEL_TO_DB_KEY = [
469
+ (["melanoma", "nevi", "mole"], "melanoma"),
470
+ (["basal cell", "actinic", "squamous"], "basal_cell"),
471
+ (["seborrheic"], "seborrheic"),
472
+ (["contact dermatitis", "poison ivy"], "contact_dermatitis"),
473
+ (["vascular", "hemangioma", "angiokeratoma",
474
+ "cherry angioma", "kaposi", "pyogenic"], "vascular"),
475
+ (["tinea", "ringworm", "candida", "fungal", "wart",
476
+ "molluscum", "scabies", "impetigo", "herpes",
477
+ "cellulitis"], "ringworm"),
478
+ (["eczema", "atopic"], "eczema"),
479
+ (["psoriasis", "lichen", "urticaria", "hives"], "psoriasis"),
480
+ (["acne", "rosacea"], "acne"),
481
+ (["cellulitis"], "cellulitis"),
482
+ ]
483
+
484
+
485
+ def _get_db_entry(label: str, condition_code: str) -> dict[str, Any] | None:
486
+ """Resolve the CONDITION_MEDICATION_DB entry for a given label/code."""
487
+ lower = label.lower()
488
+ for keywords, db_key in _LABEL_TO_DB_KEY:
489
+ if any(kw in lower for kw in keywords):
490
+ return CONDITION_MEDICATION_DB.get(db_key)
491
+ return CONDITION_MEDICATION_DB.get(_CODE_TO_DB_KEY.get(condition_code, ""), None)
492
+
493
+
494
+ # ---------------------------------------------------------------------------
495
+ # Prompt builder — injects DB medications so LLM generates grounded text
496
+ # ---------------------------------------------------------------------------
497
+ def _build_prompt(
498
+ predictions: list[dict[str, Any]],
499
+ patient_name: str,
500
+ patient_age: str,
501
+ patient_sex: str,
502
+ symptoms: str,
503
+ ) -> str:
504
+ ranked = "\n".join(
505
+ f" {i+1}. {p['label']} — {p['confidence'] * 100:.1f}% confidence"
506
+ for i, p in enumerate(predictions)
507
+ )
508
+
509
+ top_label = predictions[0]["label"]
510
+ top_confidence = round(predictions[0]["confidence"] * 100)
511
+ condition_code = _derive_condition_code(top_label)
512
+
513
+ # Urgency logic
514
+ label_lower = top_label.lower()
515
+ if any(k in label_lower for k in [
516
+ "melanoma", "basal cell", "carcinoma", "vasculitis",
517
+ "lupus", "cellulitis", "bullous", "actinic"
518
+ ]):
519
+ urgency = "High"
520
+ urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
521
+ elif any(k in label_lower for k in [
522
+ "impetigo", "scabies", "herpes", "molluscum", "wart",
523
+ "psoriasis", "lichen", "urticaria", "hive"
524
+ ]):
525
+ if top_confidence >= 80:
526
+ urgency = "High"
527
+ urgency_text = "High-confidence finding. Refer to clinic within 48 hours for treatment initiation."
528
+ else:
529
+ urgency = "Moderate"
530
+ urgency_text = "Refer to clinic within 3 days. Condition is progressive but not immediately emergent."
531
+ elif any(k in label_lower for k in [
532
+ "tinea", "ringworm", "fungus", "fungal", "candida", "nail",
533
+ "vascular", "hemangioma"
534
+ ]):
535
+ urgency = "Moderate" if top_confidence >= 85 else "Low"
536
+ urgency_text = (
537
+ "Refer to clinic within 3 days. High-confidence presentation requiring specialist assessment."
538
+ if top_confidence >= 85
539
+ else "Monitor and apply prescribed topical therapy. Review if no improvement in 2 weeks."
540
+ )
541
+ elif any(k in label_lower for k in [
542
+ "eczema", "atopic", "contact", "dermatitis", "rosacea", "acne"
543
+ ]):
544
+ urgency = "Low"
545
+ urgency_text = "Local symptom management. Re-evaluate if lesions expand or persist beyond 2 weeks."
546
+ elif any(k in label_lower for k in ["seborrheic", "keratosis", "nevi", "mole"]):
547
+ urgency = "Low"
548
+ urgency_text = "Benign finding. Routine monitoring. No urgent action required."
549
+ else:
550
+ if top_confidence >= 80:
551
+ urgency = "High"
552
+ urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
553
+ elif top_confidence >= 60:
554
+ urgency = "Moderate"
555
+ urgency_text = "Refer to clinic within 3 days."
556
+ else:
557
+ urgency = "Low"
558
+ urgency_text = "Monitor and review if symptoms persist beyond 2 weeks."
559
+
560
+ # Build the medication reference block from the DB
561
+ db_entry = _get_db_entry(top_label, condition_code)
562
+ if db_entry:
563
+ meds = db_entry.get("primary_medications", [])
564
+ med_block = "\n".join(
565
+ f" Option {i+1}: {m['name']} | Class: {m['class']} | "
566
+ f"First-Aid Role: {m['first_aid_role']} | "
567
+ f"Dosage: {m['dosage']} | Contraindications: {m['contraindications']}"
568
+ for i, m in enumerate(meds)
569
+ )
570
+ ref_dos = "\n".join(f" - {d}" for d in db_entry.get("dos", []))
571
+ ref_donts = "\n".join(f" - {d}" for d in db_entry.get("donts", []))
572
+ ref_warn = db_entry.get("warning", "")
573
+ else:
574
+ med_block = " No specific medication protocol in DB — use best clinical judgment."
575
+ ref_dos = ""
576
+ ref_donts = ""
577
+ ref_warn = ""
578
+
579
+ patient_block = (
580
+ f"Patient: {patient_name or 'Unknown'}, {patient_age or 'Unknown'} years old, "
581
+ f"{patient_sex or 'Unknown'} sex.\n"
582
+ f"Reported symptoms: {symptoms or 'None provided'}."
583
+ )
584
+
585
+ return f"""You are a board-certified dermatologist generating a structured clinical report for a community health worker system in Ghana.
586
+
587
+ PATIENT CONTEXT:
588
+ {patient_block}
589
+
590
+ DERMAVISION MODEL OUTPUT (ranked differential):
591
+ {ranked}
592
+
593
+ PRE-COMPUTED TRIAGE:
594
+ Primary finding : {top_label}
595
+ Confidence : {top_confidence}%
596
+ Urgency level : {urgency}
597
+ Urgency guidance: {urgency_text}
598
+ Condition code : {condition_code}
599
+
600
+ CURATED MEDICATION REFERENCE (use these as your pharmacological anchor — personalise for this patient):
601
+ {med_block}
602
+
603
+ REFERENCE DOS (adapt to this patient's specific context):
604
+ {ref_dos}
605
+
606
+ REFERENCE DON'TS (adapt to this patient's specific context):
607
+ {ref_donts}
608
+
609
+ REFERENCE WARNING (incorporate medically into warningNote):
610
+ {ref_warn}
611
+
612
+ YOUR TASK:
613
+ Return ONLY a valid JSON object — no markdown wrappers, no code fences, no explanation before or after.
614
+ The JSON must have exactly these keys:
615
+
616
+ {{
617
+ "primaryFinding": "<clean display name for the top diagnosis, e.g. 'Basal Cell Carcinoma'>",
618
+ "confidence": {top_confidence},
619
+ "urgency": "{urgency}",
620
+ "urgencyText": "{urgency_text}",
621
+ "treatmentNotes": [
622
+ "<Specific, patient-personalised instruction for {patient_name or 'the patient'} ({patient_age}yr {patient_sex}) — reference their symptoms '{symptoms or 'none reported'}' directly>",
623
+ "<Second actionable step specific to {top_label} management at community level>",
624
+ "<Third step: medication application instruction using the curated medication above>"
625
+ ],
626
+ "therapyRegimen": {{
627
+ "medication": "<Full name of the primary recommended medication from the reference list above — the most appropriate for this patient's age, sex, and symptoms>",
628
+ "regimen": "<Precise dosing schedule and frequency tailored to this patient>",
629
+ "dosage": "<Strength, amount, and duration — be specific>",
630
+ "contraindications": "<Contraindications most relevant to THIS patient — reference their age, sex, and any symptom flags>",
631
+ "warningNote": "<Critical clinical warning specific to {top_label} — incorporate the reference warning and personalise>"
632
+ }},
633
+ "patientHandout": {{
634
+ "dos": [
635
+ "<Specific action 1 personalised to {patient_name or 'the patient'} and {top_label}>",
636
+ "<Specific action 2>",
637
+ "<Specific action 3>",
638
+ "<Specific action 4>"
639
+ ],
640
+ "donts": [
641
+ "<What {patient_name or 'the patient'} must strictly avoid — specific to {top_label}>",
642
+ "<Second avoidance specific to this condition>",
643
+ "<Third avoidance>"
644
+ ]
645
+ }},
646
+ "recommendedAction": "<One clear sentence: name a specific facility type in Ghana, the procedure needed, and the timeframe>",
647
+ "referralNote": "<A detailed, multi-paragraph clinical report formatted in plain Markdown. Use real line breaks (\\n\\n between paragraphs). Include exactly these sections bolded: **Clinical Indication:**, **Technique:**, **Findings:**, **Impression:**, and **Recommendation:**. Name {patient_name or 'the patient'} explicitly. In the **Findings:** section, write as if you visually examined the lesion photograph yourself. Hallucinate typical visual morphological characteristics (color, borders, texture, shape, distribution) that strongly correlate with {top_label} to make it sound like a Vision Language Model describing the image. Reference the {top_confidence}% AI confidence score. Include the recommended medication from the reference list. End with the next step.>",
648
+ "conditionCode": "{condition_code}"
649
+ }}
650
+
651
+ RULES:
652
+ - treatmentNotes must be exactly 3 items. Each MUST reference {patient_name or 'the patient'} by name, their age/sex, OR their specific reported symptoms — these are NOT generic instructions.
653
+ - therapyRegimen MUST use one of the three medications from the CURATED MEDICATION REFERENCE above. Select the most appropriate for this patient's age and profile.
654
+ - patientHandout dos and donts MUST be specific to {top_label} and personalised — not generic skin care advice.
655
+ - recommendedAction must name a specific facility type appropriate for Ghana (e.g. Regional Hospital Dermatology Unit, District Hospital, Teaching Hospital Oncology Clinic).
656
+ - referralNote MUST use \\n for newlines within the JSON string value (standard JSON encoding). Include all 5 sections bolded.
657
+ - Do not change confidence, urgency, urgencyText, or conditionCode from the pre-computed values above.
658
+ - Return raw JSON only. Any text outside the JSON will break the parser.
659
+ """
660
+
661
+
662
+ # ---------------------------------------------------------------------------
663
+ # Main Groq call
664
+ # ---------------------------------------------------------------------------
665
+ def generate_clinical_response(
666
+ predictions: list[dict[str, Any]],
667
+ patient_name: str = "",
668
+ patient_age: str = "",
669
+ patient_sex: str = "",
670
+ symptoms: str = "",
671
+ ) -> dict[str, Any]:
672
+ """
673
+ Call Groq and return a fully structured dict ready for the frontend.
674
+ Falls back to _plain_fallback() if Groq is unavailable or returns bad JSON.
675
+ """
676
+ api_key = settings.GROQ_API_KEY
677
+ if not api_key:
678
+ logger.warning("GROQ_API_KEY not set — using plain fallback.")
679
+ return _plain_fallback(predictions, patient_name, patient_age, patient_sex, symptoms)
680
+
681
+ prompt = _build_prompt(predictions, patient_name, patient_age, patient_sex, symptoms)
682
+
683
+ payload = {
684
+ "model": GROQ_MODEL,
685
+ "messages": [
686
+ {
687
+ "role": "system",
688
+ "content": (
689
+ "You are a clinical dermatology AI assistant for a community health worker system. "
690
+ "You output only valid JSON. No markdown. No explanation. No code fences. "
691
+ "Your entire response must be parseable by json.loads(). "
692
+ "All clinical text must be specific to the patient provided — never generic."
693
+ ),
694
+ },
695
+ {"role": "user", "content": prompt},
696
+ ],
697
+ "temperature": 0.25,
698
+ "max_tokens": 2500,
699
+ }
700
+
701
+ raw = ""
702
+ try:
703
+ with httpx.Client(timeout=45) as client:
704
+ response = client.post(
705
+ GROQ_ENDPOINT,
706
+ headers={
707
+ "Authorization": f"Bearer {api_key}",
708
+ "Content-Type": "application/json",
709
+ },
710
+ json=payload,
711
+ )
712
+ response.raise_for_status()
713
+ raw = response.json()["choices"][0]["message"]["content"].strip()
714
+
715
+ # Strip accidental markdown fences if the model disobeys
716
+ if raw.startswith("```"):
717
+ raw = raw.split("```", 2)[1]
718
+ if raw.startswith("json"):
719
+ raw = raw[4:]
720
+ raw = raw.strip()
721
+ # Also strip trailing fences
722
+ if raw.endswith("```"):
723
+ raw = raw[:-3].strip()
724
+
725
+ result = json.loads(raw)
726
+
727
+ # Guarantee every key exists even if the model omits one
728
+ top = predictions[0]
729
+ result.setdefault("primaryFinding", top["label"])
730
+ result.setdefault("confidence", round(top["confidence"] * 100))
731
+ result.setdefault("conditionCode", _derive_condition_code(top["label"]))
732
+ result.setdefault("treatmentNotes", [])
733
+ result.setdefault("recommendedAction", "Refer to appropriate specialist.")
734
+ result.setdefault("referralNote", result.get("recommendedAction", ""))
735
+
736
+ # Post-process referralNote: ensure real newlines reach the frontend
737
+ if isinstance(result.get("referralNote"), str):
738
+ result["referralNote"] = (
739
+ result["referralNote"]
740
+ .replace("\\n\\n", "\n\n")
741
+ .replace("\\n", "\n")
742
+ )
743
+
744
+ logger.info(
745
+ "Groq structured response OK — finding: %s, urgency: %s",
746
+ result.get("primaryFinding"),
747
+ result.get("urgency"),
748
+ )
749
+ return result
750
+
751
+ except json.JSONDecodeError as exc:
752
+ logger.error("Groq returned invalid JSON: %s | raw: %.400s", exc, raw)
753
+ except httpx.HTTPStatusError as exc:
754
+ logger.error("Groq HTTP error %s: %s", exc.response.status_code, exc.response.text)
755
+ except Exception as exc:
756
+ logger.error("Groq request failed: %s", exc)
757
+
758
+ return _plain_fallback(predictions, patient_name, patient_age, patient_sex, symptoms)
759
+
760
+
761
+ # ---------------------------------------------------------------------------
762
+ # Legacy shim — keeps existing views.py calls working
763
+ # ---------------------------------------------------------------------------
764
+ def generate_narrative(predictions: list[dict[str, Any]]) -> str:
765
+ """Deprecated shim. Use generate_clinical_response() instead."""
766
+ result = generate_clinical_response(predictions)
767
+ return result.get("referralNote") or result.get("recommendedAction", "")
768
+
769
+
770
+ # ---------------------------------------------------------------------------
771
+ # Offline fallback — uses CONDITION_MEDICATION_DB for real clinical data
772
+ # ---------------------------------------------------------------------------
773
+ def _plain_fallback(
774
+ predictions: list[dict[str, Any]],
775
+ patient_name: str = "",
776
+ patient_age: str = "",
777
+ patient_sex: str = "",
778
+ symptoms: str = "",
779
+ ) -> dict[str, Any]:
780
+ """
781
+ Returns a valid structured dict when Groq is unavailable.
782
+ Pulls from CONDITION_MEDICATION_DB for medically accurate content.
783
+ """
784
+ top = predictions[0]
785
+ top_label = top["label"]
786
+ top_confidence = round(top["confidence"] * 100)
787
+ condition_code = _derive_condition_code(top_label)
788
+
789
+ label_lower = top_label.lower()
790
+ if any(k in label_lower for k in [
791
+ "melanoma", "basal cell", "carcinoma", "vasculitis",
792
+ "lupus", "cellulitis", "bullous", "actinic"
793
+ ]):
794
+ urgency = "High"
795
+ urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
796
+ elif top_confidence >= 80:
797
+ urgency = "High"
798
+ urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
799
+ elif top_confidence >= 60:
800
+ urgency = "Moderate"
801
+ urgency_text = "Refer to clinic within 3 days."
802
+ else:
803
+ urgency = "Low"
804
+ urgency_text = "Monitor and review if symptoms persist beyond 2 weeks."
805
+
806
+ others = predictions[1:]
807
+ differential = ", ".join(
808
+ f"{p['label']} ({round(p['confidence'] * 100)}%)" for p in others
809
+ )
810
+
811
+ name_ref = patient_name or "the patient"
812
+ age_ref = f"{patient_age}-year-old" if patient_age else "adult"
813
+ sex_ref = patient_sex.lower() if patient_sex else "patient"
814
+ symptom_ref = symptoms or "the presenting lesion"
815
+
816
+ db_entry = _get_db_entry(top_label, condition_code)
817
+
818
+ if db_entry:
819
+ meds = db_entry.get("primary_medications", [])
820
+ primary_med = meds[0] if meds else None
821
+ dos = db_entry.get("dos", ["Keep area clean.", "Monitor for changes.", "Follow up as directed."])
822
+ donts = db_entry.get("donts", ["Do not scratch.", "Do not apply unverified home remedies."])
823
+ warning = db_entry.get("warning", "Follow standard clinical protocols.")
824
+
825
+ therapy_regimen = {
826
+ "medication": primary_med["name"] if primary_med else "Topical symptomatic relief",
827
+ "regimen": primary_med["dosage"] if primary_med else "Apply twice daily as directed",
828
+ "dosage": primary_med["dosage"] if primary_med else "As directed by clinician",
829
+ "contraindications": primary_med["contraindications"] if primary_med else "Consult prescriber",
830
+ "warningNote": warning,
831
+ } if primary_med else {
832
+ "medication": "Topical symptomatic relief",
833
+ "regimen": "Apply twice daily as needed",
834
+ "dosage": "Thin layer",
835
+ "contraindications": "Do not apply to broken skin",
836
+ "warningNote": warning,
837
+ }
838
+
839
+ treatment_notes = [
840
+ f"Apply {primary_med['name'] if primary_med else 'prescribed topical'} to {name_ref}'s affected area as directed — {primary_med['dosage'] if primary_med else 'twice daily'}.",
841
+ f"For this {age_ref} {sex_ref} presenting with {symptom_ref}: ensure area is clean and dry before each medication application.",
842
+ f"Ensure {name_ref} understands the full treatment course duration for {top_label} — do not stop early even if symptoms improve.",
843
+ ]
844
+ else:
845
+ therapy_regimen = {
846
+ "medication": "Topical symptomatic relief",
847
+ "regimen": "Apply twice daily as needed",
848
+ "dosage": "Thin layer to affected area",
849
+ "contraindications": "Do not apply to broken skin",
850
+ "warningNote": "Consult a qualified clinician for specific guidance on this condition.",
851
+ }
852
+ dos = ["Keep affected area clean and dry.", "Monitor for changes in size or appearance.", "Follow up at the nearest clinic if symptoms worsen."]
853
+ donts = ["Do not scratch or pick at the lesion.", "Do not apply unverified home remedies."]
854
+ treatment_notes = [
855
+ f"Keep {name_ref}'s affected area clean and dry, and monitor for any changes in size, colour, or texture.",
856
+ f"Avoid scratching or picking at the lesion — advise {name_ref} to cover it with a clean, non-adhesive dressing.",
857
+ f"Follow up at the nearest clinic if {symptom_ref} worsens or does not improve within 2 weeks.",
858
+ ]
859
+
860
+ return {
861
+ "primaryFinding": top_label,
862
+ "confidence": top_confidence,
863
+ "urgency": urgency,
864
+ "urgencyText": urgency_text,
865
+ "treatmentNotes": treatment_notes,
866
+ "therapyRegimen": therapy_regimen,
867
+ "patientHandout": {
868
+ "dos": dos,
869
+ "donts": donts,
870
+ },
871
+ "recommendedAction": (
872
+ f"Refer {name_ref} to the District Hospital Dermatology Unit for clinical assessment of {top_label}."
873
+ ),
874
+ "referralNote": (
875
+ f"**Clinical Indication:**\n\n"
876
+ f"{name_ref} ({age_ref} {sex_ref}) presented with {symptom_ref} consistent with {top_label}.\n\n"
877
+ f"**Technique:**\n\n"
878
+ f"Clinical photography and DermaVision AI skin analysis system (DINOv2-based) were utilised for assessment.\n\n"
879
+ f"**Findings:**\n\n"
880
+ f"The DermaVision AI system identified {top_label} as the primary diagnosis with {top_confidence}% model confidence. "
881
+ f"Differential considerations include: {differential}.\n\n"
882
+ f"**Impression:**\n\n"
883
+ f"Findings are consistent with {top_label} based on visual lesion characteristics. "
884
+ f"Triage urgency has been classified as {urgency}.\n\n"
885
+ f"**Recommendation:**\n\n"
886
+ f"Clinical correlation and specialist review are strongly recommended. "
887
+ f"{urgency_text} Refer to the District Hospital Dermatology Unit for confirmation and initiation of definitive treatment."
888
+ ),
889
+ "conditionCode": condition_code,
890
+ }
backend/api/inference.py ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ DermaVision inference engine.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import io
8
+ import logging
9
+ import threading
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ import numpy as np
14
+ import onnxruntime as ort
15
+ from django.conf import settings
16
+ from PIL import Image
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ _MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32)
21
+ _STD = np.array([0.229, 0.224, 0.225], dtype=np.float32)
22
+ _SIZE = 224
23
+
24
+ LABEL_MAP: dict[int, str] = {
25
+ 0: "Acne and Rosacea",
26
+ 1: "Actinic Keratosis Basal Cell Carcinoma",
27
+ 2: "Atopic Dermatitis",
28
+ 3: "Bullous Disease",
29
+ 4: "Cellulitis Impetigo",
30
+ 5: "Eczema",
31
+ 6: "Exanthems and Drug Eruptions",
32
+ 7: "Hair Loss Alopecia",
33
+ 8: "Herpes HPV and STDs",
34
+ 9: "Light Diseases and Pigmentation Disorders",
35
+ 10: "Lupus and Connective Tissue Diseases",
36
+ 11: "Melanoma Skin Cancer Nevi and Moles",
37
+ 12: "Nail Fungus and Nail Disease",
38
+ 13: "Poison Ivy and Contact Dermatitis",
39
+ 14: "Psoriasis Lichen Planus",
40
+ 15: "Scabies Lyme Disease and Infestations",
41
+ 16: "Seborrheic Keratoses",
42
+ 17: "Systemic Disease",
43
+ 18: "Tinea Ringworm Candidiasis",
44
+ 19: "Urticaria Hives",
45
+ 20: "Vascular Tumors",
46
+ 21: "Vasculitis",
47
+ 22: "Warts Molluscum and Viral Infections",
48
+ }
49
+
50
+ TOP_K = 3
51
+
52
+
53
+ class _InferenceEngine:
54
+
55
+ _lock = threading.Lock()
56
+ _instance = None
57
+
58
+ def __init__(self) -> None:
59
+ self._session: ort.InferenceSession | None = None
60
+
61
+ def _load(self) -> None:
62
+ model_path = Path(settings.MODEL_PATH)
63
+ if not model_path.exists():
64
+ raise FileNotFoundError(
65
+ f"ONNX model not found at {model_path}. "
66
+ "Place dermavision.onnx in the model/ directory."
67
+ )
68
+
69
+ logger.info("Loading DermaVision ONNX model from %s ...", model_path)
70
+ opts = ort.SessionOptions()
71
+ opts.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
72
+ opts.intra_op_num_threads = 4
73
+
74
+ providers = (
75
+ ["CUDAExecutionProvider", "CPUExecutionProvider"]
76
+ if "CUDAExecutionProvider" in ort.get_available_providers()
77
+ else ["CPUExecutionProvider"]
78
+ )
79
+
80
+ self._session = ort.InferenceSession(str(model_path), opts, providers=providers)
81
+ logger.info("Model ready — providers: %s", self._session.get_providers())
82
+
83
+ @property
84
+ def ready(self) -> bool:
85
+ return self._session is not None
86
+
87
+ def ensure_loaded(self) -> None:
88
+ if not self.ready:
89
+ with self._lock:
90
+ if not self.ready:
91
+ self._load()
92
+
93
+ def preprocess(self, image_bytes: bytes) -> tuple[np.ndarray, tuple[int, int]]:
94
+ img = Image.open(io.BytesIO(image_bytes)).convert("RGB")
95
+ original_size = img.size
96
+
97
+ w, h = img.size
98
+ scale = 256 / min(w, h)
99
+ img = img.resize((int(w * scale), int(h * scale)), Image.BICUBIC)
100
+
101
+ w, h = img.size
102
+ left = (w - _SIZE) // 2
103
+ top = (h - _SIZE) // 2
104
+ img = img.crop((left, top, left + _SIZE, top + _SIZE))
105
+
106
+ arr = np.array(img, dtype=np.float32) / 255.0
107
+ arr = (arr - _MEAN) / _STD
108
+ arr = arr.transpose(2, 0, 1)[np.newaxis]
109
+
110
+ return arr.astype(np.float32), original_size
111
+
112
+ def predict(self, pixel_values: np.ndarray) -> np.ndarray:
113
+ outputs = self._session.run(
114
+ ["logits"],
115
+ {"pixel_values": pixel_values},
116
+ )
117
+ return outputs[0]
118
+
119
+ @staticmethod
120
+ def top_k_predictions(logits: np.ndarray, k: int = TOP_K) -> list[dict[str, Any]]:
121
+ logits_1d = logits[0]
122
+ exp_logits = np.exp(logits_1d - logits_1d.max())
123
+ probs = exp_logits / exp_logits.sum()
124
+
125
+ top_indices = np.argsort(probs)[::-1][:k]
126
+ return [
127
+ {
128
+ "label": LABEL_MAP.get(int(i), f"class_{i}"),
129
+ "confidence": round(float(probs[i]), 4),
130
+ }
131
+ for i in top_indices
132
+ ]
133
+
134
+ @staticmethod
135
+ def attention_heatmap(
136
+ pixel_values: np.ndarray,
137
+ original_size: tuple[int, int],
138
+ logits: np.ndarray,
139
+ ) -> str | None:
140
+ try:
141
+ import base64
142
+ import cv2
143
+
144
+ import concurrent.futures
145
+
146
+ top_class = int(np.argmax(logits[0]))
147
+ w, h = original_size
148
+ ph = pw = _SIZE // 14
149
+
150
+ importance = np.zeros((ph, pw), dtype=np.float32)
151
+
152
+ def process_patch(row, col):
153
+ r0, r1 = row * 14, (row + 1) * 14
154
+ c0, c1 = col * 14, (col + 1) * 14
155
+ masked = pixel_values.copy()
156
+ masked[:, :, r0:r1, c0:c1] = 0.0
157
+ masked_logits = _engine._session.run(
158
+ ["logits"], {"pixel_values": masked}
159
+ )[0]
160
+ return row, col, float(logits[0][top_class] - masked_logits[0][top_class])
161
+
162
+ with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
163
+ futures = [
164
+ executor.submit(process_patch, r, c)
165
+ for r in range(ph) for c in range(pw)
166
+ ]
167
+ for future in concurrent.futures.as_completed(futures):
168
+ r, c, val = future.result()
169
+ importance[r, c] = val
170
+
171
+ importance = np.maximum(importance, 0)
172
+ if importance.max() > 0:
173
+ importance /= importance.max()
174
+
175
+ cam = cv2.resize(importance, (w, h), interpolation=cv2.INTER_CUBIC)
176
+ cam = np.uint8(255 * cam)
177
+ heatmap = cv2.applyColorMap(cam, cv2.COLORMAP_JET)
178
+
179
+ _, buf = cv2.imencode(".png", heatmap)
180
+ return base64.b64encode(buf.tobytes()).decode()
181
+
182
+ except Exception as exc:
183
+ logger.warning("Heatmap generation failed: %s", exc)
184
+ return None
185
+
186
+
187
+ _engine = _InferenceEngine()
188
+
189
+
190
+ def run_inference(image_bytes: bytes, include_heatmap: bool = True) -> dict[str, Any]:
191
+ _engine.ensure_loaded()
192
+
193
+ pixel_values, original_size = _engine.preprocess(image_bytes)
194
+ logits = _engine.predict(pixel_values)
195
+ predictions = _engine.top_k_predictions(logits)
196
+
197
+ heatmap_b64 = (
198
+ _engine.attention_heatmap(pixel_values, original_size, logits)
199
+ if include_heatmap
200
+ else None
201
+ )
202
+
203
+ return {
204
+ "predictions": predictions,
205
+ "heatmap_b64": heatmap_b64,
206
+ }
207
+
208
+
209
+ def model_ready() -> bool:
210
+ return _engine.ready
backend/api/pdf_generator.py ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ import base64
3
+ import re
4
+ from datetime import datetime
5
+ import qrcode
6
+
7
+ from reportlab.lib.pagesizes import A4
8
+ from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
9
+ from reportlab.lib.units import cm
10
+ from reportlab.lib import colors
11
+ from reportlab.platypus import (
12
+ SimpleDocTemplate, Paragraph, Spacer,
13
+ Table, TableStyle, Image as RLImage, HRFlowable
14
+ )
15
+ from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
16
+
17
+ PAGE_W, PAGE_H = A4
18
+ MARGIN = 2 * cm
19
+
20
+ # DermaDetect Branding Colors
21
+ C_BLUE = colors.HexColor('#0077b6')
22
+ LIGHT_BLUE = colors.HexColor('#e0f2fe')
23
+ DARK = colors.HexColor('#181c1e')
24
+ GRAY = colors.HexColor('#555f71')
25
+ LIGHT_GRAY = colors.HexColor('#bccac1')
26
+
27
+
28
+ def _markdown_to_rl(text: str) -> str:
29
+ """Very basic markdown to ReportLab HTML conversion."""
30
+ if not text:
31
+ return ""
32
+ # Convert **bold** to <b>bold</b>
33
+ text = re.sub(r'\*\*(.*?)\*\*', r'<b>\1</b>', text)
34
+ # Convert newlines
35
+ text = text.replace('\n', '<br/>')
36
+ return text
37
+
38
+
39
+ def build_pdf(
40
+ case_id: str,
41
+ patient: dict,
42
+ clinical: dict,
43
+ images: dict
44
+ ) -> str:
45
+ """
46
+ Builds the DermaDetect PDF report.
47
+ Returns base64-encoded PDF string.
48
+ """
49
+ buf = io.BytesIO()
50
+ doc = SimpleDocTemplate(
51
+ buf,
52
+ pagesize=A4,
53
+ leftMargin=MARGIN, rightMargin=MARGIN,
54
+ topMargin=MARGIN, bottomMargin=MARGIN,
55
+ )
56
+
57
+ styles = _build_styles()
58
+ story = []
59
+
60
+ # ── Header ──────────────────────────────────────────────────────
61
+ story.append(Paragraph("DermaDetect", styles['title']))
62
+ story.append(Paragraph("AI-Assisted Dermatology Analysis Report", styles['subtitle']))
63
+ story.append(Paragraph(
64
+ f"Generated: {datetime.utcnow().strftime('%Y-%m-%d %H:%M UTC')} | Case ID: {case_id}",
65
+ styles['meta']
66
+ ))
67
+ story.append(HRFlowable(width="100%", thickness=1, color=C_BLUE, spaceAfter=12))
68
+
69
+ # ── Patient Context ──────────────────────────────────────────────
70
+ p_name = patient.get('name', 'Unknown Patient')
71
+ p_age = patient.get('age', 'N/A')
72
+ p_sex = patient.get('sex', 'N/A')
73
+ story.append(Paragraph(f"<b>Patient:</b> {p_name} | <b>Age:</b> {p_age} | <b>Sex:</b> {p_sex}", styles['body']))
74
+ story.append(Spacer(1, 12))
75
+
76
+ # ── Prediction summary table ─────────────────────────────────────
77
+ story.append(Paragraph("AI Triage Summary", styles['section']))
78
+ story.append(Spacer(1, 6))
79
+
80
+ primary_finding = clinical.get('primaryFinding', 'Unknown')
81
+ confidence = clinical.get('confidence', 0)
82
+ urgency = clinical.get('urgency', 'Unknown')
83
+
84
+ summary_data = [
85
+ ['Primary Finding', 'Confidence', 'Urgency Level'],
86
+ [primary_finding, f"{confidence}%", urgency.upper()],
87
+ ]
88
+
89
+ table = Table(summary_data, colWidths=[7*cm, 4*cm, 5*cm])
90
+ table.setStyle(TableStyle([
91
+ ('BACKGROUND', (0,0), (-1,0), C_BLUE),
92
+ ('TEXTCOLOR', (0,0), (-1,0), colors.white),
93
+ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
94
+ ('FONTSIZE', (0,0), (-1,0), 10),
95
+ ('BACKGROUND', (0,1), (-1,-1), LIGHT_BLUE),
96
+ ('FONTSIZE', (0,1), (-1,-1), 10),
97
+ ('ALIGN', (0,0), (-1,-1), 'CENTER'),
98
+ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
99
+ ('ROWHEIGHT', (0,0), (-1,-1), 22),
100
+ ('GRID', (0,0), (-1,-1), 0.5, C_BLUE),
101
+ ]))
102
+ story.append(table)
103
+ story.append(Spacer(1, 16))
104
+
105
+ # ── Images ──────────────────────────────────────────────────────
106
+ story.append(Paragraph("Visual Analysis", styles['section']))
107
+ story.append(Spacer(1, 6))
108
+
109
+ img_row = []
110
+ img_labels = []
111
+
112
+ for key, label in [
113
+ ('original_b64', 'Original Lesion'),
114
+ ('heatmap_b64', 'AI Saliency Map'),
115
+ ]:
116
+ b64 = images.get(key)
117
+ if b64:
118
+ # Strip data URI scheme if present
119
+ if b64.startswith("data:"):
120
+ b64 = b64.split(",")[1]
121
+ try:
122
+ img_buf = io.BytesIO(base64.b64decode(b64))
123
+ rl_img = RLImage(img_buf, width=6*cm, height=6*cm)
124
+ img_row.append(rl_img)
125
+ img_labels.append(label)
126
+ except Exception:
127
+ pass
128
+
129
+ if img_row:
130
+ img_table = Table(
131
+ [img_row, [Paragraph(l, styles['img_label']) for l in img_labels]],
132
+ colWidths=[6.5*cm] * len(img_row)
133
+ )
134
+ img_table.setStyle(TableStyle([
135
+ ('ALIGN', (0,0), (-1,-1), 'CENTER'),
136
+ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
137
+ ]))
138
+ story.append(img_table)
139
+ story.append(Spacer(1, 16))
140
+
141
+ # ── Clinical report sections ──────────────────────────────────────
142
+ story.append(HRFlowable(width="100%", thickness=0.5, color=LIGHT_GRAY, spaceAfter=8))
143
+ story.append(Paragraph("AI Clinical Evaluation", styles['section']))
144
+ story.append(Spacer(1, 6))
145
+
146
+ referral_note = clinical.get('referralNote', '')
147
+ if referral_note:
148
+ html_note = _markdown_to_rl(referral_note)
149
+ for part in html_note.split('<br/>'):
150
+ if part.strip():
151
+ story.append(Paragraph(part.strip(), styles['body']))
152
+ story.append(Spacer(1, 4))
153
+
154
+ story.append(Spacer(1, 12))
155
+
156
+ # Treatment Notes (Legacy)
157
+ t_notes = clinical.get('treatmentNotes', [])
158
+ if t_notes:
159
+ story.append(Paragraph("Treatment Action Plan", styles['subsection']))
160
+ for note in t_notes:
161
+ story.append(Paragraph(f"• {note}", styles['body_bullet']))
162
+ story.append(Spacer(1, 8))
163
+
164
+ # Therapy Regimen
165
+ regimen = clinical.get('therapyRegimen', {})
166
+ if regimen:
167
+ story.append(Paragraph("Prescribed Therapy Regimen", styles['subsection']))
168
+ story.append(Paragraph(f"<b>Medication:</b> {regimen.get('medication', 'N/A')}", styles['body']))
169
+ story.append(Paragraph(f"<b>Dosage:</b> {regimen.get('dosage', 'N/A')}", styles['body']))
170
+ story.append(Paragraph(f"<b>Duration:</b> {regimen.get('duration', 'N/A')}", styles['body']))
171
+ story.append(Paragraph(f"<b>Instructions:</b> {regimen.get('instructions', 'N/A')}", styles['body']))
172
+ story.append(Spacer(1, 8))
173
+
174
+ # Patient Handout (Dos and Don'ts)
175
+ handout = clinical.get('patientHandout', {})
176
+ if handout:
177
+ story.append(Paragraph("Patient Handout", styles['subsection']))
178
+ dos = handout.get('dos', [])
179
+ donts = handout.get('donts', [])
180
+ if dos:
181
+ story.append(Paragraph("<b>Do's:</b>", styles['body']))
182
+ for item in dos:
183
+ story.append(Paragraph(f"• {item}", styles['body_bullet']))
184
+ if donts:
185
+ story.append(Paragraph("<b>Don'ts:</b>", styles['body']))
186
+ for item in donts:
187
+ story.append(Paragraph(f"• {item}", styles['body_bullet']))
188
+ story.append(Spacer(1, 8))
189
+
190
+ # Recommended Action
191
+ action = clinical.get('recommendedAction', '')
192
+ if action:
193
+ story.append(Paragraph("Recommended Action", styles['subsection']))
194
+ story.append(Paragraph(action, styles['body']))
195
+ story.append(Spacer(1, 8))
196
+
197
+ # ── Footer / Signature ─────────────────────────────────────────────
198
+ # Push to bottom visually
199
+ story.append(Spacer(1, 24))
200
+ story.append(HRFlowable(width="100%", thickness=0.5, color=LIGHT_GRAY, spaceBefore=12, spaceAfter=12))
201
+
202
+ # Generate QR Code
203
+ qr = qrcode.QRCode(box_size=3, border=1)
204
+ qr.add_data(f"https://secure.dermadetect.app/verify/{case_id}")
205
+ qr.make(fit=True)
206
+ qr_img = qr.make_image(fill_color="black", back_color="white")
207
+
208
+ qr_buf = io.BytesIO()
209
+ qr_img.save(qr_buf, format="PNG")
210
+ qr_buf.seek(0)
211
+ rl_qr = RLImage(qr_buf, width=2.5*cm, height=2.5*cm)
212
+
213
+ hw_name = patient.get('healthWorkerName') or 'K. Mensah'
214
+
215
+ sig_cell = Paragraph(
216
+ f"<font color='#555f71' size=8><i>Digital Verified Signature</i></font><br/><br/>"
217
+ f"<font size=14><b>{hw_name}</b></font><br/>"
218
+ f"<font color='#181c1e'>________________________</font>",
219
+ styles['body']
220
+ )
221
+
222
+ qr_text = Paragraph(
223
+ "<font size=7 color='#3d4943'><b>Verify on<br/>DermaDetect Secure<br/>Web Cloud</b></font>",
224
+ styles['body']
225
+ )
226
+
227
+ sig_table = Table([[sig_cell, rl_qr, qr_text]], colWidths=[10*cm, 3*cm, 3.5*cm])
228
+ sig_table.setStyle(TableStyle([
229
+ ('ALIGN', (0,0), (0,0), 'LEFT'),
230
+ ('ALIGN', (1,0), (2,0), 'RIGHT'),
231
+ ('VALIGN', (0,0), (-1,-1), 'BOTTOM'),
232
+ ]))
233
+ story.append(sig_table)
234
+
235
+ story.append(Spacer(1, 12))
236
+ story.append(Paragraph(
237
+ "Disclaimer: This assessment is AI-assisted using the advanced <b>DermaVision</b> language model "
238
+ "developed by <b>PreWorks</b>. It is intended to support, not replace, clinical judgment "
239
+ "by a qualified healthcare professional.",
240
+ styles['disclaimer']
241
+ ))
242
+
243
+ doc.build(story)
244
+ return base64.b64encode(buf.getvalue()).decode('utf-8')
245
+
246
+
247
+ def _build_styles() -> dict:
248
+ base = getSampleStyleSheet()
249
+ return {
250
+ 'title': ParagraphStyle('title',
251
+ fontSize=22, fontName='Helvetica-Bold',
252
+ textColor=C_BLUE, alignment=TA_CENTER, spaceAfter=4, leading=26),
253
+ 'subtitle': ParagraphStyle('subtitle',
254
+ fontSize=11, fontName='Helvetica',
255
+ textColor=DARK, alignment=TA_CENTER, spaceAfter=2, leading=14),
256
+ 'meta': ParagraphStyle('meta',
257
+ fontSize=8, fontName='Helvetica',
258
+ textColor=GRAY, alignment=TA_CENTER, spaceAfter=10, leading=10),
259
+ 'section': ParagraphStyle('section',
260
+ fontSize=13, fontName='Helvetica-Bold',
261
+ textColor=C_BLUE, spaceAfter=8, leading=16),
262
+ 'subsection': ParagraphStyle('subsection',
263
+ fontSize=11, fontName='Helvetica-Bold',
264
+ textColor=DARK, spaceAfter=4, leading=14),
265
+ 'body': ParagraphStyle('body',
266
+ fontSize=10, fontName='Helvetica',
267
+ textColor=DARK, leading=14, alignment=TA_LEFT),
268
+ 'body_bullet': ParagraphStyle('body_bullet',
269
+ fontSize=10, fontName='Helvetica',
270
+ textColor=DARK, leading=14, alignment=TA_LEFT, leftIndent=12),
271
+ 'img_label': ParagraphStyle('img_label',
272
+ fontSize=8, fontName='Helvetica-Bold',
273
+ textColor=GRAY, alignment=TA_CENTER),
274
+ 'disclaimer': ParagraphStyle('disclaimer',
275
+ fontSize=8, fontName='Helvetica',
276
+ textColor=GRAY, alignment=TA_CENTER),
277
+ }
backend/api/serializers.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from rest_framework import serializers
2
+
3
+
4
+ class PredictionSerializer(serializers.Serializer):
5
+ label = serializers.CharField()
6
+ confidence = serializers.FloatField()
7
+
8
+
9
+ class AnalyseRequestSerializer(serializers.Serializer):
10
+ image = serializers.ImageField()
11
+ include_heatmap = serializers.BooleanField(default=False)
12
+ include_narrative = serializers.BooleanField(default=True)
13
+
14
+ # Patient context — all optional, forwarded to Groq prompt
15
+ # Parsed directly from request.data in views.py (not validated here
16
+ # because they are plain strings and always safe to default to "")
17
+ # Listed here for documentation purposes only.
18
+
19
+
20
+ class AnalyseResponseSerializer(serializers.Serializer):
21
+ # Structured clinical fields — written by Groq
22
+ primaryFinding = serializers.CharField()
23
+ confidence = serializers.IntegerField()
24
+ urgency = serializers.ChoiceField(choices=["High", "Moderate", "Low"])
25
+ urgencyText = serializers.CharField()
26
+ treatmentNotes = serializers.ListField(child=serializers.CharField())
27
+ recommendedAction = serializers.CharField()
28
+ referralNote = serializers.CharField()
29
+ conditionCode = serializers.CharField()
30
+
31
+ # Raw model output
32
+ allPredictions = PredictionSerializer(many=True)
33
+ heatmap_b64 = serializers.CharField(allow_null=True)
34
+ model_version = serializers.CharField()
backend/api/urls.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ from django.urls import path
2
+ from .views import AnalyseView, HealthView, GeneratePdfView
3
+
4
+ urlpatterns = [
5
+ path('health', HealthView.as_view(), name='health'),
6
+ path('analyse', AnalyseView.as_view(), name='analyse'),
7
+ path('pdf', GeneratePdfView.as_view(), name='pdf'),
8
+ ]
backend/api/views.py ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ from rest_framework import status
6
+ from rest_framework.parsers import MultiPartParser, JSONParser
7
+ from rest_framework.request import Request
8
+ from rest_framework.response import Response
9
+ from rest_framework.views import APIView
10
+
11
+ from .groq_client import generate_clinical_response
12
+ from .inference import model_ready, run_inference
13
+ from .serializers import AnalyseRequestSerializer
14
+ from .pdf_generator import build_pdf
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ MODEL_VERSION = "dermavision-dinov2-v1"
19
+
20
+
21
+ class HealthView(APIView):
22
+ """GET /health — liveness + model readiness probe."""
23
+
24
+ def get(self, request: Request) -> Response:
25
+ return Response({
26
+ "status": "ok",
27
+ "model_loaded": model_ready(),
28
+ "model_version": MODEL_VERSION,
29
+ })
30
+
31
+
32
+ class AnalyseView(APIView):
33
+ """
34
+ POST /analyse
35
+ Multipart fields:
36
+ image (required) — skin lesion image file
37
+ include_heatmap (bool, default False)
38
+ include_narrative (bool, default True)
39
+ patient_name (str, optional)
40
+ patient_age (str, optional)
41
+ patient_sex (str, optional)
42
+ symptoms (str, optional)
43
+
44
+ Returns the full structured clinical response the frontend needs directly —
45
+ primaryFinding, confidence, urgency, urgencyText, treatmentNotes,
46
+ recommendedAction, referralNote, conditionCode, predictions, model_version.
47
+ """
48
+
49
+ parser_classes = [MultiPartParser, JSONParser]
50
+
51
+ def post(self, request: Request) -> Response:
52
+ serializer = AnalyseRequestSerializer(data=request.data)
53
+ if not serializer.is_valid():
54
+ return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
55
+
56
+ image_file = serializer.validated_data["image"]
57
+ include_heatmap = serializer.validated_data["include_heatmap"]
58
+ include_narrative = serializer.validated_data["include_narrative"]
59
+
60
+ # Patient context — all optional, passed through to Groq prompt
61
+ patient_name = request.data.get("patient_name", "").strip()
62
+ patient_age = request.data.get("patient_age", "").strip()
63
+ patient_sex = request.data.get("patient_sex", "").strip()
64
+ symptoms = request.data.get("symptoms", "").strip()
65
+
66
+ image_bytes = image_file.read()
67
+
68
+ # --- Run ONNX inference ---
69
+ try:
70
+ inference_result = run_inference(image_bytes, include_heatmap=include_heatmap)
71
+ except FileNotFoundError as exc:
72
+ logger.error("Model not found: %s", exc)
73
+ return Response(
74
+ {"error": "Model not loaded. Please contact the administrator."},
75
+ status=status.HTTP_503_SERVICE_UNAVAILABLE,
76
+ )
77
+ except Exception as exc:
78
+ logger.exception("Inference error: %s", exc)
79
+ return Response(
80
+ {"error": "Inference failed. Check server logs."},
81
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
82
+ )
83
+
84
+ predictions = inference_result["predictions"] # top-3 [{label, confidence}]
85
+ heatmap_b64 = inference_result["heatmap_b64"]
86
+
87
+ # --- Generate structured clinical response via Groq ---
88
+ clinical = {}
89
+ if include_narrative:
90
+ try:
91
+ clinical = generate_clinical_response(
92
+ predictions=predictions,
93
+ patient_name=patient_name,
94
+ patient_age=patient_age,
95
+ patient_sex=patient_sex,
96
+ symptoms=symptoms,
97
+ )
98
+ except Exception as exc:
99
+ logger.warning("Clinical response generation failed: %s", exc)
100
+
101
+ # --- Build final response ---
102
+ # clinical already contains all frontend fields.
103
+ # We add predictions + heatmap + model_version on top.
104
+ response_data = {
105
+ # Full structured fields from Groq (or fallback)
106
+ "primaryFinding": clinical.get("primaryFinding", predictions[0]["label"]),
107
+ "confidence": clinical.get("confidence", round(predictions[0]["confidence"] * 100)),
108
+ "urgency": clinical.get("urgency", "Moderate"),
109
+ "urgencyText": clinical.get("urgencyText", "Refer to clinic within 3 days."),
110
+ "treatmentNotes": clinical.get("treatmentNotes", []),
111
+ "recommendedAction": clinical.get("recommendedAction", "Refer to appropriate specialist."),
112
+ "referralNote": clinical.get("referralNote", ""),
113
+ "conditionCode": clinical.get("conditionCode", "ringworm"),
114
+ "therapyRegimen": clinical.get("therapyRegimen", {}),
115
+ "patientHandout": clinical.get("patientHandout", {}),
116
+
117
+ # Raw model output — kept so frontend can show differential runner-ups
118
+ "allPredictions": predictions,
119
+ "heatmap_b64": heatmap_b64,
120
+ "model_version": MODEL_VERSION,
121
+ }
122
+
123
+ logger.info(
124
+ "Analyse complete — patient: %s | finding: %s | urgency: %s",
125
+ patient_name or "anonymous",
126
+ response_data["primaryFinding"],
127
+ response_data["urgency"],
128
+ )
129
+
130
+ return Response(response_data, status=status.HTTP_200_OK)
131
+
132
+
133
+ class GeneratePdfView(APIView):
134
+ """
135
+ POST /pdf
136
+ Expects a JSON payload containing:
137
+ - case_id
138
+ - patient (dict with name, age, sex, symptoms, healthWorkerName)
139
+ - clinical (dict with primaryFinding, confidence, urgency, referralNote, treatmentNotes)
140
+ - images (dict with original_b64, heatmap_b64)
141
+ """
142
+ parser_classes = [JSONParser]
143
+
144
+ def post(self, request: Request) -> Response:
145
+ try:
146
+ data = request.data
147
+ case_id = data.get("case_id", "NEW-CASE")
148
+ patient = data.get("patient", {})
149
+ clinical = data.get("clinical", {})
150
+ images = data.get("images", {})
151
+
152
+ pdf_b64 = build_pdf(case_id, patient, clinical, images)
153
+
154
+ return Response({"pdf_b64": pdf_b64}, status=status.HTTP_200_OK)
155
+ except Exception as exc:
156
+ logger.exception("Failed to generate PDF: %s", exc)
157
+ return Response({"error": str(exc)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
backend/core/__init__.py ADDED
File without changes
backend/core/settings.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pathlib import Path
2
+ import os
3
+ from dotenv import load_dotenv
4
+
5
+ load_dotenv()
6
+
7
+ BASE_DIR = Path(__file__).resolve().parent.parent
8
+ SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production')
9
+ DEBUG = os.environ.get('DEBUG', 'False') == 'True'
10
+ ALLOWED_HOSTS = ['*']
11
+
12
+ INSTALLED_APPS = [
13
+ 'django.contrib.contenttypes',
14
+ 'django.contrib.auth',
15
+ 'django.contrib.staticfiles',
16
+ 'rest_framework',
17
+ 'api',
18
+ 'corsheaders',
19
+ ]
20
+
21
+ MIDDLEWARE = [
22
+ 'corsheaders.middleware.CorsMiddleware',
23
+ 'django.middleware.security.SecurityMiddleware',
24
+ 'whitenoise.middleware.WhiteNoiseMiddleware',
25
+ 'django.middleware.common.CommonMiddleware',
26
+ ]
27
+
28
+ ROOT_URLCONF = 'core.urls'
29
+
30
+ TEMPLATES = [{
31
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
32
+ 'DIRS': [BASE_DIR / 'templates'] if (BASE_DIR / 'templates').exists() else [],
33
+ 'APP_DIRS': True,
34
+ 'OPTIONS': {
35
+ 'context_processors': [
36
+ 'django.template.context_processors.request',
37
+ ],
38
+ },
39
+ }]
40
+
41
+ WSGI_APPLICATION = 'core.wsgi.application'
42
+ DATABASES = {}
43
+
44
+ STATIC_URL = '/static/'
45
+ STATICFILES_DIRS = [BASE_DIR / 'static'] if (BASE_DIR / 'static').exists() else []
46
+
47
+ STATIC_ROOT = BASE_DIR / 'staticfiles'
48
+ STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
49
+
50
+ REST_FRAMEWORK = {
51
+ 'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer'],
52
+ 'DEFAULT_PARSER_CLASSES': [
53
+ 'rest_framework.parsers.MultiPartParser',
54
+ 'rest_framework.parsers.JSONParser',
55
+ ],
56
+ }
57
+
58
+ MODEL_PATH = BASE_DIR / 'model' / 'dermavision.onnx'
59
+ GROQ_API_KEY = os.environ.get('GROQ_API_KEY', '')
60
+ DATA_UPLOAD_MAX_MEMORY_SIZE = 20 * 1024 * 1024
61
+ CORS_ALLOW_ALL_ORIGINS = True # tighten this when deploying
backend/core/urls.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ from django.urls import path, include
2
+
3
+ urlpatterns = [
4
+ path('', include('api.urls')),
5
+ ]
backend/core/wsgi.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import os
2
+ from django.core.wsgi import get_wsgi_application
3
+
4
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
5
+ application = get_wsgi_application()
backend/manage.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ import os
3
+ import sys
4
+
5
+ def main():
6
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
7
+ from django.core.management import execute_from_command_line
8
+ execute_from_command_line(sys.argv)
9
+
10
+ if __name__ == '__main__':
11
+ main()
backend/requirements.txt ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Web framework
2
+ django>=4.2,<5.0
3
+ djangorestframework>=3.15
4
+ whitenoise>=6.6
5
+
6
+ # Inference
7
+ onnxruntime>=1.18 # use onnxruntime-gpu if CUDA available
8
+ transformers>=4.40 # AutoImageProcessor, AutoModelForImageClassification
9
+ Pillow>=10.0
10
+ numpy>=1.26
11
+ opencv-python-headless>=4.9 # heatmap generation (no GUI deps)
12
+
13
+ # LLM narrative
14
+ httpx>=0.27
15
+
16
+ # Config
17
+ python-dotenv>=1.0
18
+ reportlab
19
+ qrcode[pil]
backend/scripts/export_onnx.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """
3
+ Export Jayanth2002/dinov2-base-finetuned-SkinDisease to ONNX.
4
+
5
+ Usage:
6
+ python scripts/export_onnx.py [--output model/dermavision.onnx]
7
+
8
+ Requirements (run once, not in production image):
9
+ pip install torch transformers onnx onnxruntime pillow
10
+ """
11
+
12
+ import argparse
13
+ from pathlib import Path
14
+
15
+ import torch
16
+ from transformers import AutoImageProcessor, AutoModelForImageClassification
17
+ from PIL import Image
18
+ import numpy as np
19
+ import os
20
+
21
+
22
+ HF_MODEL_ID = "Jayanth2002/dinov2-base-finetuned-SkinDisease"
23
+
24
+
25
+ def export(output_path: Path) -> None:
26
+ output_path.parent.mkdir(parents=True, exist_ok=True)
27
+
28
+ print(f"Downloading {HF_MODEL_ID} …")
29
+ processor = AutoImageProcessor.from_pretrained(HF_MODEL_ID)
30
+ model = AutoModelForImageClassification.from_pretrained(HF_MODEL_ID)
31
+ model.eval()
32
+
33
+ print("Label map:")
34
+ for idx, label in model.config.id2label.items():
35
+ print(f" {idx}: {label}")
36
+ print(f"Num classes: {len(model.config.id2label)}")
37
+
38
+ # Dummy input — 224×224 RGB
39
+ dummy_img = Image.fromarray(np.zeros((224, 224, 3), dtype=np.uint8))
40
+ inputs = processor(images=dummy_img, return_tensors="pt")
41
+ pixel_values = inputs["pixel_values"] # [1, 3, 224, 224]
42
+
43
+ print(f"\nExporting to {output_path} …")
44
+ torch.onnx.export(
45
+ model,
46
+ pixel_values,
47
+ str(output_path),
48
+ export_params=True,
49
+ opset_version=14,
50
+ do_constant_folding=True,
51
+ input_names=["pixel_values"],
52
+ output_names=["logits"],
53
+ dynamic_axes={
54
+ "pixel_values": {0: "batch_size"},
55
+ "logits": {0: "batch_size"},
56
+ },
57
+ )
58
+
59
+ size_mb = os.path.getsize(output_path) / 1e6
60
+ print(f"✓ Exported: {output_path} ({size_mb:.1f} MB)")
61
+
62
+ # Quick sanity check
63
+ import onnxruntime as ort
64
+ sess = ort.InferenceSession(str(output_path), providers=["CPUExecutionProvider"])
65
+ out = sess.run(["logits"], {"pixel_values": pixel_values.numpy()})[0]
66
+ print(f"✓ Sanity check passed — logits shape: {out.shape}")
67
+
68
+
69
+ if __name__ == "__main__":
70
+ parser = argparse.ArgumentParser()
71
+ parser.add_argument(
72
+ "--output",
73
+ type=Path,
74
+ default=Path(__file__).resolve().parent.parent / "model" / "dermavision.onnx",
75
+ )
76
+ args = parser.parse_args()
77
+ export(args.output)
backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2019 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
6
+ /*# sourceMappingURL=bootstrap-theme.min.css.51806092cc05.map */
backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css.gz ADDED
Binary file (2.78 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2019 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
6
+ /*# sourceMappingURL=bootstrap-theme.min.css.map */
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;ACUA,YCWA,aDbA,UAFA,aACA,aAEA,aCkBE,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBF7CV,mBANA,mBACA,oBCWE,oBDRF,iBANA,iBAIA,oBANA,oBAOA,oBANA,oBAQA,oBANA,oBEmDE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBFpCV,qBAMA,sBCJE,sBDDF,uBAHA,mBAMA,oBARA,sBAMA,uBALA,sBAMA,uBAJA,sBAMA,uBAOA,+BALA,gCAGA,6BAFA,gCACA,gCAEA,gCEwBE,mBAAA,KACQ,WAAA,KFfV,mBCnCA,oBDiCA,iBAFA,oBACA,oBAEA,oBCXI,YAAA,KDgBJ,YCyBE,YAEE,iBAAA,KAKJ,aEvEI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QAyCA,YAAA,EAAA,IAAA,EAAA,KACA,aAAA,KDnBF,mBCrBE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDuBJ,oBCpBE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBD8BJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCdM,iBAAA,QACA,iBAAA,KAoBN,aE5EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDgEF,mBC9DE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDgEJ,oBC7DE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDuEJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCvDM,iBAAA,QACA,iBAAA,KAqBN,aE7EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDyGF,mBCvGE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDyGJ,oBCtGE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDgHJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCChGM,iBAAA,QACA,iBAAA,KAsBN,UE9EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDkJF,gBChJE,gBAEE,iBAAA,QACA,oBAAA,EAAA,MDkJJ,iBC/IE,iBAEE,iBAAA,QACA,aAAA,QAMA,mBDyJJ,0BANA,yBAGA,0BANA,yBAHA,yBAFA,oBAeA,2BANA,0BAGA,2BANA,0BAHA,0BAFA,6BAeA,oCANA,mCAGA,oCANA,mCAHA,mCCzIM,iBAAA,QACA,iBAAA,KAuBN,aE/EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QD2LF,mBCzLE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MD2LJ,oBCxLE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDkMJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCClLM,iBAAA,QACA,iBAAA,KAwBN,YEhFI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDoOF,kBClOE,kBAEE,iBAAA,QACA,oBAAA,EAAA,MDoOJ,mBCjOE,mBAEE,iBAAA,QACA,aAAA,QAMA,qBD2OJ,4BANA,2BAGA,4BANA,2BAHA,2BAFA,sBAeA,6BANA,4BAGA,6BANA,4BAHA,4BAFA,+BAeA,sCANA,qCAGA,sCANA,qCAHA,qCC3NM,iBAAA,QACA,iBAAA,KD2ON,eC5MA,WCtCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBFsPV,0BCvMA,0BEjGI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgGF,iBAAA,QAEF,yBD6MA,+BADA,+BGlTI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsGF,iBAAA,QASF,gBEnHI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHqIA,cAAA,ICrEA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBFuRV,sCCtNA,oCEnHI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD8EV,cDoNA,iBClNE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEtII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHwJA,cAAA,IDyNF,sCC5NA,oCEtII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDoFV,8BDuOA,iCC3NI,YAAA,EAAA,KAAA,EAAA,gBDgOJ,qBADA,kBC1NA,mBAGE,cAAA,EAIF,yBAEI,mDDwNF,yDADA,yDCpNI,MAAA,KEnKF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UF2KJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC/HA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBD0IV,eE5LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAKF,YE7LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAMF,eE9LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAOF,cE/LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAeF,UEvMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6MJ,cEjNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8MJ,sBElNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,mBEnNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgNJ,sBEpNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiNJ,qBErNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFqNJ,sBExLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKF+LJ,YACE,cAAA,IClLA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDoLV,wBDiQA,8BADA,8BC7PE,YAAA,EAAA,KAAA,EAAA,QEzOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuOF,aAAA,QALF,+BD6QA,qCADA,qCCpQI,YAAA,KAUJ,OCvME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBDgNV,8BElQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+PJ,8BEnQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgQJ,8BEpQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiQJ,2BErQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFkQJ,8BEtQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFmQJ,6BEvQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0QJ,ME9QI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4QF,aAAA,QC/NA,mBAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map.gz ADDED
Binary file (8.03 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.gz ADDED
Binary file (2.77 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;ACUA,YCWA,aDbA,UAFA,aACA,aAEA,aCkBE,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBF7CV,mBANA,mBACA,oBCWE,oBDRF,iBANA,iBAIA,oBANA,oBAOA,oBANA,oBAQA,oBANA,oBEmDE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBFpCV,qBAMA,sBCJE,sBDDF,uBAHA,mBAMA,oBARA,sBAMA,uBALA,sBAMA,uBAJA,sBAMA,uBAOA,+BALA,gCAGA,6BAFA,gCACA,gCAEA,gCEwBE,mBAAA,KACQ,WAAA,KFfV,mBCnCA,oBDiCA,iBAFA,oBACA,oBAEA,oBCXI,YAAA,KDgBJ,YCyBE,YAEE,iBAAA,KAKJ,aEvEI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QAyCA,YAAA,EAAA,IAAA,EAAA,KACA,aAAA,KDnBF,mBCrBE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDuBJ,oBCpBE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBD8BJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCdM,iBAAA,QACA,iBAAA,KAoBN,aE5EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDgEF,mBC9DE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDgEJ,oBC7DE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDuEJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCvDM,iBAAA,QACA,iBAAA,KAqBN,aE7EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDyGF,mBCvGE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDyGJ,oBCtGE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDgHJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCChGM,iBAAA,QACA,iBAAA,KAsBN,UE9EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDkJF,gBChJE,gBAEE,iBAAA,QACA,oBAAA,EAAA,MDkJJ,iBC/IE,iBAEE,iBAAA,QACA,aAAA,QAMA,mBDyJJ,0BANA,yBAGA,0BANA,yBAHA,yBAFA,oBAeA,2BANA,0BAGA,2BANA,0BAHA,0BAFA,6BAeA,oCANA,mCAGA,oCANA,mCAHA,mCCzIM,iBAAA,QACA,iBAAA,KAuBN,aE/EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QD2LF,mBCzLE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MD2LJ,oBCxLE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDkMJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCClLM,iBAAA,QACA,iBAAA,KAwBN,YEhFI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDoOF,kBClOE,kBAEE,iBAAA,QACA,oBAAA,EAAA,MDoOJ,mBCjOE,mBAEE,iBAAA,QACA,aAAA,QAMA,qBD2OJ,4BANA,2BAGA,4BANA,2BAHA,2BAFA,sBAeA,6BANA,4BAGA,6BANA,4BAHA,4BAFA,+BAeA,sCANA,qCAGA,sCANA,qCAHA,qCC3NM,iBAAA,QACA,iBAAA,KD2ON,eC5MA,WCtCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBFsPV,0BCvMA,0BEjGI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgGF,iBAAA,QAEF,yBD6MA,+BADA,+BGlTI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsGF,iBAAA,QASF,gBEnHI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHqIA,cAAA,ICrEA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBFuRV,sCCtNA,oCEnHI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD8EV,cDoNA,iBClNE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEtII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHwJA,cAAA,IDyNF,sCC5NA,oCEtII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDoFV,8BDuOA,iCC3NI,YAAA,EAAA,KAAA,EAAA,gBDgOJ,qBADA,kBC1NA,mBAGE,cAAA,EAIF,yBAEI,mDDwNF,yDADA,yDCpNI,MAAA,KEnKF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UF2KJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC/HA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBD0IV,eE5LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAKF,YE7LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAMF,eE9LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAOF,cE/LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAeF,UEvMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6MJ,cEjNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8MJ,sBElNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,mBEnNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgNJ,sBEpNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiNJ,qBErNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFqNJ,sBExLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKF+LJ,YACE,cAAA,IClLA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDoLV,wBDiQA,8BADA,8BC7PE,YAAA,EAAA,KAAA,EAAA,QEzOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuOF,aAAA,QALF,+BD6QA,qCADA,qCCpQI,YAAA,KAUJ,OCvME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBDgNV,8BElQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+PJ,8BEnQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgQJ,8BEpQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiQJ,2BErQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFkQJ,8BEtQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFmQJ,6BEvQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0QJ,ME9QI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4QF,aAAA,QC/NA,mBAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map.gz ADDED
Binary file (8.03 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap-tweaks.css ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+
3
+ This CSS file contains some tweaks specific to the included Bootstrap theme.
4
+ It's separate from `style.css` so that it can be easily overridden by replacing
5
+ a single block in the template.
6
+
7
+ */
8
+
9
+ .form-actions {
10
+ background: transparent;
11
+ border-top-color: transparent;
12
+ padding-top: 0;
13
+ text-align: right;
14
+ }
15
+
16
+ #generic-content-form textarea {
17
+ font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
18
+ font-size: 80%;
19
+ }
20
+
21
+ .navbar-inverse .brand a {
22
+ color: #999999;
23
+ }
24
+ .navbar-inverse .brand:hover a {
25
+ color: white;
26
+ text-decoration: none;
27
+ }
28
+
29
+ /* custom navigation styles */
30
+ .navbar {
31
+ width: 100%;
32
+ position: fixed;
33
+ left: 0;
34
+ top: 0;
35
+ }
36
+
37
+ .navbar {
38
+ background: #2C2C2C;
39
+ color: white;
40
+ border: none;
41
+ border-top: 5px solid #A30000;
42
+ border-radius: 0px;
43
+ }
44
+
45
+ .navbar .nav li, .navbar .nav li a, .navbar .brand:hover {
46
+ color: white;
47
+ }
48
+
49
+ .nav-list > .active > a, .nav-list > .active > a:hover {
50
+ background: #2C2C2C;
51
+ }
52
+
53
+ .navbar .dropdown-menu li a, .navbar .dropdown-menu li {
54
+ color: #A30000;
55
+ }
56
+
57
+ .navbar .dropdown-menu li a:hover {
58
+ background: #EEEEEE;
59
+ color: #C20000;
60
+ }
61
+
62
+ ul.breadcrumb {
63
+ margin: 70px 0 0 0;
64
+ }
65
+
66
+ .breadcrumb li.active a {
67
+ color: #777;
68
+ }
69
+
70
+ .pagination>.disabled>a,
71
+ .pagination>.disabled>a:hover,
72
+ .pagination>.disabled>a:focus {
73
+ cursor: not-allowed;
74
+ pointer-events: none;
75
+ }
76
+
77
+ .pager>.disabled>a,
78
+ .pager>.disabled>a:hover,
79
+ .pager>.disabled>a:focus {
80
+ pointer-events: none;
81
+ }
82
+
83
+ .pager .next {
84
+ margin-left: 10px;
85
+ }
86
+
87
+ /*=== dabapps bootstrap styles ====*/
88
+
89
+ html {
90
+ width:100%;
91
+ background: none;
92
+ }
93
+
94
+ /*body, .navbar .container-fluid {
95
+ max-width: 1150px;
96
+ margin: 0 auto;
97
+ }*/
98
+
99
+ body {
100
+ background: url("../img/grid.png") repeat-x;
101
+ background-attachment: fixed;
102
+ }
103
+
104
+ #content {
105
+ margin: 0;
106
+ padding-bottom: 60px;
107
+ }
108
+
109
+ /* sticky footer and footer */
110
+ html, body {
111
+ height: 100%;
112
+ }
113
+
114
+ .wrapper {
115
+ position: relative;
116
+ top: 0;
117
+ left: 0;
118
+ padding-top: 60px;
119
+ margin: -60px 0;
120
+ min-height: 100%;
121
+ }
122
+
123
+ .form-switcher {
124
+ margin-bottom: 0;
125
+ }
126
+
127
+ .well {
128
+ -webkit-box-shadow: none;
129
+ -moz-box-shadow: none;
130
+ box-shadow: none;
131
+ }
132
+
133
+ .well .form-actions {
134
+ padding-bottom: 0;
135
+ margin-bottom: 0;
136
+ }
137
+
138
+ .well form {
139
+ margin-bottom: 0;
140
+ }
141
+
142
+ .nav-tabs {
143
+ border: 0;
144
+ }
145
+
146
+ .nav-tabs > li {
147
+ float: right;
148
+ }
149
+
150
+ .nav-tabs li a {
151
+ margin-right: 0;
152
+ }
153
+
154
+ .nav-tabs > .active > a {
155
+ background: #F5F5F5;
156
+ }
157
+
158
+ .nav-tabs > .active > a:hover {
159
+ background: #F5F5F5;
160
+ }
161
+
162
+ .tabbable.first-tab-active .tab-content {
163
+ border-top-right-radius: 0;
164
+ }
165
+
166
+ footer {
167
+ position: absolute;
168
+ bottom: 0;
169
+ left: 0;
170
+ clear: both;
171
+ z-index: 10;
172
+ height: 60px;
173
+ width: 95%;
174
+ margin: 0 2.5%;
175
+ }
176
+
177
+ footer p {
178
+ text-align: center;
179
+ color: gray;
180
+ border-top: 1px solid #DDDDDD;
181
+ padding-top: 10px;
182
+ }
183
+
184
+ footer a {
185
+ color: gray !important;
186
+ font-weight: bold;
187
+ }
188
+
189
+ footer a:hover {
190
+ color: gray;
191
+ }
192
+
193
+ .page-header {
194
+ border-bottom: none;
195
+ padding-bottom: 0px;
196
+ margin: 0;
197
+ }
198
+
199
+ /* custom general page styles */
200
+ .hero-unit h1, .hero-unit h2 {
201
+ color: #A30000;
202
+ }
203
+
204
+ body a {
205
+ color: #A30000;
206
+ }
207
+
208
+ body a:hover {
209
+ color: #c20000;
210
+ }
211
+
212
+ .request-info {
213
+ clear:both;
214
+ }
215
+
216
+ .horizontal-checkbox label {
217
+ padding-top: 0;
218
+ }
219
+
220
+ .horizontal-checkbox label {
221
+ padding-top: 0 !important;
222
+ }
223
+
224
+ .horizontal-checkbox input {
225
+ float: left;
226
+ width: 20px;
227
+ margin-top: 3px;
228
+ }
229
+
230
+ .modal-footer form {
231
+ margin-left: 5px;
232
+ margin-right: 5px;
233
+ }
234
+
235
+ .pagination {
236
+ margin: 5px 0 10px 0;
237
+ }
backend/staticfiles/rest_framework/css/bootstrap-tweaks.css.gz ADDED
Binary file (1.27 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+
3
+ This CSS file contains some tweaks specific to the included Bootstrap theme.
4
+ It's separate from `style.css` so that it can be easily overridden by replacing
5
+ a single block in the template.
6
+
7
+ */
8
+
9
+ .form-actions {
10
+ background: transparent;
11
+ border-top-color: transparent;
12
+ padding-top: 0;
13
+ text-align: right;
14
+ }
15
+
16
+ #generic-content-form textarea {
17
+ font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
18
+ font-size: 80%;
19
+ }
20
+
21
+ .navbar-inverse .brand a {
22
+ color: #999999;
23
+ }
24
+ .navbar-inverse .brand:hover a {
25
+ color: white;
26
+ text-decoration: none;
27
+ }
28
+
29
+ /* custom navigation styles */
30
+ .navbar {
31
+ width: 100%;
32
+ position: fixed;
33
+ left: 0;
34
+ top: 0;
35
+ }
36
+
37
+ .navbar {
38
+ background: #2C2C2C;
39
+ color: white;
40
+ border: none;
41
+ border-top: 5px solid #A30000;
42
+ border-radius: 0px;
43
+ }
44
+
45
+ .navbar .nav li, .navbar .nav li a, .navbar .brand:hover {
46
+ color: white;
47
+ }
48
+
49
+ .nav-list > .active > a, .nav-list > .active > a:hover {
50
+ background: #2C2C2C;
51
+ }
52
+
53
+ .navbar .dropdown-menu li a, .navbar .dropdown-menu li {
54
+ color: #A30000;
55
+ }
56
+
57
+ .navbar .dropdown-menu li a:hover {
58
+ background: #EEEEEE;
59
+ color: #C20000;
60
+ }
61
+
62
+ ul.breadcrumb {
63
+ margin: 70px 0 0 0;
64
+ }
65
+
66
+ .breadcrumb li.active a {
67
+ color: #777;
68
+ }
69
+
70
+ .pagination>.disabled>a,
71
+ .pagination>.disabled>a:hover,
72
+ .pagination>.disabled>a:focus {
73
+ cursor: not-allowed;
74
+ pointer-events: none;
75
+ }
76
+
77
+ .pager>.disabled>a,
78
+ .pager>.disabled>a:hover,
79
+ .pager>.disabled>a:focus {
80
+ pointer-events: none;
81
+ }
82
+
83
+ .pager .next {
84
+ margin-left: 10px;
85
+ }
86
+
87
+ /*=== dabapps bootstrap styles ====*/
88
+
89
+ html {
90
+ width:100%;
91
+ background: none;
92
+ }
93
+
94
+ /*body, .navbar .container-fluid {
95
+ max-width: 1150px;
96
+ margin: 0 auto;
97
+ }*/
98
+
99
+ body {
100
+ background: url("../img/grid.a4b938cf382b.png") repeat-x;
101
+ background-attachment: fixed;
102
+ }
103
+
104
+ #content {
105
+ margin: 0;
106
+ padding-bottom: 60px;
107
+ }
108
+
109
+ /* sticky footer and footer */
110
+ html, body {
111
+ height: 100%;
112
+ }
113
+
114
+ .wrapper {
115
+ position: relative;
116
+ top: 0;
117
+ left: 0;
118
+ padding-top: 60px;
119
+ margin: -60px 0;
120
+ min-height: 100%;
121
+ }
122
+
123
+ .form-switcher {
124
+ margin-bottom: 0;
125
+ }
126
+
127
+ .well {
128
+ -webkit-box-shadow: none;
129
+ -moz-box-shadow: none;
130
+ box-shadow: none;
131
+ }
132
+
133
+ .well .form-actions {
134
+ padding-bottom: 0;
135
+ margin-bottom: 0;
136
+ }
137
+
138
+ .well form {
139
+ margin-bottom: 0;
140
+ }
141
+
142
+ .nav-tabs {
143
+ border: 0;
144
+ }
145
+
146
+ .nav-tabs > li {
147
+ float: right;
148
+ }
149
+
150
+ .nav-tabs li a {
151
+ margin-right: 0;
152
+ }
153
+
154
+ .nav-tabs > .active > a {
155
+ background: #F5F5F5;
156
+ }
157
+
158
+ .nav-tabs > .active > a:hover {
159
+ background: #F5F5F5;
160
+ }
161
+
162
+ .tabbable.first-tab-active .tab-content {
163
+ border-top-right-radius: 0;
164
+ }
165
+
166
+ footer {
167
+ position: absolute;
168
+ bottom: 0;
169
+ left: 0;
170
+ clear: both;
171
+ z-index: 10;
172
+ height: 60px;
173
+ width: 95%;
174
+ margin: 0 2.5%;
175
+ }
176
+
177
+ footer p {
178
+ text-align: center;
179
+ color: gray;
180
+ border-top: 1px solid #DDDDDD;
181
+ padding-top: 10px;
182
+ }
183
+
184
+ footer a {
185
+ color: gray !important;
186
+ font-weight: bold;
187
+ }
188
+
189
+ footer a:hover {
190
+ color: gray;
191
+ }
192
+
193
+ .page-header {
194
+ border-bottom: none;
195
+ padding-bottom: 0px;
196
+ margin: 0;
197
+ }
198
+
199
+ /* custom general page styles */
200
+ .hero-unit h1, .hero-unit h2 {
201
+ color: #A30000;
202
+ }
203
+
204
+ body a {
205
+ color: #A30000;
206
+ }
207
+
208
+ body a:hover {
209
+ color: #c20000;
210
+ }
211
+
212
+ .request-info {
213
+ clear:both;
214
+ }
215
+
216
+ .horizontal-checkbox label {
217
+ padding-top: 0;
218
+ }
219
+
220
+ .horizontal-checkbox label {
221
+ padding-top: 0 !important;
222
+ }
223
+
224
+ .horizontal-checkbox input {
225
+ float: left;
226
+ width: 20px;
227
+ margin-top: 3px;
228
+ }
229
+
230
+ .modal-footer form {
231
+ margin-left: 5px;
232
+ margin-right: 5px;
233
+ }
234
+
235
+ .pagination {
236
+ margin: 5px 0 10px 0;
237
+ }
backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css.gz ADDED
Binary file (1.28 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap.min.css ADDED
The diff for this file is too large to render. See raw diff
 
backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map ADDED
The diff for this file is too large to render. See raw diff
 
backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map.gz ADDED
Binary file (94.4 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap.min.css.gz ADDED
Binary file (19.6 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap.min.css.map ADDED
The diff for this file is too large to render. See raw diff
 
backend/staticfiles/rest_framework/css/bootstrap.min.css.map.gz ADDED
Binary file (94.4 kB). View file
 
backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css ADDED
The diff for this file is too large to render. See raw diff
 
backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css.gz ADDED
Binary file (19.7 kB). View file
 
backend/staticfiles/rest_framework/css/default.789dfb5732d7.css ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* The navbar is fixed at >= 980px wide, so add padding to the body to prevent
2
+ content running up underneath it. */
3
+
4
+ h1 {
5
+ font-weight: 300;
6
+ }
7
+
8
+ h2, h3 {
9
+ font-weight: 300;
10
+ }
11
+
12
+ .resource-description, .response-info {
13
+ margin-bottom: 2em;
14
+ }
15
+
16
+ .version:before {
17
+ content: "v";
18
+ opacity: 0.6;
19
+ padding-right: 0.25em;
20
+ }
21
+
22
+ .version {
23
+ font-size: 70%;
24
+ }
25
+
26
+ .format-option {
27
+ font-family: Menlo, Consolas, "Andale Mono", "Lucida Console", monospace;
28
+ }
29
+
30
+ .button-form {
31
+ float: right;
32
+ margin-right: 1em;
33
+ }
34
+
35
+ td.nested {
36
+ padding: 0 !important;
37
+ }
38
+
39
+ td.nested > table {
40
+ margin: 0;
41
+ }
42
+
43
+ form select, form input:not([type=checkbox]), form textarea {
44
+ width: 90%;
45
+ }
46
+
47
+ form select[multiple] {
48
+ height: 150px;
49
+ }
50
+
51
+ /* To allow tooltips to work on disabled elements */
52
+ .disabled-tooltip-shield {
53
+ position: absolute;
54
+ top: 0;
55
+ right: 0;
56
+ bottom: 0;
57
+ left: 0;
58
+ }
59
+
60
+ .errorlist {
61
+ margin-top: 0.5em;
62
+ }
63
+
64
+ pre {
65
+ overflow: auto;
66
+ word-wrap: normal;
67
+ white-space: pre;
68
+ font-size: 12px;
69
+ }
70
+
71
+ .page-header {
72
+ border-bottom: none;
73
+ padding-bottom: 0px;
74
+ }
75
+
76
+ #filtersModal form input[type=submit] {
77
+ width: auto;
78
+ }
79
+
80
+ #filtersModal .modal-body h2 {
81
+ margin-top: 0
82
+ }
backend/staticfiles/rest_framework/css/default.789dfb5732d7.css.gz ADDED
Binary file (612 Bytes). View file
 
backend/staticfiles/rest_framework/css/default.css ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* The navbar is fixed at >= 980px wide, so add padding to the body to prevent
2
+ content running up underneath it. */
3
+
4
+ h1 {
5
+ font-weight: 300;
6
+ }
7
+
8
+ h2, h3 {
9
+ font-weight: 300;
10
+ }
11
+
12
+ .resource-description, .response-info {
13
+ margin-bottom: 2em;
14
+ }
15
+
16
+ .version:before {
17
+ content: "v";
18
+ opacity: 0.6;
19
+ padding-right: 0.25em;
20
+ }
21
+
22
+ .version {
23
+ font-size: 70%;
24
+ }
25
+
26
+ .format-option {
27
+ font-family: Menlo, Consolas, "Andale Mono", "Lucida Console", monospace;
28
+ }
29
+
30
+ .button-form {
31
+ float: right;
32
+ margin-right: 1em;
33
+ }
34
+
35
+ td.nested {
36
+ padding: 0 !important;
37
+ }
38
+
39
+ td.nested > table {
40
+ margin: 0;
41
+ }
42
+
43
+ form select, form input:not([type=checkbox]), form textarea {
44
+ width: 90%;
45
+ }
46
+
47
+ form select[multiple] {
48
+ height: 150px;
49
+ }
50
+
51
+ /* To allow tooltips to work on disabled elements */
52
+ .disabled-tooltip-shield {
53
+ position: absolute;
54
+ top: 0;
55
+ right: 0;
56
+ bottom: 0;
57
+ left: 0;
58
+ }
59
+
60
+ .errorlist {
61
+ margin-top: 0.5em;
62
+ }
63
+
64
+ pre {
65
+ overflow: auto;
66
+ word-wrap: normal;
67
+ white-space: pre;
68
+ font-size: 12px;
69
+ }
70
+
71
+ .page-header {
72
+ border-bottom: none;
73
+ padding-bottom: 0px;
74
+ }
75
+
76
+ #filtersModal form input[type=submit] {
77
+ width: auto;
78
+ }
79
+
80
+ #filtersModal .modal-body h2 {
81
+ margin-top: 0
82
+ }
backend/staticfiles/rest_framework/css/default.css.gz ADDED
Binary file (612 Bytes). View file
 
backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css ADDED
@@ -0,0 +1,1338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */
5
+ /* FONT PATH
6
+ * -------------------------- */
7
+ @font-face {
8
+ font-family: 'FontAwesome';
9
+ src: url("../fonts/fontawesome-webfont.8b27bc96115c.eot?v=4.0.3");
10
+ src: url("../fonts/fontawesome-webfont.8b27bc96115c.eot?#iefix&v=4.0.3") format('embedded-opentype'), url("../fonts/fontawesome-webfont.3293616ec0c6.woff?v=4.0.3") format('woff'), url("../fonts/fontawesome-webfont.dcb26c7239d8.ttf?v=4.0.3") format('truetype'), url("../fonts/fontawesome-webfont.83e37a11f9d7.svg?v=4.0.3#fontawesomeregular") format('svg');
11
+ font-weight: normal;
12
+ font-style: normal;
13
+ }
14
+ .fa {
15
+ display: inline-block;
16
+ font-family: FontAwesome;
17
+ font-style: normal;
18
+ font-weight: normal;
19
+ line-height: 1;
20
+ -webkit-font-smoothing: antialiased;
21
+ -moz-osx-font-smoothing: grayscale;
22
+ }
23
+ /* makes the font 33% larger relative to the icon container */
24
+ .fa-lg {
25
+ font-size: 1.3333333333333333em;
26
+ line-height: 0.75em;
27
+ vertical-align: -15%;
28
+ }
29
+ .fa-2x {
30
+ font-size: 2em;
31
+ }
32
+ .fa-3x {
33
+ font-size: 3em;
34
+ }
35
+ .fa-4x {
36
+ font-size: 4em;
37
+ }
38
+ .fa-5x {
39
+ font-size: 5em;
40
+ }
41
+ .fa-fw {
42
+ width: 1.2857142857142858em;
43
+ text-align: center;
44
+ }
45
+ .fa-ul {
46
+ padding-left: 0;
47
+ margin-left: 2.142857142857143em;
48
+ list-style-type: none;
49
+ }
50
+ .fa-ul > li {
51
+ position: relative;
52
+ }
53
+ .fa-li {
54
+ position: absolute;
55
+ left: -2.142857142857143em;
56
+ width: 2.142857142857143em;
57
+ top: 0.14285714285714285em;
58
+ text-align: center;
59
+ }
60
+ .fa-li.fa-lg {
61
+ left: -1.8571428571428572em;
62
+ }
63
+ .fa-border {
64
+ padding: .2em .25em .15em;
65
+ border: solid 0.08em #eeeeee;
66
+ border-radius: .1em;
67
+ }
68
+ .pull-right {
69
+ float: right;
70
+ }
71
+ .pull-left {
72
+ float: left;
73
+ }
74
+ .fa.pull-left {
75
+ margin-right: .3em;
76
+ }
77
+ .fa.pull-right {
78
+ margin-left: .3em;
79
+ }
80
+ .fa-spin {
81
+ -webkit-animation: spin 2s infinite linear;
82
+ -moz-animation: spin 2s infinite linear;
83
+ -o-animation: spin 2s infinite linear;
84
+ animation: spin 2s infinite linear;
85
+ }
86
+ @-moz-keyframes spin {
87
+ 0% {
88
+ -moz-transform: rotate(0deg);
89
+ }
90
+ 100% {
91
+ -moz-transform: rotate(359deg);
92
+ }
93
+ }
94
+ @-webkit-keyframes spin {
95
+ 0% {
96
+ -webkit-transform: rotate(0deg);
97
+ }
98
+ 100% {
99
+ -webkit-transform: rotate(359deg);
100
+ }
101
+ }
102
+ @-o-keyframes spin {
103
+ 0% {
104
+ -o-transform: rotate(0deg);
105
+ }
106
+ 100% {
107
+ -o-transform: rotate(359deg);
108
+ }
109
+ }
110
+ @-ms-keyframes spin {
111
+ 0% {
112
+ -ms-transform: rotate(0deg);
113
+ }
114
+ 100% {
115
+ -ms-transform: rotate(359deg);
116
+ }
117
+ }
118
+ @keyframes spin {
119
+ 0% {
120
+ transform: rotate(0deg);
121
+ }
122
+ 100% {
123
+ transform: rotate(359deg);
124
+ }
125
+ }
126
+ .fa-rotate-90 {
127
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
128
+ -webkit-transform: rotate(90deg);
129
+ -moz-transform: rotate(90deg);
130
+ -ms-transform: rotate(90deg);
131
+ -o-transform: rotate(90deg);
132
+ transform: rotate(90deg);
133
+ }
134
+ .fa-rotate-180 {
135
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
136
+ -webkit-transform: rotate(180deg);
137
+ -moz-transform: rotate(180deg);
138
+ -ms-transform: rotate(180deg);
139
+ -o-transform: rotate(180deg);
140
+ transform: rotate(180deg);
141
+ }
142
+ .fa-rotate-270 {
143
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
144
+ -webkit-transform: rotate(270deg);
145
+ -moz-transform: rotate(270deg);
146
+ -ms-transform: rotate(270deg);
147
+ -o-transform: rotate(270deg);
148
+ transform: rotate(270deg);
149
+ }
150
+ .fa-flip-horizontal {
151
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
152
+ -webkit-transform: scale(-1, 1);
153
+ -moz-transform: scale(-1, 1);
154
+ -ms-transform: scale(-1, 1);
155
+ -o-transform: scale(-1, 1);
156
+ transform: scale(-1, 1);
157
+ }
158
+ .fa-flip-vertical {
159
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
160
+ -webkit-transform: scale(1, -1);
161
+ -moz-transform: scale(1, -1);
162
+ -ms-transform: scale(1, -1);
163
+ -o-transform: scale(1, -1);
164
+ transform: scale(1, -1);
165
+ }
166
+ .fa-stack {
167
+ position: relative;
168
+ display: inline-block;
169
+ width: 2em;
170
+ height: 2em;
171
+ line-height: 2em;
172
+ vertical-align: middle;
173
+ }
174
+ .fa-stack-1x,
175
+ .fa-stack-2x {
176
+ position: absolute;
177
+ left: 0;
178
+ width: 100%;
179
+ text-align: center;
180
+ }
181
+ .fa-stack-1x {
182
+ line-height: inherit;
183
+ }
184
+ .fa-stack-2x {
185
+ font-size: 2em;
186
+ }
187
+ .fa-inverse {
188
+ color: #ffffff;
189
+ }
190
+ /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
191
+ readers do not read off random characters that represent icons */
192
+ .fa-glass:before {
193
+ content: "\f000";
194
+ }
195
+ .fa-music:before {
196
+ content: "\f001";
197
+ }
198
+ .fa-search:before {
199
+ content: "\f002";
200
+ }
201
+ .fa-envelope-o:before {
202
+ content: "\f003";
203
+ }
204
+ .fa-heart:before {
205
+ content: "\f004";
206
+ }
207
+ .fa-star:before {
208
+ content: "\f005";
209
+ }
210
+ .fa-star-o:before {
211
+ content: "\f006";
212
+ }
213
+ .fa-user:before {
214
+ content: "\f007";
215
+ }
216
+ .fa-film:before {
217
+ content: "\f008";
218
+ }
219
+ .fa-th-large:before {
220
+ content: "\f009";
221
+ }
222
+ .fa-th:before {
223
+ content: "\f00a";
224
+ }
225
+ .fa-th-list:before {
226
+ content: "\f00b";
227
+ }
228
+ .fa-check:before {
229
+ content: "\f00c";
230
+ }
231
+ .fa-times:before {
232
+ content: "\f00d";
233
+ }
234
+ .fa-search-plus:before {
235
+ content: "\f00e";
236
+ }
237
+ .fa-search-minus:before {
238
+ content: "\f010";
239
+ }
240
+ .fa-power-off:before {
241
+ content: "\f011";
242
+ }
243
+ .fa-signal:before {
244
+ content: "\f012";
245
+ }
246
+ .fa-gear:before,
247
+ .fa-cog:before {
248
+ content: "\f013";
249
+ }
250
+ .fa-trash-o:before {
251
+ content: "\f014";
252
+ }
253
+ .fa-home:before {
254
+ content: "\f015";
255
+ }
256
+ .fa-file-o:before {
257
+ content: "\f016";
258
+ }
259
+ .fa-clock-o:before {
260
+ content: "\f017";
261
+ }
262
+ .fa-road:before {
263
+ content: "\f018";
264
+ }
265
+ .fa-download:before {
266
+ content: "\f019";
267
+ }
268
+ .fa-arrow-circle-o-down:before {
269
+ content: "\f01a";
270
+ }
271
+ .fa-arrow-circle-o-up:before {
272
+ content: "\f01b";
273
+ }
274
+ .fa-inbox:before {
275
+ content: "\f01c";
276
+ }
277
+ .fa-play-circle-o:before {
278
+ content: "\f01d";
279
+ }
280
+ .fa-rotate-right:before,
281
+ .fa-repeat:before {
282
+ content: "\f01e";
283
+ }
284
+ .fa-refresh:before {
285
+ content: "\f021";
286
+ }
287
+ .fa-list-alt:before {
288
+ content: "\f022";
289
+ }
290
+ .fa-lock:before {
291
+ content: "\f023";
292
+ }
293
+ .fa-flag:before {
294
+ content: "\f024";
295
+ }
296
+ .fa-headphones:before {
297
+ content: "\f025";
298
+ }
299
+ .fa-volume-off:before {
300
+ content: "\f026";
301
+ }
302
+ .fa-volume-down:before {
303
+ content: "\f027";
304
+ }
305
+ .fa-volume-up:before {
306
+ content: "\f028";
307
+ }
308
+ .fa-qrcode:before {
309
+ content: "\f029";
310
+ }
311
+ .fa-barcode:before {
312
+ content: "\f02a";
313
+ }
314
+ .fa-tag:before {
315
+ content: "\f02b";
316
+ }
317
+ .fa-tags:before {
318
+ content: "\f02c";
319
+ }
320
+ .fa-book:before {
321
+ content: "\f02d";
322
+ }
323
+ .fa-bookmark:before {
324
+ content: "\f02e";
325
+ }
326
+ .fa-print:before {
327
+ content: "\f02f";
328
+ }
329
+ .fa-camera:before {
330
+ content: "\f030";
331
+ }
332
+ .fa-font:before {
333
+ content: "\f031";
334
+ }
335
+ .fa-bold:before {
336
+ content: "\f032";
337
+ }
338
+ .fa-italic:before {
339
+ content: "\f033";
340
+ }
341
+ .fa-text-height:before {
342
+ content: "\f034";
343
+ }
344
+ .fa-text-width:before {
345
+ content: "\f035";
346
+ }
347
+ .fa-align-left:before {
348
+ content: "\f036";
349
+ }
350
+ .fa-align-center:before {
351
+ content: "\f037";
352
+ }
353
+ .fa-align-right:before {
354
+ content: "\f038";
355
+ }
356
+ .fa-align-justify:before {
357
+ content: "\f039";
358
+ }
359
+ .fa-list:before {
360
+ content: "\f03a";
361
+ }
362
+ .fa-dedent:before,
363
+ .fa-outdent:before {
364
+ content: "\f03b";
365
+ }
366
+ .fa-indent:before {
367
+ content: "\f03c";
368
+ }
369
+ .fa-video-camera:before {
370
+ content: "\f03d";
371
+ }
372
+ .fa-picture-o:before {
373
+ content: "\f03e";
374
+ }
375
+ .fa-pencil:before {
376
+ content: "\f040";
377
+ }
378
+ .fa-map-marker:before {
379
+ content: "\f041";
380
+ }
381
+ .fa-adjust:before {
382
+ content: "\f042";
383
+ }
384
+ .fa-tint:before {
385
+ content: "\f043";
386
+ }
387
+ .fa-edit:before,
388
+ .fa-pencil-square-o:before {
389
+ content: "\f044";
390
+ }
391
+ .fa-share-square-o:before {
392
+ content: "\f045";
393
+ }
394
+ .fa-check-square-o:before {
395
+ content: "\f046";
396
+ }
397
+ .fa-arrows:before {
398
+ content: "\f047";
399
+ }
400
+ .fa-step-backward:before {
401
+ content: "\f048";
402
+ }
403
+ .fa-fast-backward:before {
404
+ content: "\f049";
405
+ }
406
+ .fa-backward:before {
407
+ content: "\f04a";
408
+ }
409
+ .fa-play:before {
410
+ content: "\f04b";
411
+ }
412
+ .fa-pause:before {
413
+ content: "\f04c";
414
+ }
415
+ .fa-stop:before {
416
+ content: "\f04d";
417
+ }
418
+ .fa-forward:before {
419
+ content: "\f04e";
420
+ }
421
+ .fa-fast-forward:before {
422
+ content: "\f050";
423
+ }
424
+ .fa-step-forward:before {
425
+ content: "\f051";
426
+ }
427
+ .fa-eject:before {
428
+ content: "\f052";
429
+ }
430
+ .fa-chevron-left:before {
431
+ content: "\f053";
432
+ }
433
+ .fa-chevron-right:before {
434
+ content: "\f054";
435
+ }
436
+ .fa-plus-circle:before {
437
+ content: "\f055";
438
+ }
439
+ .fa-minus-circle:before {
440
+ content: "\f056";
441
+ }
442
+ .fa-times-circle:before {
443
+ content: "\f057";
444
+ }
445
+ .fa-check-circle:before {
446
+ content: "\f058";
447
+ }
448
+ .fa-question-circle:before {
449
+ content: "\f059";
450
+ }
451
+ .fa-info-circle:before {
452
+ content: "\f05a";
453
+ }
454
+ .fa-crosshairs:before {
455
+ content: "\f05b";
456
+ }
457
+ .fa-times-circle-o:before {
458
+ content: "\f05c";
459
+ }
460
+ .fa-check-circle-o:before {
461
+ content: "\f05d";
462
+ }
463
+ .fa-ban:before {
464
+ content: "\f05e";
465
+ }
466
+ .fa-arrow-left:before {
467
+ content: "\f060";
468
+ }
469
+ .fa-arrow-right:before {
470
+ content: "\f061";
471
+ }
472
+ .fa-arrow-up:before {
473
+ content: "\f062";
474
+ }
475
+ .fa-arrow-down:before {
476
+ content: "\f063";
477
+ }
478
+ .fa-mail-forward:before,
479
+ .fa-share:before {
480
+ content: "\f064";
481
+ }
482
+ .fa-expand:before {
483
+ content: "\f065";
484
+ }
485
+ .fa-compress:before {
486
+ content: "\f066";
487
+ }
488
+ .fa-plus:before {
489
+ content: "\f067";
490
+ }
491
+ .fa-minus:before {
492
+ content: "\f068";
493
+ }
494
+ .fa-asterisk:before {
495
+ content: "\f069";
496
+ }
497
+ .fa-exclamation-circle:before {
498
+ content: "\f06a";
499
+ }
500
+ .fa-gift:before {
501
+ content: "\f06b";
502
+ }
503
+ .fa-leaf:before {
504
+ content: "\f06c";
505
+ }
506
+ .fa-fire:before {
507
+ content: "\f06d";
508
+ }
509
+ .fa-eye:before {
510
+ content: "\f06e";
511
+ }
512
+ .fa-eye-slash:before {
513
+ content: "\f070";
514
+ }
515
+ .fa-warning:before,
516
+ .fa-exclamation-triangle:before {
517
+ content: "\f071";
518
+ }
519
+ .fa-plane:before {
520
+ content: "\f072";
521
+ }
522
+ .fa-calendar:before {
523
+ content: "\f073";
524
+ }
525
+ .fa-random:before {
526
+ content: "\f074";
527
+ }
528
+ .fa-comment:before {
529
+ content: "\f075";
530
+ }
531
+ .fa-magnet:before {
532
+ content: "\f076";
533
+ }
534
+ .fa-chevron-up:before {
535
+ content: "\f077";
536
+ }
537
+ .fa-chevron-down:before {
538
+ content: "\f078";
539
+ }
540
+ .fa-retweet:before {
541
+ content: "\f079";
542
+ }
543
+ .fa-shopping-cart:before {
544
+ content: "\f07a";
545
+ }
546
+ .fa-folder:before {
547
+ content: "\f07b";
548
+ }
549
+ .fa-folder-open:before {
550
+ content: "\f07c";
551
+ }
552
+ .fa-arrows-v:before {
553
+ content: "\f07d";
554
+ }
555
+ .fa-arrows-h:before {
556
+ content: "\f07e";
557
+ }
558
+ .fa-bar-chart-o:before {
559
+ content: "\f080";
560
+ }
561
+ .fa-twitter-square:before {
562
+ content: "\f081";
563
+ }
564
+ .fa-facebook-square:before {
565
+ content: "\f082";
566
+ }
567
+ .fa-camera-retro:before {
568
+ content: "\f083";
569
+ }
570
+ .fa-key:before {
571
+ content: "\f084";
572
+ }
573
+ .fa-gears:before,
574
+ .fa-cogs:before {
575
+ content: "\f085";
576
+ }
577
+ .fa-comments:before {
578
+ content: "\f086";
579
+ }
580
+ .fa-thumbs-o-up:before {
581
+ content: "\f087";
582
+ }
583
+ .fa-thumbs-o-down:before {
584
+ content: "\f088";
585
+ }
586
+ .fa-star-half:before {
587
+ content: "\f089";
588
+ }
589
+ .fa-heart-o:before {
590
+ content: "\f08a";
591
+ }
592
+ .fa-sign-out:before {
593
+ content: "\f08b";
594
+ }
595
+ .fa-linkedin-square:before {
596
+ content: "\f08c";
597
+ }
598
+ .fa-thumb-tack:before {
599
+ content: "\f08d";
600
+ }
601
+ .fa-external-link:before {
602
+ content: "\f08e";
603
+ }
604
+ .fa-sign-in:before {
605
+ content: "\f090";
606
+ }
607
+ .fa-trophy:before {
608
+ content: "\f091";
609
+ }
610
+ .fa-github-square:before {
611
+ content: "\f092";
612
+ }
613
+ .fa-upload:before {
614
+ content: "\f093";
615
+ }
616
+ .fa-lemon-o:before {
617
+ content: "\f094";
618
+ }
619
+ .fa-phone:before {
620
+ content: "\f095";
621
+ }
622
+ .fa-square-o:before {
623
+ content: "\f096";
624
+ }
625
+ .fa-bookmark-o:before {
626
+ content: "\f097";
627
+ }
628
+ .fa-phone-square:before {
629
+ content: "\f098";
630
+ }
631
+ .fa-twitter:before {
632
+ content: "\f099";
633
+ }
634
+ .fa-facebook:before {
635
+ content: "\f09a";
636
+ }
637
+ .fa-github:before {
638
+ content: "\f09b";
639
+ }
640
+ .fa-unlock:before {
641
+ content: "\f09c";
642
+ }
643
+ .fa-credit-card:before {
644
+ content: "\f09d";
645
+ }
646
+ .fa-rss:before {
647
+ content: "\f09e";
648
+ }
649
+ .fa-hdd-o:before {
650
+ content: "\f0a0";
651
+ }
652
+ .fa-bullhorn:before {
653
+ content: "\f0a1";
654
+ }
655
+ .fa-bell:before {
656
+ content: "\f0f3";
657
+ }
658
+ .fa-certificate:before {
659
+ content: "\f0a3";
660
+ }
661
+ .fa-hand-o-right:before {
662
+ content: "\f0a4";
663
+ }
664
+ .fa-hand-o-left:before {
665
+ content: "\f0a5";
666
+ }
667
+ .fa-hand-o-up:before {
668
+ content: "\f0a6";
669
+ }
670
+ .fa-hand-o-down:before {
671
+ content: "\f0a7";
672
+ }
673
+ .fa-arrow-circle-left:before {
674
+ content: "\f0a8";
675
+ }
676
+ .fa-arrow-circle-right:before {
677
+ content: "\f0a9";
678
+ }
679
+ .fa-arrow-circle-up:before {
680
+ content: "\f0aa";
681
+ }
682
+ .fa-arrow-circle-down:before {
683
+ content: "\f0ab";
684
+ }
685
+ .fa-globe:before {
686
+ content: "\f0ac";
687
+ }
688
+ .fa-wrench:before {
689
+ content: "\f0ad";
690
+ }
691
+ .fa-tasks:before {
692
+ content: "\f0ae";
693
+ }
694
+ .fa-filter:before {
695
+ content: "\f0b0";
696
+ }
697
+ .fa-briefcase:before {
698
+ content: "\f0b1";
699
+ }
700
+ .fa-arrows-alt:before {
701
+ content: "\f0b2";
702
+ }
703
+ .fa-group:before,
704
+ .fa-users:before {
705
+ content: "\f0c0";
706
+ }
707
+ .fa-chain:before,
708
+ .fa-link:before {
709
+ content: "\f0c1";
710
+ }
711
+ .fa-cloud:before {
712
+ content: "\f0c2";
713
+ }
714
+ .fa-flask:before {
715
+ content: "\f0c3";
716
+ }
717
+ .fa-cut:before,
718
+ .fa-scissors:before {
719
+ content: "\f0c4";
720
+ }
721
+ .fa-copy:before,
722
+ .fa-files-o:before {
723
+ content: "\f0c5";
724
+ }
725
+ .fa-paperclip:before {
726
+ content: "\f0c6";
727
+ }
728
+ .fa-save:before,
729
+ .fa-floppy-o:before {
730
+ content: "\f0c7";
731
+ }
732
+ .fa-square:before {
733
+ content: "\f0c8";
734
+ }
735
+ .fa-bars:before {
736
+ content: "\f0c9";
737
+ }
738
+ .fa-list-ul:before {
739
+ content: "\f0ca";
740
+ }
741
+ .fa-list-ol:before {
742
+ content: "\f0cb";
743
+ }
744
+ .fa-strikethrough:before {
745
+ content: "\f0cc";
746
+ }
747
+ .fa-underline:before {
748
+ content: "\f0cd";
749
+ }
750
+ .fa-table:before {
751
+ content: "\f0ce";
752
+ }
753
+ .fa-magic:before {
754
+ content: "\f0d0";
755
+ }
756
+ .fa-truck:before {
757
+ content: "\f0d1";
758
+ }
759
+ .fa-pinterest:before {
760
+ content: "\f0d2";
761
+ }
762
+ .fa-pinterest-square:before {
763
+ content: "\f0d3";
764
+ }
765
+ .fa-google-plus-square:before {
766
+ content: "\f0d4";
767
+ }
768
+ .fa-google-plus:before {
769
+ content: "\f0d5";
770
+ }
771
+ .fa-money:before {
772
+ content: "\f0d6";
773
+ }
774
+ .fa-caret-down:before {
775
+ content: "\f0d7";
776
+ }
777
+ .fa-caret-up:before {
778
+ content: "\f0d8";
779
+ }
780
+ .fa-caret-left:before {
781
+ content: "\f0d9";
782
+ }
783
+ .fa-caret-right:before {
784
+ content: "\f0da";
785
+ }
786
+ .fa-columns:before {
787
+ content: "\f0db";
788
+ }
789
+ .fa-unsorted:before,
790
+ .fa-sort:before {
791
+ content: "\f0dc";
792
+ }
793
+ .fa-sort-down:before,
794
+ .fa-sort-asc:before {
795
+ content: "\f0dd";
796
+ }
797
+ .fa-sort-up:before,
798
+ .fa-sort-desc:before {
799
+ content: "\f0de";
800
+ }
801
+ .fa-envelope:before {
802
+ content: "\f0e0";
803
+ }
804
+ .fa-linkedin:before {
805
+ content: "\f0e1";
806
+ }
807
+ .fa-rotate-left:before,
808
+ .fa-undo:before {
809
+ content: "\f0e2";
810
+ }
811
+ .fa-legal:before,
812
+ .fa-gavel:before {
813
+ content: "\f0e3";
814
+ }
815
+ .fa-dashboard:before,
816
+ .fa-tachometer:before {
817
+ content: "\f0e4";
818
+ }
819
+ .fa-comment-o:before {
820
+ content: "\f0e5";
821
+ }
822
+ .fa-comments-o:before {
823
+ content: "\f0e6";
824
+ }
825
+ .fa-flash:before,
826
+ .fa-bolt:before {
827
+ content: "\f0e7";
828
+ }
829
+ .fa-sitemap:before {
830
+ content: "\f0e8";
831
+ }
832
+ .fa-umbrella:before {
833
+ content: "\f0e9";
834
+ }
835
+ .fa-paste:before,
836
+ .fa-clipboard:before {
837
+ content: "\f0ea";
838
+ }
839
+ .fa-lightbulb-o:before {
840
+ content: "\f0eb";
841
+ }
842
+ .fa-exchange:before {
843
+ content: "\f0ec";
844
+ }
845
+ .fa-cloud-download:before {
846
+ content: "\f0ed";
847
+ }
848
+ .fa-cloud-upload:before {
849
+ content: "\f0ee";
850
+ }
851
+ .fa-user-md:before {
852
+ content: "\f0f0";
853
+ }
854
+ .fa-stethoscope:before {
855
+ content: "\f0f1";
856
+ }
857
+ .fa-suitcase:before {
858
+ content: "\f0f2";
859
+ }
860
+ .fa-bell-o:before {
861
+ content: "\f0a2";
862
+ }
863
+ .fa-coffee:before {
864
+ content: "\f0f4";
865
+ }
866
+ .fa-cutlery:before {
867
+ content: "\f0f5";
868
+ }
869
+ .fa-file-text-o:before {
870
+ content: "\f0f6";
871
+ }
872
+ .fa-building-o:before {
873
+ content: "\f0f7";
874
+ }
875
+ .fa-hospital-o:before {
876
+ content: "\f0f8";
877
+ }
878
+ .fa-ambulance:before {
879
+ content: "\f0f9";
880
+ }
881
+ .fa-medkit:before {
882
+ content: "\f0fa";
883
+ }
884
+ .fa-fighter-jet:before {
885
+ content: "\f0fb";
886
+ }
887
+ .fa-beer:before {
888
+ content: "\f0fc";
889
+ }
890
+ .fa-h-square:before {
891
+ content: "\f0fd";
892
+ }
893
+ .fa-plus-square:before {
894
+ content: "\f0fe";
895
+ }
896
+ .fa-angle-double-left:before {
897
+ content: "\f100";
898
+ }
899
+ .fa-angle-double-right:before {
900
+ content: "\f101";
901
+ }
902
+ .fa-angle-double-up:before {
903
+ content: "\f102";
904
+ }
905
+ .fa-angle-double-down:before {
906
+ content: "\f103";
907
+ }
908
+ .fa-angle-left:before {
909
+ content: "\f104";
910
+ }
911
+ .fa-angle-right:before {
912
+ content: "\f105";
913
+ }
914
+ .fa-angle-up:before {
915
+ content: "\f106";
916
+ }
917
+ .fa-angle-down:before {
918
+ content: "\f107";
919
+ }
920
+ .fa-desktop:before {
921
+ content: "\f108";
922
+ }
923
+ .fa-laptop:before {
924
+ content: "\f109";
925
+ }
926
+ .fa-tablet:before {
927
+ content: "\f10a";
928
+ }
929
+ .fa-mobile-phone:before,
930
+ .fa-mobile:before {
931
+ content: "\f10b";
932
+ }
933
+ .fa-circle-o:before {
934
+ content: "\f10c";
935
+ }
936
+ .fa-quote-left:before {
937
+ content: "\f10d";
938
+ }
939
+ .fa-quote-right:before {
940
+ content: "\f10e";
941
+ }
942
+ .fa-spinner:before {
943
+ content: "\f110";
944
+ }
945
+ .fa-circle:before {
946
+ content: "\f111";
947
+ }
948
+ .fa-mail-reply:before,
949
+ .fa-reply:before {
950
+ content: "\f112";
951
+ }
952
+ .fa-github-alt:before {
953
+ content: "\f113";
954
+ }
955
+ .fa-folder-o:before {
956
+ content: "\f114";
957
+ }
958
+ .fa-folder-open-o:before {
959
+ content: "\f115";
960
+ }
961
+ .fa-smile-o:before {
962
+ content: "\f118";
963
+ }
964
+ .fa-frown-o:before {
965
+ content: "\f119";
966
+ }
967
+ .fa-meh-o:before {
968
+ content: "\f11a";
969
+ }
970
+ .fa-gamepad:before {
971
+ content: "\f11b";
972
+ }
973
+ .fa-keyboard-o:before {
974
+ content: "\f11c";
975
+ }
976
+ .fa-flag-o:before {
977
+ content: "\f11d";
978
+ }
979
+ .fa-flag-checkered:before {
980
+ content: "\f11e";
981
+ }
982
+ .fa-terminal:before {
983
+ content: "\f120";
984
+ }
985
+ .fa-code:before {
986
+ content: "\f121";
987
+ }
988
+ .fa-reply-all:before {
989
+ content: "\f122";
990
+ }
991
+ .fa-mail-reply-all:before {
992
+ content: "\f122";
993
+ }
994
+ .fa-star-half-empty:before,
995
+ .fa-star-half-full:before,
996
+ .fa-star-half-o:before {
997
+ content: "\f123";
998
+ }
999
+ .fa-location-arrow:before {
1000
+ content: "\f124";
1001
+ }
1002
+ .fa-crop:before {
1003
+ content: "\f125";
1004
+ }
1005
+ .fa-code-fork:before {
1006
+ content: "\f126";
1007
+ }
1008
+ .fa-unlink:before,
1009
+ .fa-chain-broken:before {
1010
+ content: "\f127";
1011
+ }
1012
+ .fa-question:before {
1013
+ content: "\f128";
1014
+ }
1015
+ .fa-info:before {
1016
+ content: "\f129";
1017
+ }
1018
+ .fa-exclamation:before {
1019
+ content: "\f12a";
1020
+ }
1021
+ .fa-superscript:before {
1022
+ content: "\f12b";
1023
+ }
1024
+ .fa-subscript:before {
1025
+ content: "\f12c";
1026
+ }
1027
+ .fa-eraser:before {
1028
+ content: "\f12d";
1029
+ }
1030
+ .fa-puzzle-piece:before {
1031
+ content: "\f12e";
1032
+ }
1033
+ .fa-microphone:before {
1034
+ content: "\f130";
1035
+ }
1036
+ .fa-microphone-slash:before {
1037
+ content: "\f131";
1038
+ }
1039
+ .fa-shield:before {
1040
+ content: "\f132";
1041
+ }
1042
+ .fa-calendar-o:before {
1043
+ content: "\f133";
1044
+ }
1045
+ .fa-fire-extinguisher:before {
1046
+ content: "\f134";
1047
+ }
1048
+ .fa-rocket:before {
1049
+ content: "\f135";
1050
+ }
1051
+ .fa-maxcdn:before {
1052
+ content: "\f136";
1053
+ }
1054
+ .fa-chevron-circle-left:before {
1055
+ content: "\f137";
1056
+ }
1057
+ .fa-chevron-circle-right:before {
1058
+ content: "\f138";
1059
+ }
1060
+ .fa-chevron-circle-up:before {
1061
+ content: "\f139";
1062
+ }
1063
+ .fa-chevron-circle-down:before {
1064
+ content: "\f13a";
1065
+ }
1066
+ .fa-html5:before {
1067
+ content: "\f13b";
1068
+ }
1069
+ .fa-css3:before {
1070
+ content: "\f13c";
1071
+ }
1072
+ .fa-anchor:before {
1073
+ content: "\f13d";
1074
+ }
1075
+ .fa-unlock-alt:before {
1076
+ content: "\f13e";
1077
+ }
1078
+ .fa-bullseye:before {
1079
+ content: "\f140";
1080
+ }
1081
+ .fa-ellipsis-h:before {
1082
+ content: "\f141";
1083
+ }
1084
+ .fa-ellipsis-v:before {
1085
+ content: "\f142";
1086
+ }
1087
+ .fa-rss-square:before {
1088
+ content: "\f143";
1089
+ }
1090
+ .fa-play-circle:before {
1091
+ content: "\f144";
1092
+ }
1093
+ .fa-ticket:before {
1094
+ content: "\f145";
1095
+ }
1096
+ .fa-minus-square:before {
1097
+ content: "\f146";
1098
+ }
1099
+ .fa-minus-square-o:before {
1100
+ content: "\f147";
1101
+ }
1102
+ .fa-level-up:before {
1103
+ content: "\f148";
1104
+ }
1105
+ .fa-level-down:before {
1106
+ content: "\f149";
1107
+ }
1108
+ .fa-check-square:before {
1109
+ content: "\f14a";
1110
+ }
1111
+ .fa-pencil-square:before {
1112
+ content: "\f14b";
1113
+ }
1114
+ .fa-external-link-square:before {
1115
+ content: "\f14c";
1116
+ }
1117
+ .fa-share-square:before {
1118
+ content: "\f14d";
1119
+ }
1120
+ .fa-compass:before {
1121
+ content: "\f14e";
1122
+ }
1123
+ .fa-toggle-down:before,
1124
+ .fa-caret-square-o-down:before {
1125
+ content: "\f150";
1126
+ }
1127
+ .fa-toggle-up:before,
1128
+ .fa-caret-square-o-up:before {
1129
+ content: "\f151";
1130
+ }
1131
+ .fa-toggle-right:before,
1132
+ .fa-caret-square-o-right:before {
1133
+ content: "\f152";
1134
+ }
1135
+ .fa-euro:before,
1136
+ .fa-eur:before {
1137
+ content: "\f153";
1138
+ }
1139
+ .fa-gbp:before {
1140
+ content: "\f154";
1141
+ }
1142
+ .fa-dollar:before,
1143
+ .fa-usd:before {
1144
+ content: "\f155";
1145
+ }
1146
+ .fa-rupee:before,
1147
+ .fa-inr:before {
1148
+ content: "\f156";
1149
+ }
1150
+ .fa-cny:before,
1151
+ .fa-rmb:before,
1152
+ .fa-yen:before,
1153
+ .fa-jpy:before {
1154
+ content: "\f157";
1155
+ }
1156
+ .fa-ruble:before,
1157
+ .fa-rouble:before,
1158
+ .fa-rub:before {
1159
+ content: "\f158";
1160
+ }
1161
+ .fa-won:before,
1162
+ .fa-krw:before {
1163
+ content: "\f159";
1164
+ }
1165
+ .fa-bitcoin:before,
1166
+ .fa-btc:before {
1167
+ content: "\f15a";
1168
+ }
1169
+ .fa-file:before {
1170
+ content: "\f15b";
1171
+ }
1172
+ .fa-file-text:before {
1173
+ content: "\f15c";
1174
+ }
1175
+ .fa-sort-alpha-asc:before {
1176
+ content: "\f15d";
1177
+ }
1178
+ .fa-sort-alpha-desc:before {
1179
+ content: "\f15e";
1180
+ }
1181
+ .fa-sort-amount-asc:before {
1182
+ content: "\f160";
1183
+ }
1184
+ .fa-sort-amount-desc:before {
1185
+ content: "\f161";
1186
+ }
1187
+ .fa-sort-numeric-asc:before {
1188
+ content: "\f162";
1189
+ }
1190
+ .fa-sort-numeric-desc:before {
1191
+ content: "\f163";
1192
+ }
1193
+ .fa-thumbs-up:before {
1194
+ content: "\f164";
1195
+ }
1196
+ .fa-thumbs-down:before {
1197
+ content: "\f165";
1198
+ }
1199
+ .fa-youtube-square:before {
1200
+ content: "\f166";
1201
+ }
1202
+ .fa-youtube:before {
1203
+ content: "\f167";
1204
+ }
1205
+ .fa-xing:before {
1206
+ content: "\f168";
1207
+ }
1208
+ .fa-xing-square:before {
1209
+ content: "\f169";
1210
+ }
1211
+ .fa-youtube-play:before {
1212
+ content: "\f16a";
1213
+ }
1214
+ .fa-dropbox:before {
1215
+ content: "\f16b";
1216
+ }
1217
+ .fa-stack-overflow:before {
1218
+ content: "\f16c";
1219
+ }
1220
+ .fa-instagram:before {
1221
+ content: "\f16d";
1222
+ }
1223
+ .fa-flickr:before {
1224
+ content: "\f16e";
1225
+ }
1226
+ .fa-adn:before {
1227
+ content: "\f170";
1228
+ }
1229
+ .fa-bitbucket:before {
1230
+ content: "\f171";
1231
+ }
1232
+ .fa-bitbucket-square:before {
1233
+ content: "\f172";
1234
+ }
1235
+ .fa-tumblr:before {
1236
+ content: "\f173";
1237
+ }
1238
+ .fa-tumblr-square:before {
1239
+ content: "\f174";
1240
+ }
1241
+ .fa-long-arrow-down:before {
1242
+ content: "\f175";
1243
+ }
1244
+ .fa-long-arrow-up:before {
1245
+ content: "\f176";
1246
+ }
1247
+ .fa-long-arrow-left:before {
1248
+ content: "\f177";
1249
+ }
1250
+ .fa-long-arrow-right:before {
1251
+ content: "\f178";
1252
+ }
1253
+ .fa-apple:before {
1254
+ content: "\f179";
1255
+ }
1256
+ .fa-windows:before {
1257
+ content: "\f17a";
1258
+ }
1259
+ .fa-android:before {
1260
+ content: "\f17b";
1261
+ }
1262
+ .fa-linux:before {
1263
+ content: "\f17c";
1264
+ }
1265
+ .fa-dribbble:before {
1266
+ content: "\f17d";
1267
+ }
1268
+ .fa-skype:before {
1269
+ content: "\f17e";
1270
+ }
1271
+ .fa-foursquare:before {
1272
+ content: "\f180";
1273
+ }
1274
+ .fa-trello:before {
1275
+ content: "\f181";
1276
+ }
1277
+ .fa-female:before {
1278
+ content: "\f182";
1279
+ }
1280
+ .fa-male:before {
1281
+ content: "\f183";
1282
+ }
1283
+ .fa-gittip:before {
1284
+ content: "\f184";
1285
+ }
1286
+ .fa-sun-o:before {
1287
+ content: "\f185";
1288
+ }
1289
+ .fa-moon-o:before {
1290
+ content: "\f186";
1291
+ }
1292
+ .fa-archive:before {
1293
+ content: "\f187";
1294
+ }
1295
+ .fa-bug:before {
1296
+ content: "\f188";
1297
+ }
1298
+ .fa-vk:before {
1299
+ content: "\f189";
1300
+ }
1301
+ .fa-weibo:before {
1302
+ content: "\f18a";
1303
+ }
1304
+ .fa-renren:before {
1305
+ content: "\f18b";
1306
+ }
1307
+ .fa-pagelines:before {
1308
+ content: "\f18c";
1309
+ }
1310
+ .fa-stack-exchange:before {
1311
+ content: "\f18d";
1312
+ }
1313
+ .fa-arrow-circle-o-right:before {
1314
+ content: "\f18e";
1315
+ }
1316
+ .fa-arrow-circle-o-left:before {
1317
+ content: "\f190";
1318
+ }
1319
+ .fa-toggle-left:before,
1320
+ .fa-caret-square-o-left:before {
1321
+ content: "\f191";
1322
+ }
1323
+ .fa-dot-circle-o:before {
1324
+ content: "\f192";
1325
+ }
1326
+ .fa-wheelchair:before {
1327
+ content: "\f193";
1328
+ }
1329
+ .fa-vimeo-square:before {
1330
+ content: "\f194";
1331
+ }
1332
+ .fa-turkish-lira:before,
1333
+ .fa-try:before {
1334
+ content: "\f195";
1335
+ }
1336
+ .fa-plus-square-o:before {
1337
+ content: "\f196";
1338
+ }
backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css.gz ADDED
Binary file (4.23 kB). View file