diff --git a/.dockerignore b/.dockerignore index 87b5c14b..8f266283 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,6 +5,7 @@ contrib init-scripts package pylintrc +snap *.md !CHANGELOG*.md start.bat diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 44e3f7c6..79319ae1 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ github: JonnyWong16 patreon: Tautulli -custom: ["https://bit.ly/2InPp15"] \ No newline at end of file +custom: ["https://bit.ly/2InPp15", "https://bit.ly/2WTq83m"] \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml new file mode 100644 index 00000000..34f617df --- /dev/null +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -0,0 +1,103 @@ +name: Bug Report +description: Please do not use bug reports for support issues. +labels: ['status:awaiting-triage', 'type:bug'] +body: + - type: markdown + attributes: + value: | + **THIS IS NOT THE PLACE TO ASK FOR SUPPORT!** Please use [Discord](https://tautulli.com/discord) for support issues. + - type: textarea + id: description + attributes: + label: Describe the Bug + description: A clear and concise description of the bug. + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to Reproduce + description: List each action required in order to reproduce the issue. + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. Scroll down to '...' + 4. See error + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: Provide screenshots to help explain your problem. + - type: textarea + id: relevant + attributes: + label: Relevant Settings + description: Include all settings/configuration that are relevant to your issue. For example, Plex Media Server, newsletter, or notification settings. + placeholder: | + - eg. Plex Media Server IP address/port/checkboxes/proxy/etc. + - eg. Notification agent configuration/triggers/conditions/text/delay/grouping/etc. + - eg. Newsletter agent configuration/checkboxes/template/etc. + - Other settings + - type: input + id: version + attributes: + label: Tautulli Version + description: Check Tautulli Settings > Help & Info page. + placeholder: eg. v2.7.5 + validations: + required: true + - type: input + id: branch + attributes: + label: Git Branch + description: Check Tautulli Settings > Help & Info page. + placeholder: eg. master + validations: + required: true + - type: input + id: hash + attributes: + label: Git Commit Hash + description: Check Tautulli Settings > Help & Info page. + placeholder: eg. 2cc5bf812fe05e0666aeaeb37ed550c59816fb4c + validations: + required: true + - type: input + id: platform + attributes: + label: Platform and Version + description: Check Tautulli Settings > Help & Info page. + placeholder: eg. Windows 10 + validations: + required: true + - type: input + id: python + attributes: + label: Python Version + description: Check Tautulli Settings > Help & Info page. + placeholder: eg. 3.8.10 + validations: + required: true + - type: input + id: browser + attributes: + label: Browser and Version + placeholder: eg. Chrome 88 + validations: + required: true + - type: input + id: logs + attributes: + label: Link to Logs + description: Include a link to your **FULL** logs (not just a few lines) on [Gist](http://gist.github.com). + validations: + required: true + - type: markdown + attributes: + value: | + Make sure to close your issue when it's solved! If you found the solution yourself please comment so that others benefit from it. diff --git a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml new file mode 100644 index 00000000..70e2ab33 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml @@ -0,0 +1,31 @@ +name: Feature Request +description: Suggest a new feature for Tautulli. +labels: ['status:awaiting-triage', 'type:enhancement'] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to help improve Tautulli! + - type: textarea + id: problem + attributes: + label: Is your feature request related to a problem? + description: If so, please provide clear and concise description of the problem. + placeholder: eg. I'm always frustrated when '...' + - type: textarea + id: feature + attributes: + label: What is your feature request? + description: A clear and concise description of the feature. + validations: + required: true + - type: textarea + id: workaround + attributes: + label: Are there any workarounds? + description: A clear and concise description of any alternative solutions or features you've considered. + - type: textarea + id: additional + attributes: + label: Additional Context + description: Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..16aef760 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Tautulli Wiki + url: https://github.com/Tautulli/Tautulli/wiki + about: Please check the wiki to see if your question has already been answered. + - name: Discord + url: https://tautulli.com/discord + about: Please use Discord to ask for support. diff --git a/.github/codeql-config.yml b/.github/codeql-config.yml new file mode 100644 index 00000000..574f9b33 --- /dev/null +++ b/.github/codeql-config.yml @@ -0,0 +1,4 @@ +name: CodeQL Config + +paths-ignore: + - lib diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..1028cc5a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + target-branch: "nightly" + open-pull-requests-limit: 20 + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" + target-branch: "nightly" + open-pull-requests-limit: 20 diff --git a/.github/label-actions.yml b/.github/label-actions.yml new file mode 100644 index 00000000..ae236e9a --- /dev/null +++ b/.github/label-actions.yml @@ -0,0 +1,48 @@ +# Configuration for Label Actions - https://github.com/dessant/label-actions + +added: + comment: > + This feature has been added and will be available in the next release of Tautulli. + This issue will be automatically closed once the update is available. + +fixed: + comment: > + This bug has been fixed and will be available in the next release of Tautulli. + This issue will be automatically closed once the update is available. + +invalid:duplicate: + comment: > + :wave: @{issue-author}, this appears to be a duplicate of a pre-existing issue. + close: true + lock: true + unlabel: 'status:awaiting-triage' + +-invalid:duplicate: + reopen: true + unlock: true + +invalid:support: + comment: > + :wave: @{issue-author}, we use the issue tracker exclusively for bug reports. + However, this issue appears to be a support request. Please use our + [Discord Server](https://tautulli.com/discord) to get help with Tautulli. Thanks. + close: true + lock: true + lock-reason: 'off-topic' + unlabel: 'status:awaiting-triage' + +-invalid:support: + reopen: true + unlock: true + +invalid:template-incomplete: + issues: + comment: > + :wave: @{issue-author}, please edit your issue to complete the template with + all the required info. Your issue will be automatically closed in 5 days if + the template is not completed. Thanks. + prs: + comment: > + :wave: @{issue-author}, please edit your PR to complete the template with + all the required info. Your PR will be automatically closed in 5 days if + the template is not completed. Thanks. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..63ab24be --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,26 @@ +## Description + +Please include a summary of the changes. + +### Screenshot + +Include screenshots if the changes are UI-related. + +### Issues Fixed or Closed + +- Fixes #(issue) + +## Type of Change + +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## Checklist + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have added or updated the docstring for new or existing methods diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..e9c8e05d --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,38 @@ +name: CodeQL + +on: + push: + branches: [nightly] + pull_request: + branches: [nightly] + schedule: + - cron: '05 10 * * 1' + +jobs: + codeql-analysis: + name: CodeQL Analysis + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ['javascript', 'python'] + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + config-file: ./.github/codeql-config.yml + languages: ${{ matrix.language }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/issues-stale.yml b/.github/workflows/issues-stale.yml new file mode 100644 index 00000000..b805e266 --- /dev/null +++ b/.github/workflows/issues-stale.yml @@ -0,0 +1,48 @@ +name: Stale Issues / PRs + +on: + schedule: + - cron: '00 19 * * *' + +jobs: + stale: + name: Check Issues / PRs + runs-on: ubuntu-latest + steps: + - name: Stale + uses: actions/stale@v9 + with: + stale-issue-message: > + This issue is stale because it has been open for 30 days with no activity. + Remove the stale label or comment, otherwise this will be closed in 5 days. + close-issue-message: > + This issue was closed because it has been stalled for 5 days with no activity. + stale-issue-label: 'stale' + exempt-issue-labels: 'added,fixed,type:enhancement,status:awaiting-triage,status:in-progress' + stale-pr-message: > + This PR is stale because it has been open for 30 days with no activity. + Remove the stale label or comment, otherwise this will be closed in 5 days. + close-pr-message: > + This PR was closed because it has been stalled for 5 days with no activity. + stale-pr-label: 'stale' + exempt-pr-labels: 'status:in-progress,status:in-review,dependencies' + days-before-stale: 30 + days-before-close: 5 + + - name: Invalid Template + uses: actions/stale@v9 + with: + stale-issue-message: > + Invalid issues template. + close-issue-message: > + This issue was closed because the the template was not completed after 5 days. + stale-issue-label: 'invalid:template-incomplete' + stale-pr-message: > + Invalid PR template. + close-pr-message: > + This PR was closed because the the template was not completed after 5 days. + stale-pr-label: 'invalid:template-incomplete' + exempt-pr-labels: 'status:in-progress,status:in-review,dependencies' + only-labels: 'invalid:template-incomplete' + days-before-stale: 0 + days-before-close: 5 diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml new file mode 100644 index 00000000..a60987f5 --- /dev/null +++ b/.github/workflows/issues.yml @@ -0,0 +1,15 @@ +name: Issues + +on: + issues: + types: [labeled, unlabeled] + +jobs: + label: + name: Label Issues + runs-on: ubuntu-latest + steps: + - name: Label Issues + uses: dessant/label-actions@v4 + with: + github-token: ${{ github.token }} diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 0b91ff07..62c3f86c 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -1,95 +1,108 @@ name: Publish Docker + on: + workflow_dispatch: ~ push: - branches: [master, beta, nightly, python3] + branches: [master, beta, nightly] tags: [v*] + jobs: - build: + build-docker: + name: Build Docker Image runs-on: ubuntu-latest + if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }} steps: - name: Checkout Code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Prepare id: prepare run: | if [[ $GITHUB_REF == refs/tags/* ]]; then - echo ::set-output name=tag::${GITHUB_REF#refs/tags/} + echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT elif [[ $GITHUB_REF == refs/heads/master ]]; then - echo ::set-output name=tag::latest + echo "tag=latest" >> $GITHUB_OUTPUT else - echo ::set-output name=tag::${GITHUB_REF#refs/heads/} + echo "tag=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT fi - if [[ $GITHUB_REF == refs/tags/* ]]; then - echo ::set-output name=branch::master + if [[ $GITHUB_REF == refs/tags/*-beta ]]; then + echo "branch=beta" >> $GITHUB_OUTPUT + elif [[ $GITHUB_REF == refs/tags/* ]]; then + echo "branch=master" >> $GITHUB_OUTPUT else - echo ::set-output name=branch::${GITHUB_REF#refs/heads/} + echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT fi - echo ::set-output name=commit::${GITHUB_SHA} - echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ') - echo ::set-output name=docker_platforms::linux/amd64,linux/arm64,linux/arm - echo ::set-output name=docker_image::${{ secrets.DOCKER_REPO }}/tautulli + echo "commit=${GITHUB_SHA}" >> $GITHUB_OUTPUT + echo "docker_platforms=linux/amd64,linux/arm64/v8,linux/arm/v7,linux/arm/v6" >> $GITHUB_OUTPUT + echo "docker_image=${{ secrets.DOCKER_REPO }}/tautulli" >> $GITHUB_OUTPUT + + - name: Set Up QEMU + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 id: buildx - uses: crazy-max/ghaction-docker-buildx@v3 with: - buildx-version: latest + version: latest - name: Cache Docker Layers - id: cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - - name: Docker Buildx (no push) - run: | - docker buildx build \ - --cache-from "type=local,src=/tmp/.buildx-cache" \ - --cache-to "type=local,dest=/tmp/.buildx-cache" \ - --platform ${{ steps.prepare.outputs.docker_platforms }} \ - --output "type=image,push=false" \ - --build-arg "TAG=${{ steps.prepare.outputs.tag }}" \ - --build-arg "BRANCH=${{ steps.prepare.outputs.branch }}" \ - --build-arg "COMMIT=${{ steps.prepare.outputs.commit }}" \ - --build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \ - --tag "${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}" \ - --file Dockerfile . - - - name: Docker Login + - name: Login to DockerHub + uses: docker/login-action@v3 if: success() - env: - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - run: | - echo "${DOCKER_PASSWORD}" | docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} - - name: Docker Buildx (push) + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 if: success() - run: | - docker buildx build \ - --cache-from "type=local,src=/tmp/.buildx-cache" \ - --platform ${{ steps.prepare.outputs.docker_platforms }} \ - --output "type=image,push=true" \ - --build-arg "TAG=${{ steps.prepare.outputs.tag }}" \ - --build-arg "BRANCH=${{ steps.prepare.outputs.branch }}" \ - --build-arg "COMMIT=${{ steps.prepare.outputs.commit }}" \ - --build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \ - --tag "${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}" \ - --file Dockerfile . + with: + registry: ghcr.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.GHCR_TOKEN }} - - name: Clear - if: always() - run: | - rm -f ${HOME}/.docker/config.json + - name: Extract Docker Metadata + id: metadata + uses: docker/metadata-action@v5 + with: + images: ${{ steps.prepare.outputs.docker_image }} + - name: Docker Build and Push + uses: docker/build-push-action@v6 + if: success() + with: + context: . + file: ./Dockerfile + push: true + platforms: ${{ steps.prepare.outputs.docker_platforms }} + build-args: | + TAG=${{ steps.prepare.outputs.tag }} + BRANCH=${{ steps.prepare.outputs.branch }} + COMMIT=${{ steps.prepare.outputs.commit }} + tags: | + ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }} + ghcr.io/${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }} + labels: ${{ steps.metadata.outputs.labels }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + + discord: + name: Discord Notification + needs: build-docker + if: always() && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: - name: Post Status to Discord uses: sarisia/actions-status-discord@v1 - if: always() with: webhook: ${{ secrets.DISCORD_WEBHOOK }} - status: ${{ job.status }} + status: ${{ needs.build-docker.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }} title: ${{ github.workflow }} nofail: true diff --git a/.github/workflows/publish-installers.yml b/.github/workflows/publish-installers.yml new file mode 100644 index 00000000..b4a66960 --- /dev/null +++ b/.github/workflows/publish-installers.yml @@ -0,0 +1,178 @@ +name: Publish Installers + +on: + workflow_dispatch: ~ + push: + branches: [master, beta, nightly] + tags: [v*] + +env: + PYTHON_VERSION: '3.11' + +jobs: + build-installer: + name: Build ${{ matrix.os_upper }} Installer + runs-on: ${{ matrix.os }}-${{ matrix.os_version }} + if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }} + strategy: + fail-fast: false + matrix: + include: + - os: 'windows' + os_upper: 'Windows' + os_version: 'latest' + arch: 'x64' + ext: 'exe' + - os: 'macos' + os_upper: 'MacOS' + os_version: '14' + arch: 'universal' + ext: 'pkg' + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set Release Version + id: get_version + shell: bash + run: | + if [[ $GITHUB_REF == refs/tags/* ]]; then + echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV + VERSION_NSIS=${GITHUB_REF#refs/tags/v}.1 + echo "VERSION_NSIS=${VERSION_NSIS/%-beta.1/.0}" >> $GITHUB_OUTPUT + echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + else + echo "VERSION=0.0.0" >> $GITHUB_ENV + echo "VERSION_NSIS=0.0.0.0" >> $GITHUB_OUTPUT + echo "VERSION=0.0.0" >> $GITHUB_OUTPUT + echo "RELEASE_VERSION=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT + fi + if [[ $GITHUB_REF == refs/tags/*-beta ]]; then + echo "beta" > branch.txt + elif [[ $GITHUB_REF == refs/tags/* ]]; then + echo "master" > branch.txt + else + echo ${GITHUB_REF#refs/heads/} > branch.txt + fi + echo $GITHUB_SHA > version.txt + + - name: Set Up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + cache: pip + cache-dependency-path: '**/requirements*.txt' + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r package/requirements-package.txt --no-binary cffi + + - name: Build Package + run: | + pyinstaller -y ./package/Tautulli-${{ matrix.os }}.spec + + - name: Create Windows Installer + uses: joncloud/makensis-action@v4.1 + if: matrix.os == 'windows' + with: + script-file: ./package/Tautulli.nsi + arguments: > + /DVERSION=${{ steps.get_version.outputs.VERSION_NSIS }} + /DINSTALLER_NAME=..\Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }} + additional-plugin-paths: package/nsis-plugins + + - name: Create MacOS Installer + if: matrix.os == 'macos' + run: | + sudo pkgbuild \ + --install-location /Applications \ + --version ${{ steps.get_version.outputs.VERSION }} \ + --component ./dist/Tautulli.app \ + --scripts ./package/macos-scripts \ + Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }} + + - name: Upload Installer + uses: actions/upload-artifact@v4 + with: + name: Tautulli-${{ matrix.os }}-installer + path: Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }} + + virus-total: + name: VirusTotal Scan + needs: build-installer + if: needs.build-installer.result == 'success' && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: + - name: Download Installers + if: needs.build-installer.result == 'success' + uses: actions/download-artifact@v4 + + - name: Upload to VirusTotal + uses: crazy-max/ghaction-virustotal@v4 + with: + vt_api_key: ${{ secrets.VT_API_KEY }} + files: | + Tautulli-windows-installer/Tautulli-windows-*-x64.exe + Tautulli-macos-installer/Tautulli-macos-*-universal.pkg + + release: + name: Release Installers + needs: build-installer + if: always() && startsWith(github.ref, 'refs/tags/') && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set Release Version + id: get_version + run: | + echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + + - name: Download Installers + if: needs.build-installer.result == 'success' + uses: actions/download-artifact@v4 + + - name: Get Changelog + id: get_changelog + run: | + CHANGELOG="$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md \ + | sed '$d' | sed '$d' | sed '$d' )" + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + echo "CHANGELOG<<$EOF" >> $GITHUB_OUTPUT + echo "$CHANGELOG" >> $GITHUB_OUTPUT + echo "$EOF" >> $GITHUB_OUTPUT + + - name: Create Release + uses: softprops/action-gh-release@v2 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GHACTIONS_TOKEN }} + with: + tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }} + name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }} + body: | + ## Changelog + + ##${{ steps.get_changelog.outputs.CHANGELOG }} + prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }} + files: | + Tautulli-windows-installer/Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe + Tautulli-macos-installer/Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-universal.pkg + + discord: + name: Discord Notification + needs: [build-installer, release] + if: always() && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: + - name: Post Status to Discord + uses: sarisia/actions-status-discord@v1 + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ needs.build-installer.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }} + title: ${{ github.workflow }} + nofail: true diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml deleted file mode 100644 index 5820df6b..00000000 --- a/.github/workflows/publish-release.yml +++ /dev/null @@ -1,204 +0,0 @@ -name: Publish Release -on: - push: - branches: [master, beta, nightly, python3] - tags: [v*] - -jobs: - build-windows: - runs-on: windows-latest - steps: - - name: Checkout Code - uses: actions/checkout@v2 - - - name: Set Release Version - id: get_version - shell: bash - run: | - if [[ $GITHUB_REF == refs/tags/* ]]; then - VERSION_NSIS=${GITHUB_REF#refs/tags/v}.1 - echo ::set-output name=VERSION_NSIS::${VERSION_NSIS/%-beta.1/.0} - echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} - echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} - else - echo ::set-output name=VERSION_NSIS::0.0.0.0 - echo ::set-output name=VERSION::0.0.0 - echo ::set-output name=RELEASE_VERSION::${GITHUB_SHA::7} - fi - echo $GITHUB_SHA > version.txt - - - name: Set Up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Cache Dependencies - id: cache_dependencies - uses: actions/cache@v2 - with: - path: ~\AppData\Local\pip\Cache - key: ${{ runner.os }}-pip-${{ hashFiles('package/requirements-windows.txt') }} - restore-keys: ${{ runner.os }}-pip- - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r package/requirements-windows.txt - - - name: Build Package - run: | - pyinstaller -y ./package/Tautulli-windows.spec - - - name: Create Installer - uses: joncloud/makensis-action@v1.2 - with: - script-file: ./package/Tautulli.nsi - arguments: /DVERSION=${{ steps.get_version.outputs.VERSION_NSIS }} /DINSTALLER_NAME=..\Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe - include-more-plugins: true - include-custom-plugins-path: package/nsis-plugins - - - name: Upload Installer - uses: actions/upload-artifact@v2 - with: - name: Tautulli-windows-installer - path: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe - - - name: Post Status to Discord - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK }} - status: ${{ job.status }} - title: Build Windows Installer - nofail: true - - build-macos: - runs-on: macos-latest - steps: - - name: Checkout Code - uses: actions/checkout@v2 - - - name: Set Release Version - id: get_version - shell: bash - run: | - if [[ $GITHUB_REF == refs/tags/* ]]; then - echo ::set-env name=VERSION::${GITHUB_REF#refs/tags/v} - echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} - echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} - else - echo ::set-env name=VERSION::0.0.0 - echo ::set-output name=VERSION::0.0.0 - echo ::set-output name=RELEASE_VERSION::${GITHUB_SHA::7} - fi - echo $GITHUB_SHA > version.txt - - - name: Set Up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Cache Dependencies - id: cache_dependencies - uses: actions/cache@v2 - with: - path: ~/Library/Caches/pip - key: ${{ runner.os }}-pip-${{ hashFiles('package/requirements-macos.txt') }} - restore-keys: ${{ runner.os }}-pip- - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r package/requirements-macos.txt - - - name: Build Package - run: | - pyinstaller -y ./package/Tautulli-macos.spec - - - name: Create Installer - run: | - sudo pkgbuild --install-location /Applications --version ${{ steps.get_version.outputs.VERSION }} --component ./dist/Tautulli.app --scripts ./package/macos-scripts Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg - - - name: Upload Installer - uses: actions/upload-artifact@v2 - with: - name: Tautulli-macos-installer - path: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg - - - name: Post Status to Discord - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK }} - status: ${{ job.status }} - title: Build MacOS Installer - nofail: true - - release: - needs: [build-windows, build-macos] - if: startsWith(github.ref, 'refs/tags/') && always() - runs-on: ubuntu-latest - steps: - - name: Get Build Job Status - uses: technote-space/workflow-conclusion-action@v1 - - - name: Checkout Code - uses: actions/checkout@v2 - - - name: Set Release Version - id: get_version - run: | - echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/} - - - name: Download Windows Installer - if: env.WORKFLOW_CONCLUSION == 'success' - uses: actions/download-artifact@v2 - with: - name: Tautulli-windows-installer - - - name: Download MacOS Installer - if: env.WORKFLOW_CONCLUSION == 'success' - uses: actions/download-artifact@v2 - with: - name: Tautulli-macos-installer - - - name: Get Changelog - id: get_changelog - run: echo ::set-output name=CHANGELOG::"$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md | sed '$d' | sed '$d' | sed '$d' | sed ':a;N;$!ba;s/\n/%0A/g' )" - - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }} - release_name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }} - body: | - ## Changelog - - ##${{ steps.get_changelog.outputs.CHANGELOG }} - draft: false - prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }} - - - name: Upload Windows Installer - if: env.WORKFLOW_CONCLUSION == 'success' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe - asset_name: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe - asset_content_type: application/vnd.microsoft.portable-executable - - - name: Upload MacOS Installer - if: env.WORKFLOW_CONCLUSION == 'success' - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg - asset_name: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg - asset_content_type: application/vnd.apple.installer+xml diff --git a/.github/workflows/publish-snap.yml b/.github/workflows/publish-snap.yml new file mode 100644 index 00000000..b3898a38 --- /dev/null +++ b/.github/workflows/publish-snap.yml @@ -0,0 +1,78 @@ +name: Publish Snap + +on: + workflow_dispatch: ~ + push: + branches: [master, beta, nightly] + tags: [v*] + +jobs: + build-snap: + name: Build Snap Package (${{ matrix.architecture }}) + runs-on: ubuntu-latest + if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }} + strategy: + fail-fast: false + matrix: + architecture: + - amd64 + - arm64 + - armhf + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Prepare + id: prepare + run: | + git fetch --prune --unshallow --tags + if [[ $GITHUB_REF == refs/tags/*-beta || $GITHUB_REF == refs/heads/beta ]]; then + echo "RELEASE=beta" >> $GITHUB_OUTPUT + elif [[ $GITHUB_REF == refs/tags/* || $GITHUB_REF == refs/heads/master ]]; then + echo "RELEASE=stable" >> $GITHUB_OUTPUT + else + echo "RELEASE=edge" >> $GITHUB_OUTPUT + fi + + - name: Set Up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Build Snap Package + uses: diddlesnaps/snapcraft-multiarch-action@master + id: build + with: + architecture: ${{ matrix.architecture }} + + - name: Upload Snap Package + uses: actions/upload-artifact@v4 + with: + name: Tautulli-snap-package-${{ matrix.architecture }} + path: ${{ steps.build.outputs.snap }} + + - name: Review Snap Package + uses: diddlesnaps/snapcraft-review-tools-action@master + with: + snap: ${{ steps.build.outputs.snap }} + + - name: Publish Snap Package + uses: snapcore/action-publish@v1 + if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/nightly' + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_LOGIN }} + with: + snap: ${{ steps.build.outputs.snap }} + release: ${{ steps.prepare.outputs.RELEASE }} + + discord: + name: Discord Notification + needs: build-snap + if: always() && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: + - name: Post Status to Discord + uses: sarisia/actions-status-discord@v1 + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ needs.build-snap.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }} + title: ${{ github.workflow }} + nofail: true diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml new file mode 100644 index 00000000..ac550fe2 --- /dev/null +++ b/.github/workflows/pull-requests.yml @@ -0,0 +1,27 @@ +name: Pull Requests + +on: + pull_request_target: + types: [opened, synchronize, edited, reopened] + +jobs: + check-branch: + name: Check Pull Request + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Comment on Pull Request + uses: mshick/add-pr-comment@v2 + if: github.base_ref != 'nightly' + with: + message: Pull requests must be made to the `nightly` branch. Thanks. + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Fail Workflow + if: github.base_ref != 'nightly' + run: | + echo Base: "$GITHUB_BASE_REF" + echo Head: "$GITHUB_HEAD_REF" + exit 1 diff --git a/.github/workflows/submit-winget.yml b/.github/workflows/submit-winget.yml new file mode 100644 index 00000000..efa6cee7 --- /dev/null +++ b/.github/workflows/submit-winget.yml @@ -0,0 +1,44 @@ +name: Submit winget + +on: + workflow_dispatch: ~ + release: + types: [published] + +jobs: + winget: + name: Submit Winget Package + runs-on: windows-latest + if: ${{ !github.event.release.prerelease }} + steps: + - name: Sync Winget Fork + run: gh repo sync ${{ secrets.WINGET_USERNAME }}/winget-pkgs -b master + env: + GH_TOKEN: ${{ secrets.WINGET_TOKEN }} + + - name: Submit package to Windows Package Manager Community Repository + run: | + $wingetPackage = "Tautulli.Tautulli" + $gitToken = "${{ secrets.WINGET_TOKEN }}" + + $github = Invoke-RestMethod -uri "https://api.github.com/repos/Tautulli/Tautulli/releases/latest" + $installerUrl = $github | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match "Tautulli-windows-.*-x64.exe" | Select -ExpandProperty browser_download_url + $version = "$($github.tag_name.Trim('v')).1" + + # getting latest wingetcreate file + iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe + .\wingetcreate.exe update $wingetPackage -s -v $version -u $installerUrl -t $gitToken + + virus-total: + name: VirusTotal Scan + runs-on: ubuntu-latest + steps: + - name: Upload to VirusTotal + uses: crazy-max/ghaction-virustotal@v4 + with: + vt_api_key: ${{ secrets.VT_API_KEY }} + github_token: ${{ secrets.GHACTIONS_TOKEN }} + update_release_body: true + files: | + .exe$ + .pkg$ diff --git a/.gitignore b/.gitignore index 6bb5c9b5..1e54132b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Compiled source # ################### +__pycache__ *.pyc *.py~ *.pyproj @@ -14,13 +15,22 @@ *.ini release.lock version.lock +lib/*.dist-info +lib/*.egg-info +lib/*.pth +lib/*/*.pyd +lib/_distutils_hack +lib/pkg_resources +lib/setuptools logs/* backups/* cache/* +exports/* newsletters/* *.mmdb version.txt branch.txt +.TEST # HTTPS Cert/Key # ################## @@ -43,6 +53,9 @@ Thumbs.db #Ignore files generated by PyCharm *.idea/* +#Ignore files generated by VSCode +*.vscode/* + #Ignore files generated by vi *.swp @@ -63,7 +76,6 @@ Thumbs.db *.bak *.cache *.ilk -*.log [Bb]in [Dd]ebug*/ *.lib @@ -80,3 +92,12 @@ _ReSharper*/ #Ignore files generated by pyinstaller /build /dist + +#snapcraft specifics +/parts/ +/stage/ +/prime/ +*.snap +.snapcraft +*_source.tar.bz2 +snap/.snapcraft \ No newline at end of file diff --git a/API.md b/API.md index 5f8c3dc6..827c7c6b 100644 --- a/API.md +++ b/API.md @@ -1,2895 +1,3 @@ # API Reference -## General structure -The API endpoint is -``` -http://IP_ADDRESS:PORT + [/HTTP_ROOT] + /api/v2?apikey=$apikey&cmd=$command -``` - -Example: -``` -http://localhost:8181/api/v2?apikey=66198313a092496b8a725867d2223b5f&cmd=get_metadata&rating_key=153037 -``` - -Response example (default `json`) -``` -{ - "response": { - "data": [ - { - "loglevel": "INFO", - "msg": "Signal 2 caught, saving and exiting...", - "thread": "MainThread", - "time": "22-sep-2015 01:42:56 " - } - ], - "message": null, - "result": "success" - } -} -``` -``` -General optional parameters: - - out_type: "json" or "xml" - callback: "pong" - debug: 1 -``` - -## API methods - -### add_newsletter_config -Add a new notification agent. - -``` -Required parameters: - agent_id (int): The newsletter type to add - -Optional parameters: - None - -Returns: - None -``` - - -### add_notifier_config -Add a new notification agent. - -``` -Required parameters: - agent_id (int): The notification agent to add - -Optional parameters: - None - -Returns: - None -``` - - -### arnold -Get to the chopper! - - -### backup_config -Create a manual backup of the `config.ini` file. - - -### backup_db -Create a manual backup of the `plexpy.db` file. - - -### delete_all_library_history -Delete all Tautulli history for a specific library. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - server_id (str): The Plex server identifier of the library section - row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" - -Returns: - None -``` - - -### delete_all_user_history -Delete all Tautulli history for a specific user. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" - -Returns: - None -``` - - -### delete_cache -Delete and recreate the cache directory. - - -### delete_history -Delete history rows from Tautulli. - -``` -Required parameters: - row_ids (str): Comma separated row ids to delete, e.g. "65,110,2,3645" - -Optional parameters: - None - -Returns: - None -``` - - -### delete_hosted_images -Delete the images uploaded to image hosting services. - -``` -Required parameters: - None - -Optional parameters: - rating_key (int): 1234 - (Note: Must be the movie, show, season, artist, or album rating key) - service (str): 'imgur' or 'cloudinary' - delete_all (bool): 'true' to delete all images form the service - -Returns: - json: - {"result": "success", - "message": "Deleted hosted images from Imgur."} -``` - - -### delete_image_cache -Delete and recreate the image cache directory. - - -### delete_library -Delete a library section from Tautulli. Also erases all history for the library. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - server_id (str): The Plex server identifier of the library section - row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" - -Returns: - None -``` - - -### delete_login_log -Delete the Tautulli login logs. - -``` -Required paramters: - None - -Optional parameters: - None - -Returns: - None -``` - - -### delete_lookup_info -Delete the 3rd party API lookup info. - -``` -Required parameters: - None - -Optional parameters: - rating_key (int): 1234 - (Note: Must be the movie, show, artist, album, or track rating key) - service (str): 'themoviedb' or 'tvmaze' or 'musicbrainz' - delete_all (bool): 'true' to delete all images form the service - -Returns: - json: - {"result": "success", - "message": "Deleted lookup info."} -``` - - -### delete_media_info_cache -Delete the media info table cache for a specific library. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - None - -Returns: - None -``` - - -### delete_mobile_device -Remove a mobile device from the database. - -``` -Required parameters: - mobile_device_id (int): The device id to delete - -Optional parameters: - None - -Returns: - None -``` - - -### delete_newsletter -Remove a newsletter from the database. - -``` -Required parameters: - newsletter_id (int): The newsletter to delete - -Optional parameters: - None - -Returns: - None -``` - - -### delete_newsletter_log -Delete the Tautulli newsletter logs. - -``` -Required paramters: - None - -Optional parameters: - None - -Returns: - None -``` - - -### delete_notification_log -Delete the Tautulli notification logs. - -``` -Required paramters: - None - -Optional parameters: - None - -Returns: - None -``` - - -### delete_notifier -Remove a notifier from the database. - -``` -Required parameters: - notifier_id (int): The notifier to delete - -Optional parameters: - None - -Returns: - None -``` - - -### delete_recently_added -Flush out all of the recently added items in the database. - - -### delete_temp_sessions -Flush out all of the temporary sessions in the database. - - -### delete_user -Delete a user from Tautulli. Also erases all history for the user. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" - -Returns: - None -``` - - -### docs -Return the api docs as a dict where commands are keys, docstring are value. - - -### docs_md -Return the api docs formatted with markdown. - - -### download_config -Download the Tautulli configuration file. - - -### download_database -Download the Tautulli database file. - - -### download_log -Download the Tautulli log file. - - -### download_plex_log -Download the Plex log file. - - -### edit_library -Update a library section on Tautulli. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - custom_thumb (str): The URL for the custom library thumbnail - custom_art (str): The URL for the custom library background art - keep_history (int): 0 or 1 - -Returns: - None -``` - - -### edit_user -Update a user on Tautulli. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional paramters: - friendly_name(str): The friendly name of the user - custom_thumb (str): The URL for the custom user thumbnail - keep_history (int): 0 or 1 - allow_guest (int): 0 or 1 - -Returns: - None -``` - - -### get_activity -Get the current activity on the PMS. - -``` -Required parameters: - None - -Optional parameters: - session_key (int): Session key for the session info to return, OR - session_id (str): Session ID for the session info to return - -Returns: - json: - {"lan_bandwidth": 25318, - "sessions": [ - { - "actors": [ - "Kit Harington", - "Emilia Clarke", - "Isaac Hempstead-Wright", - "Maisie Williams", - "Liam Cunningham", - ], - "added_at": "1461572396", - "allow_guest": 1, - "art": "/library/metadata/1219/art/1503306930", - "aspect_ratio": "1.78", - "audience_rating": "", - "audience_rating_image": "rottentomatoes://image.rating.upright", - "audio_bitrate": "384", - "audio_bitrate_mode": "", - "audio_channel_layout": "5.1(side)", - "audio_channels": "6", - "audio_codec": "ac3", - "audio_decision": "direct play", - "audio_language": "", - "audio_language_code": "", - "audio_profile": "", - "audio_sample_rate": "48000", - "bandwidth": "25318", - "banner": "/library/metadata/1219/banner/1503306930", - "bif_thumb": "/library/parts/274169/indexes/sd/1000", - "bitrate": "10617", - "channel_call_sign": "", - "channel_identifier": "", - "channel_stream": 0, - "channel_thumb": "", - "children_count": "", - "collections": [], - "container": "mkv", - "content_rating": "TV-MA", - "deleted_user": 0, - "device": "Windows", - "directors": [ - "Jeremy Podeswa" - ], - "do_notify": 0, - "duration": "2998272", - "email": "Jon.Snow.1337@CastleBlack.com", - "file": "/media/TV Shows/Game of Thrones/Season 06/Game of Thrones - S06E01 - The Red Woman.mkv", - "file_size": "3979115377", - "friendly_name": "Jon Snow", - "full_title": "Game of Thrones - The Red Woman", - "genres": [ - "Adventure", - "Drama", - "Fantasy" - ], - "grandparent_guid": "com.plexapp.agents.thetvdb://121361?lang=en", - "grandparent_rating_key": "1219", - "grandparent_thumb": "/library/metadata/1219/thumb/1503306930", - "grandparent_title": "Game of Thrones", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "height": "1078", - "id": "", - "indexes": 1, - "ip_address": "10.10.10.1", - "ip_address_public": "64.123.23.111", - "is_admin": 1, - "is_allow_sync": 1, - "is_home_user": 1, - "is_restricted": 0, - "keep_history": 1, - "labels": [], - "last_viewed_at": "1462165717", - "library_name": "TV Shows", - "live": 0, - "live_uuid": "", - "local": "1", - "location": "lan", - "machine_id": "lmd93nkn12k29j2lnm", - "media_index": "1", - "media_type": "episode", - "optimized_version": 0, - "optimized_version_profile": "", - "optimized_version_title": "", - "original_title": "", - "originally_available_at": "2016-04-24", - "parent_guid": "com.plexapp.agents.thetvdb://121361/6?lang=en", - "parent_media_index": "6", - "parent_rating_key": "153036", - "parent_thumb": "/library/metadata/153036/thumb/1503889210", - "parent_title": "Season 6", - "platform": "Plex Media Player", - "platform_name": "plex", - "platform_version": "2.4.1.787-54a020cd", - "player": "Castle-PC", - "product": "Plex Media Player", - "product_version": "3.35.2", - "profile": "Konvergo", - "progress_percent": "0", - "quality_profile": "Original", - "rating": "7.8", - "rating_image": "rottentomatoes://image.rating.ripe", - "rating_key": "153037", - "relay": 0, - "section_id": "2", - "secure": 1, - "session_id": "helf15l3rxgw01xxe0jf3l3d", - "session_key": "27", - "shared_libraries": [ - "10", - "1", - "4", - "5", - "15", - "20", - "2" - ], - "sort_title": "Red Woman", - "state": "playing", - "stream_aspect_ratio": "1.78", - "stream_audio_bitrate": "384", - "stream_audio_bitrate_mode": "", - "stream_audio_channel_layout": "5.1(side)", - "stream_audio_channel_layout_": "5.1(side)", - "stream_audio_channels": "6", - "stream_audio_codec": "ac3", - "stream_audio_decision": "direct play", - "stream_audio_language": "", - "stream_audio_language_code": "", - "stream_audio_sample_rate": "48000", - "stream_bitrate": "10617", - "stream_container": "mkv", - "stream_container_decision": "direct play", - "stream_duration": "2998272", - "stream_subtitle_codec": "", - "stream_subtitle_container": "", - "stream_subtitle_decision": "", - "stream_subtitle_forced": 0, - "stream_subtitle_format": "", - "stream_subtitle_language": "", - "stream_subtitle_language_code": "", - "stream_subtitle_location": "", - "stream_video_bit_depth": "8", - "stream_video_bitrate": "10233", - "stream_video_chroma_subsampling": "4:2:0", - "stream_video_codec": "h264", - "stream_video_codec_level": "41", - "stream_video_color_primaries": "", - "stream_video_color_range": "tv", - "stream_video_color_space": "bt709", - "stream_video_color_trc": "", - "stream_video_decision": "direct play", - "stream_video_dynamic_range": "SDR", - "stream_video_framerate": "24p", - "stream_video_full_resolution": "1080p", - "stream_video_height": "1078", - "stream_video_language": "", - "stream_video_language_code": "", - "stream_video_ref_frames": "4", - "stream_video_resolution": "1080", - "stream_video_scan_type": "progressive", - "stream_video_width": "1920", - "studio": "HBO", - "subtitle_codec": "", - "subtitle_container": "", - "subtitle_decision": "", - "subtitle_forced": 0, - "subtitle_format": "", - "subtitle_language": "", - "subtitle_language_code": "", - "subtitle_location": "", - "subtitles": 0, - "summary": "Jon Snow is dead. Daenerys meets a strong man. Cersei sees her daughter again.", - "synced_version": 0, - "synced_version_profile": "", - "tagline": "", - "throttled": "0", - "thumb": "/library/metadata/153037/thumb/1503889207", - "title": "The Red Woman", - "transcode_audio_channels": "", - "transcode_audio_codec": "", - "transcode_container": "", - "transcode_decision": "direct play", - "transcode_height": "", - "transcode_hw_decode": "", - "transcode_hw_decode_title": "", - "transcode_hw_decoding": 0, - "transcode_hw_encode": "", - "transcode_hw_encode_title": "", - "transcode_hw_encoding": 0, - "transcode_hw_full_pipeline": 0, - "transcode_hw_requested": 0, - "transcode_key": "", - "transcode_progress": 0, - "transcode_protocol": "", - "transcode_speed": "", - "transcode_throttled": 0, - "transcode_video_codec": "", - "transcode_width": "", - "type": "", - "updated_at": "1503889207", - "user": "LordCommanderSnow", - "user_id": 133788, - "user_rating": "", - "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar", - "username": "LordCommanderSnow", - "video_bit_depth": "8", - "video_bitrate": "10233", - "video_chroma_subsampling": "4:2:0", - "video_codec": "h264", - "video_codec_level": "41", - "video_color_primaries": "", - "video_color_range": "tv", - "video_color_space": "bt709", - "video_color_trc": ", - "video_decision": "direct play", - "video_dynamic_range": "SDR", - "video_frame_rate": "23.976", - "video_framerate": "24p", - "video_full_resolution": "1080p", - "video_height": "1078", - "video_language": "", - "video_language_code": "", - "video_profile": "high", - "video_ref_frames": "4", - "video_resolution": "1080", - "video_scan_type": "progressive", - "video_width": "1920", - "view_offset": "1000", - "width": "1920", - "writers": [ - "David Benioff", - "D. B. Weiss" - ], - "year": "2016" - } - ], - "stream_count": "1", - "stream_count_direct_play": 1, - "stream_count_direct_stream": 0, - "stream_count_transcode": 0, - "total_bandwidth": 25318, - "wan_bandwidth": 0 - } -``` - - -### get_apikey -Get the apikey. Username and password are required -if auth is enabled. Makes and saves the apikey if it does not exist. - -``` -Required parameters: - None - -Optional parameters: - username (str): Your Tautulli username - password (str): Your Tautulli password - -Returns: - string: "apikey" -``` - - -### get_date_formats -Get the date and time formats used by Tautulli. - - ``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - {"date_format": "YYYY-MM-DD", - "time_format": "HH:mm", - } -``` - - -### get_geoip_lookup -Get the geolocation info for an IP address. - -``` -Required parameters: - ip_address - -Optional parameters: - None - -Returns: - json: - {"code": 'US", - "country": "United States", - "region": "California", - "city": "Mountain View", - "postal_code": "94035", - "timezone": "America/Los_Angeles", - "latitude": 37.386, - "longitude": -122.0838, - "accuracy": 1000 - } -``` - - -### get_history -Get the Tautulli history. - -``` -Required parameters: - None - -Optional parameters: - grouping (int): 0 or 1 - user (str): "Jon Snow" - user_id (int): 133788 - rating_key (int): 4348 - parent_rating_key (int): 544 - grandparent_rating_key (int): 351 - start_date (str): "YYYY-MM-DD" - section_id (int): 2 - media_type (str): "movie", "episode", "track", "live" - transcode_decision (str): "direct play", "copy", "transcode", - guid (str): Plex guid for an item, e.g. "com.plexapp.agents.thetvdb://121361/6/1" - order_column (str): "date", "friendly_name", "ip_address", "platform", "player", - "full_title", "started", "paused_counter", "stopped", "duration" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Thrones" - -Returns: - json: - {"draw": 1, - "recordsTotal": 1000, - "recordsFiltered": 250, - "total_duration": "42 days 5 hrs 18 mins", - "filter_duration": "10 hrs 12 mins", - "data": - [{"date": 1462687607, - "duration": 263, - "friendly_name": "Mother of Dragons", - "full_title": "Game of Thrones - The Red Woman", - "grandparent_rating_key": 351, - "grandparent_title": "Game of Thrones", - "original_title": "", - "group_count": 1, - "group_ids": "1124", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "ip_address": "xxx.xxx.xxx.xxx", - "live": 0, - "media_index": 17, - "media_type": "episode", - "originally_available_at": "2016-04-24", - "parent_media_index": 7, - "parent_rating_key": 544, - "parent_title": "", - "paused_counter": 0, - "percent_complete": 84, - "platform": "Windows", - "product": "Plex for Windows", - "player": "Castle-PC", - "rating_key": 4348, - "reference_id": 1123, - "row_id": 1124, - "session_key": null, - "started": 1462688107, - "state": null, - "stopped": 1462688370, - "thumb": "/library/metadata/4348/thumb/1462414561", - "title": "The Red Woman", - "transcode_decision": "transcode", - "user": "DanyKhaleesi69", - "user_id": 8008135, - "watched_status": 0, - "year": 2016 - }, - {...}, - {...} - ] - } -``` - - -### get_home_stats -Get the homepage watch statistics. - -``` -Required parameters: - None - -Optional parameters: - grouping (int): 0 or 1 - time_range (str): The time range to calculate statistics, '30' - stats_type (str): plays or duration - stats_count (str): The number of top items to list, '5' - -Returns: - json: - [{"stat_id": "top_movies", - "stat_type": "total_plays", - "rows": [{...}] - }, - {"stat_id": "popular_movies", - "rows": [{...}] - }, - {"stat_id": "top_tv", - "stat_type": "total_plays", - "rows": - [{"content_rating": "TV-MA", - "friendly_name": "", - "grandparent_thumb": "/library/metadata/1219/thumb/1462175063", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "labels": [], - "last_play": 1462380698, - "live": 0, - "media_type": "episode", - "platform": "", - "platform_type": "", - "rating_key": 1219, - "row_id": 1116, - "section_id": 2, - "thumb": "", - "title": "Game of Thrones", - "total_duration": 213302, - "total_plays": 69, - "user": "", - "users_watched": "" - }, - {...}, - {...} - ] - }, - {"stat_id": "popular_tv", - "rows": [{...}] - }, - {"stat_id": "top_music", - "stat_type": "total_plays", - "rows": [{...}] - }, - {"stat_id": "popular_music", - "rows": [{...}] - }, - {"stat_id": "last_watched", - "rows": [{...}] - }, - {"stat_id": "top_users", - "stat_type": "total_plays", - "rows": [{...}] - }, - {"stat_id": "top_platforms", - "stat_type": "total_plays", - "rows": [{...}] - }, - {"stat_id": "most_concurrent", - "rows": [{...}] - } - ] -``` - - -### get_libraries -Get a list of all libraries on your server. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"art": "/:/resources/show-fanart.jpg", - "child_count": "3745", - "count": "62", - "is_active": 1, - "parent_count": "240", - "section_id": "2", - "section_name": "TV Shows", - "section_type": "show", - "thumb": "/:/resources/show.png" - }, - {...}, - {...} - ] -``` - - -### get_libraries_table -Get the data on the Tautulli libraries table. - -``` -Required parameters: - None - -Optional parameters: - grouping (int): 0 or 1 - order_column (str): "library_thumb", "section_name", "section_type", "count", "parent_count", - "child_count", "last_accessed", "last_played", "plays", "duration" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Movies" - -Returns: - json: - {"draw": 1, - "recordsTotal": 10, - "recordsFiltered": 10, - "data": - [{"child_count": 3745, - "content_rating": "TV-MA", - "count": 62, - "do_notify": "Checked", - "do_notify_created": "Checked", - "duration": 1578037, - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "histroy_row_id": 1128, - "is_active": 1, - "keep_history": "Checked", - "labels": [], - "last_accessed": 1462693216, - "last_played": "Game of Thrones - The Red Woman", - "library_art": "/:/resources/show-fanart.jpg", - "library_thumb": "/:/resources/show.png", - "live": 0, - "media_index": 1, - "media_type": "episode", - "originally_available_at": "2016-04-24", - "parent_count": 240, - "parent_media_index": 6, - "parent_title": "", - "plays": 772, - "rating_key": 153037, - "row_id": 1, - "section_id": 2, - "section_name": "TV Shows", - "section_type": "Show", - "server_id": "ds48g4r354a8v9byrrtr697g3g79w", - "thumb": "/library/metadata/153036/thumb/1462175062", - "year": 2016 - }, - {...}, - {...} - ] - } -``` - - -### get_library -Get a library's details. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - None - -Returns: - json: - {"child_count": null, - "count": 887, - "deleted_section": 0, - "do_notify": 1, - "do_notify_created": 1, - "is_active": 1, - "keep_history": 1, - "library_art": "/:/resources/movie-fanart.jpg", - "library_thumb": "/:/resources/movie.png", - "parent_count": null, - "row_id": 1, - "section_id": 1, - "section_name": "Movies", - "section_type": "movie", - "server_id": "ds48g4r354a8v9byrrtr697g3g79w" - } -``` - - -### get_library_media_info -Get the data on the Tautulli media info tables. - -``` -Required parameters: - section_id (str): The id of the Plex library section, OR - rating_key (str): The grandparent or parent rating key - -Optional parameters: - section_type (str): "movie", "show", "artist", "photo" - order_column (str): "added_at", "sort_title", "container", "bitrate", "video_codec", - "video_resolution", "video_framerate", "audio_codec", "audio_channels", - "file_size", "last_played", "play_count" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Thrones" - refresh (str): "true" to refresh the media info table - -Returns: - json: - {"draw": 1, - "recordsTotal": 82, - "recordsFiltered": 82, - "filtered_file_size": 2616760056742, - "total_file_size": 2616760056742, - "data": - [{"added_at": "1403553078", - "audio_channels": "", - "audio_codec": "", - "bitrate": "", - "container": "", - "file_size": 253660175293, - "grandparent_rating_key": "", - "last_played": 1462380698, - "media_index": "1", - "media_type": "show", - "parent_media_index": "", - "parent_rating_key": "", - "play_count": 15, - "rating_key": "1219", - "section_id": 2, - "section_type": "show", - "sort_title": "Game of Thrones", - "thumb": "/library/metadata/1219/thumb/1436265995", - "title": "Game of Thrones", - "video_codec": "", - "video_framerate": "", - "video_resolution": "", - "year": "2011" - }, - {...}, - {...} - ] - } -``` - - -### get_library_names -Get a list of library sections and ids on the PMS. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"section_id": 1, "section_name": "Movies", "section_type": "movie"}, - {"section_id": 7, "section_name": "Music", "section_type": "artist"}, - {"section_id": 2, "section_name": "TV Shows", "section_type": "show"}, - {...} - ] -``` - - -### get_library_user_stats -Get a library's user statistics. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - grouping (int): 0 or 1 - -Returns: - json: - [{"friendly_name": "Jon Snow", - "total_plays": 170, - "user_id": 133788, - "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar" - }, - {"platform_type": "DanyKhaleesi69", - "total_plays": 42, - "user_id": 8008135, - "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar" - }, - {...}, - {...} - ] -``` - - -### get_library_watch_time_stats -Get a library's watch time statistics. - -``` -Required parameters: - section_id (str): The id of the Plex library section - -Optional parameters: - grouping (int): 0 or 1 - query_days (str): Comma separated days, e.g. "1,7,30,0" - -Returns: - json: - [{"query_days": 1, - "total_plays": 0, - "total_time": 0 - }, - {"query_days": 7, - "total_plays": 3, - "total_time": 15694 - }, - {"query_days": 30, - "total_plays": 35, - "total_time": 63054 - }, - {"query_days": 0, - "total_plays": 508, - "total_time": 1183080 - } - ] -``` - - -### get_logs -Get the Tautulli logs. - -``` -Required parameters: - None - -Optional parameters: - sort (str): "time", "thread", "msg", "loglevel" - search (str): A string to search for - order (str): "desc" or "asc" - regex (str): A regex string to search for - start (int): Row number to start from - end (int): Row number to end at - -Returns: - json: - [{"loglevel": "DEBUG", - "msg": "Latest version is 2d10b0748c7fa2ee4cf59960c3d3fffc6aa9512b", - "thread": "MainThread", - "time": "2016-05-08 09:36:51 " - }, - {...}, - {...} - ] -``` - - -### get_metadata -Get the metadata for a media item. - -``` -Required parameters: - rating_key (str): Rating key of the item - -Optional parameters: - None - -Returns: - json: - {"actors": [ - "Kit Harington", - "Emilia Clarke", - "Isaac Hempstead-Wright", - "Maisie Williams", - "Liam Cunningham", - ], - "added_at": "1461572396", - "art": "/library/metadata/1219/art/1462175063", - "audience_rating": "8", - "audience_rating_image": "rottentomatoes://image.rating.upright", - "banner": "/library/metadata/1219/banner/1462175063", - "collections": [], - "content_rating": "TV-MA", - "directors": [ - "Jeremy Podeswa" - ], - "duration": "2998290", - "full_title": "Game of Thrones - The Red Woman", - "genres": [ - "Adventure", - "Drama", - "Fantasy" - ], - "grandparent_guid": "com.plexapp.agents.thetvdb://121361?lang=en", - "grandparent_rating_key": "1219", - "grandparent_thumb": "/library/metadata/1219/thumb/1462175063", - "grandparent_title": "Game of Thrones", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "labels": [], - "last_viewed_at": "1462165717", - "library_name": "TV Shows", - "live": 0, - "media_index": "1", - "media_info": [ - { - "aspect_ratio": "1.78", - "audio_channel_layout": "5.1", - "audio_channels": "6", - "audio_codec": "ac3", - "audio_profile": "", - "bitrate": "10617", - "channel_call_sign": "", - "channel_identifier": "", - "channel_thumb": "", - "container": "mkv", - "height": "1078", - "id": "257925", - "optimized_version": 0, - "parts": [ - { - "file": "/media/TV Shows/Game of Thrones/Season 06/Game of Thrones - S06E01 - The Red Woman.mkv", - "file_size": "3979115377", - "id": "274169", - "indexes": 1, - "streams": [ - { - "id": "511663", - "type": "1", - "video_bit_depth": "8", - "video_bitrate": "10233", - "video_codec": "h264", - "video_codec_level": "41", - "video_color_primaries": "", - "video_color_range": "tv", - "video_color_space": "bt709", - "video_color_trc": "", - "video_frame_rate": "23.976", - "video_height": "1078", - "video_language": "", - "video_language_code": "", - "video_profile": "high", - "video_ref_frames": "4", - "video_scan_type": "progressive", - "video_width": "1920", - "selected": 0 - }, - { - "audio_bitrate": "384", - "audio_bitrate_mode": "", - "audio_channel_layout": "5.1(side)", - "audio_channels": "6", - "audio_codec": "ac3", - "audio_language": "", - "audio_language_code": "", - "audio_profile": "", - "audio_sample_rate": "48000", - "id": "511664", - "type": "2", - "selected": 1 - }, - { - "id": "511953", - "subtitle_codec": "srt", - "subtitle_container": "", - "subtitle_forced": 0, - "subtitle_format": "srt", - "subtitle_language": "English", - "subtitle_language_code": "eng", - "subtitle_location": "external", - "type": "3", - "selected": 1 - } - ] - } - ], - "video_codec": "h264", - "video_framerate": "24p", - "video_full_resolution": "1080p", - "video_profile": "high", - "video_resolution": "1080", - "width": "1920" - } - ], - "media_type": "episode", - "original_title": "", - "originally_available_at": "2016-04-24", - "parent_guid": "com.plexapp.agents.thetvdb://121361/6?lang=en", - "parent_media_index": "6", - "parent_rating_key": "153036", - "parent_thumb": "/library/metadata/153036/thumb/1462175062", - "parent_title": "", - "rating": "7.8", - "rating_image": "rottentomatoes://image.rating.ripe", - "rating_key": "153037", - "section_id": "2", - "sort_title": "Red Woman", - "studio": "HBO", - "summary": "Jon Snow is dead. Daenerys meets a strong man. Cersei sees her daughter again.", - "tagline": "", - "thumb": "/library/metadata/153037/thumb/1462175060", - "title": "The Red Woman", - "user_rating": "9.0", - "updated_at": "1462175060", - "writers": [ - "David Benioff", - "D. B. Weiss" - ], - "year": "2016" - } -``` - - -### get_new_rating_keys -Get a list of new rating keys for the PMS of all of the item's parent/children. - -``` -Required parameters: - rating_key (str): '12345' - media_type (str): "movie", "show", "season", "episode", "artist", "album", "track" - -Optional parameters: - None - -Returns: - json: - {} -``` - - -### get_newsletter_config -Get the configuration for an existing notification agent. - -``` -Required parameters: - newsletter_id (int): The newsletter config to retrieve - -Optional parameters: - None - -Returns: - json: - {"id": 1, - "agent_id": 0, - "agent_name": "recently_added", - "agent_label": "Recently Added", - "friendly_name": "", - "id_name": "", - "cron": "0 0 * * 1", - "active": 1, - "subject": "Recently Added to {server_name}! ({end_date})", - "body": "View the newsletter here: {newsletter_url}", - "message": "", - "config": {"custom_cron": 0, - "filename": "newsletter_{newsletter_uuid}.html", - "formatted": 1, - "incl_libraries": ["1", "2"], - "notifier_id": 1, - "save_only": 0, - "time_frame": 7, - "time_frame_units": "days" - }, - "email_config": {...}, - "config_options": [{...}, ...], - "email_config_options": [{...}, ...] - } -``` - - -### get_newsletter_log -Get the data on the Tautulli newsletter logs table. - -``` -Required parameters: - None - -Optional parameters: - order_column (str): "timestamp", "newsletter_id", "agent_name", "notify_action", - "subject_text", "start_date", "end_date", "uuid" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Telegram" - -Returns: - json: - {"draw": 1, - "recordsTotal": 1039, - "recordsFiltered": 163, - "data": - [{"agent_id": 0, - "agent_name": "recently_added", - "end_date": "2018-03-18", - "id": 7, - "newsletter_id": 1, - "notify_action": "on_cron", - "start_date": "2018-03-05", - "subject_text": "Recently Added to Plex (Winterfell-Server)! (2018-03-18)", - "success": 1, - "timestamp": 1462253821, - "uuid": "7fe4g65i" - }, - {...}, - {...} - ] - } -``` - - -### get_newsletters -Get a list of configured newsletters. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"id": 1, - "agent_id": 0, - "agent_name": "recently_added", - "agent_label": "Recently Added", - "friendly_name": "", - "cron": "0 0 * * 1", - "active": 1 - } - ] -``` - - -### get_notification_log -Get the data on the Tautulli notification logs table. - -``` -Required parameters: - None - -Optional parameters: - order_column (str): "timestamp", "notifier_id", "agent_name", "notify_action", - "subject_text", "body_text", - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Telegram" - -Returns: - json: - {"draw": 1, - "recordsTotal": 1039, - "recordsFiltered": 163, - "data": - [{"agent_id": 13, - "agent_name": "telegram", - "body_text": "DanyKhaleesi69 started playing The Red Woman.", - "id": 1000, - "notify_action": "on_play", - "rating_key": 153037, - "session_key": 147, - "subject_text": "Tautulli (Winterfell-Server)", - "success": 1, - "timestamp": 1462253821, - "user": "DanyKhaleesi69", - "user_id": 8008135 - }, - {...}, - {...} - ] - } -``` - - -### get_notifier_config -Get the configuration for an existing notification agent. - -``` -Required parameters: - notifier_id (int): The notifier config to retrieve - -Optional parameters: - None - -Returns: - json: - {"id": 1, - "agent_id": 13, - "agent_name": "telegram", - "agent_label": "Telegram", - "friendly_name": "", - "config": {"incl_poster": 0, - "html_support": 1, - "chat_id": "123456", - "bot_token": "13456789:fio9040NNo04jLEp-4S", - "incl_subject": 1, - "disable_web_preview": 0 - }, - "config_options": [{...}, ...] - "actions": {"on_play": 0, - "on_stop": 0, - ... - }, - "notify_text": {"on_play": {"subject": "...", - "body": "..." - } - "on_stop": {"subject": "...", - "body": "..." - } - ... - } - } -``` - - -### get_notifier_parameters -Get the list of available notification parameters. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - { - } -``` - - -### get_notifiers -Get a list of configured notifiers. - -``` -Required parameters: - None - -Optional parameters: - notify_action (str): The notification action to filter out - -Returns: - json: - [{"id": 1, - "agent_id": 13, - "agent_name": "telegram", - "agent_label": "Telegram", - "friendly_name": "", - "active": 1 - } - ] -``` - - -### get_old_rating_keys -Get a list of old rating keys from the Tautulli database for all of the item's parent/children. - -``` -Required parameters: - rating_key (str): '12345' - media_type (str): "movie", "show", "season", "episode", "artist", "album", "track" - -Optional parameters: - None - -Returns: - json: - {} -``` - - -### get_plays_by_date -Get graph data by date. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["YYYY-MM-DD", "YYYY-MM-DD", ...] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plays_by_dayofweek -Get graph data by day of the week. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["Sunday", "Monday", "Tuesday", ..., "Saturday"] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plays_by_hourofday -Get graph data by hour of the day. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["00", "01", "02", ..., "23"] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plays_by_source_resolution -Get graph data by source resolution. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["720", "1080", "sd", ...] - "series": - [{"name": "Direct Play", "data": [...]} - {"name": "Direct Stream", "data": [...]}, - {"name": "Transcode", "data": [...]} - ] - } -``` - - -### get_plays_by_stream_resolution -Get graph data by stream resolution. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["720", "1080", "sd", ...] - "series": - [{"name": "Direct Play", "data": [...]} - {"name": "Direct Stream", "data": [...]}, - {"name": "Transcode", "data": [...]} - ] - } -``` - - -### get_plays_by_stream_type -Get graph data by stream type by date. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["YYYY-MM-DD", "YYYY-MM-DD", ...] - "series": - [{"name": "Direct Play", "data": [...]} - {"name": "Direct Stream", "data": [...]}, - {"name": "Transcode", "data": [...]} - ] - } -``` - - -### get_plays_by_top_10_platforms -Get graph data by top 10 platforms. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["iOS", "Android", "Chrome", ...] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plays_by_top_10_users -Get graph data by top 10 users. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["Jon Snow", "DanyKhaleesi69", "A Girl", ...] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plays_per_month -Get graph data by month. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of months of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["Jan 2016", "Feb 2016", "Mar 2016", ...] - "series": - [{"name": "Movies", "data": [...]} - {"name": "TV", "data": [...]}, - {"name": "Music", "data": [...]}, - {"name": "Live TV", "data": [...]} - ] - } -``` - - -### get_plex_log -Get the PMS logs. - -``` -Required parameters: - None - -Optional parameters: - window (int): The number of tail lines to return - log_type (str): "server" or "scanner" - -Returns: - json: - [["May 08, 2016 09:35:37", - "DEBUG", - "Auth: Came in with a super-token, authorization succeeded." - ], - [...], - [...] - ] -``` - - -### get_pms_token -Get the user's Plex token used for Tautulli. - -``` -Required parameters: - username (str): The Plex.tv username - password (str): The Plex.tv password - -Optional parameters: - None - -Returns: - string: The Plex token used for Tautulli -``` - - -### get_pms_update -Check for updates to the Plex Media Server. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - {"update_available": true, - "platform": "Windows", - "release_date": "1473721409", - "version": "1.1.4.2757-24ffd60", - "requirements": "...", - "extra_info": "...", - "changelog_added": "...", - "changelog_fixed": "...", - "label": "Download", - "distro": "english", - "distro_build": "windows-i386", - "download_url": "https://downloads.plex.tv/...", - } -``` - - -### get_recently_added -Get all items that where recently added to plex. - -``` -Required parameters: - count (str): Number of items to return - -Optional parameters: - start (str): The item number to start at - media_type (str): The media type: movie, show, artist - section_id (str): The id of the Plex library section - -Returns: - json: - {"recently_added": - [{"actors": [ - "Kit Harington", - "Emilia Clarke", - "Isaac Hempstead-Wright", - "Maisie Williams", - "Liam Cunningham", - ], - "added_at": "1461572396", - "art": "/library/metadata/1219/art/1462175063", - "audience_rating": "8", - "audience_rating_image": "rottentomatoes://image.rating.upright", - "banner": "/library/metadata/1219/banner/1462175063", - "directors": [ - "Jeremy Podeswa" - ], - "duration": "2998290", - "full_title": "Game of Thrones - The Red Woman", - "genres": [ - "Adventure", - "Drama", - "Fantasy" - ], - "grandparent_rating_key": "1219", - "grandparent_thumb": "/library/metadata/1219/thumb/1462175063", - "grandparent_title": "Game of Thrones", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "labels": [], - "last_viewed_at": "1462165717", - "library_name": "TV Shows", - "media_index": "1", - "media_type": "episode", - "original_title": "", - "originally_available_at": "2016-04-24", - "parent_media_index": "6", - "parent_rating_key": "153036", - "parent_thumb": "/library/metadata/153036/thumb/1462175062", - "parent_title": "", - "rating": "7.8", - "rating_image": "rottentomatoes://image.rating.ripe", - "rating_key": "153037", - "section_id": "2", - "sort_title": "Red Woman", - "studio": "HBO", - "summary": "Jon Snow is dead. Daenerys meets a strong man. Cersei sees her daughter again.", - "tagline": "", - "thumb": "/library/metadata/153037/thumb/1462175060", - "title": "The Red Woman", - "user_rating": "9.0", - "updated_at": "1462175060", - "writers": [ - "David Benioff", - "D. B. Weiss" - ], - "year": "2016" - }, - {...}, - {...} - ] - } -``` - - -### get_server_friendly_name -Get the name of the PMS. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - string: "Winterfell-Server" -``` - - -### get_server_id -Get the PMS server identifier. - -``` -Required parameters: - hostname (str): 'localhost' or '192.160.0.10' - port (int): 32400 - -Optional parameters: - ssl (int): 0 or 1 - remote (int): 0 or 1 - -Returns: - json: - {'identifier': '08u2phnlkdshf890bhdlksghnljsahgleikjfg9t'} -``` - - -### get_server_identity -Get info about the local server. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"machine_identifier": "ds48g4r354a8v9byrrtr697g3g79w", - "version": "0.9.15.x.xxx-xxxxxxx" - } - ] -``` - - -### get_server_list -Get all your servers that are published to Plex.tv. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"clientIdentifier": "ds48g4r354a8v9byrrtr697g3g79w", - "httpsRequired": "0", - "ip": "xxx.xxx.xxx.xxx", - "label": "Winterfell-Server", - "local": "1", - "port": "32400", - "value": "xxx.xxx.xxx.xxx" - }, - {...}, - {...} - ] -``` - - -### get_server_pref -Get a specified PMS server preference. - -``` -Required parameters: - pref (str): Name of preference - -Returns: - string: Value of preference -``` - - -### get_servers_info -Get info about the PMS. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"port": "32400", - "host": "10.0.0.97", - "version": "0.9.15.2.1663-7efd046", - "name": "Winterfell-Server", - "machine_identifier": "ds48g4r354a8v9byrrtr697g3g79w" - } - ] -``` - - -### get_settings -Gets all settings from the config file. - -``` -Required parameters: - None - -Optional parameters: - key (str): Name of a config section to return - -Returns: - json: - {"General": {"api_enabled": true, ...} - "Advanced": {"cache_sizemb": "32", ...}, - ... - } -``` - - -### get_stream_data -Get the stream details from history or current stream. - -``` -Required parameters: - row_id (int): The row ID number for the history item, OR - session_key (int): The session key of the current stream - -Optional parameters: - None - -Returns: - json: - {"aspect_ratio": "2.35", - "audio_bitrate": 231, - "audio_channels": 6, - "audio_codec": "aac", - "audio_decision": "transcode", - "bitrate": 2731, - "container": "mp4", - "current_session": "", - "grandparent_title": "", - "media_type": "movie", - "optimized_version": "", - "optimized_version_profile": "", - "optimized_version_title": "", - "original_title": "", - "pre_tautulli": "", - "quality_profile": "1.5 Mbps 480p", - "stream_audio_bitrate": 203, - "stream_audio_channels": 2, - "stream_audio_codec": "aac", - "stream_audio_decision": "transcode", - "stream_bitrate": 730, - "stream_container": "mkv", - "stream_container_decision": "transcode", - "stream_subtitle_codec": "", - "stream_subtitle_decision": "", - "stream_video_bitrate": 527, - "stream_video_codec": "h264", - "stream_video_decision": "transcode", - "stream_video_dynamic_range": "SDR", - "stream_video_framerate": "24p", - "stream_video_height": 306, - "stream_video_resolution": "SD", - "stream_video_width": 720, - "subtitle_codec": "", - "subtitles": "", - "synced_version": "", - "synced_version_profile": "", - "title": "Frozen", - "transcode_hw_decoding": "", - "transcode_hw_encoding": "", - "video_bitrate": 2500, - "video_codec": "h264", - "video_decision": "transcode", - "video_dynamic_range": "SDR", - "video_framerate": "24p", - "video_height": 816, - "video_resolution": "1080", - "video_width": 1920 - } -``` - - -### get_stream_type_by_top_10_platforms -Get graph data by stream type by top 10 platforms. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["iOS", "Android", "Chrome", ...] - "series": - [{"name": "Direct Play", "data": [...]} - {"name": "Direct Stream", "data": [...]}, - {"name": "Transcode", "data": [...]} - ] - } -``` - - -### get_stream_type_by_top_10_users -Get graph data by stream type by top 10 users. - -``` -Required parameters: - None - -Optional parameters: - time_range (str): The number of days of data to return - y_axis (str): "plays" or "duration" - user_id (str): The user id to filter the data - grouping (int): 0 or 1 - -Returns: - json: - {"categories": - ["Jon Snow", "DanyKhaleesi69", "A Girl", ...] - "series": - [{"name": "Direct Play", "data": [...]} - {"name": "Direct Stream", "data": [...]}, - {"name": "Transcode", "data": [...]} - ] - } -``` - - -### get_synced_items -Get a list of synced items on the PMS. - -``` -Required parameters: - machine_id (str): The PMS identifier - -Optional parameters: - user_id (str): The id of the Plex user - -Returns: - json: - [{"audio_bitrate": "192", - "client_id": "95434se643fsf24f-com-plexapp-android", - "content_type": "video", - "device_name": "Tyrion's iPad", - "failure": "", - "item_complete_count": "1", - "item_count": "1", - "item_downloaded_count": "1", - "item_downloaded_percent_complete": 100, - "metadata_type": "movie", - "photo_quality": "74", - "platform": "iOS", - "rating_key": "154092", - "root_title": "Movies", - "state": "complete", - "sync_id": "11617019", - "sync_title": "Deadpool", - "total_size": "560718134", - "user": "DrukenDwarfMan", - "user_id": "696969", - "username": "DrukenDwarfMan", - "video_bitrate": "4000" - "video_quality": "100" - }, - {...}, - {...} - ] -``` - - -### get_user -Get a user's details. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - None - -Returns: - json: - {"allow_guest": 1, - "deleted_user": 0, - "do_notify": 1, - "email": "Jon.Snow.1337@CastleBlack.com", - "friendly_name": "Jon Snow", - "is_active": 1, - "is_admin": 0, - "is_allow_sync": 1, - "is_home_user": 1, - "is_restricted": 0, - "keep_history": 1, - "row_id": 1, - "shared_libraries": ["10", "1", "4", "5", "15", "20", "2"], - "user_id": 133788, - "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar", - "username": "LordCommanderSnow" - } -``` - - -### get_user_ips -Get the data on Tautulli users IP table. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - order_column (str): "last_seen", "ip_address", "platform", "player", - "last_played", "play_count" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "xxx.xxx.xxx.xxx" - -Returns: - json: - {"draw": 1, - "recordsTotal": 2344, - "recordsFiltered": 10, - "data": - [{"friendly_name": "Jon Snow", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "id": 1121, - "ip_address": "xxx.xxx.xxx.xxx", - "last_played": "Game of Thrones - The Red Woman", - "last_seen": 1462591869, - "live": 0, - "media_index": 1, - "media_type": "episode", - "originally_available_at": "2016-04-24", - "parent_media_index": 6, - "parent_title": "", - "platform": "Chrome", - "play_count": 149, - "player": "Plex Web (Chrome)", - "rating_key": 153037, - "thumb": "/library/metadata/153036/thumb/1462175062", - "transcode_decision": "transcode", - "user_id": 133788, - "year": 2016 - }, - {...}, - {...} - ] - } -``` - - -### get_user_logins -Get the data on Tautulli user login table. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - order_column (str): "date", "time", "ip_address", "host", "os", "browser" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "xxx.xxx.xxx.xxx" - -Returns: - json: - {"draw": 1, - "recordsTotal": 2344, - "recordsFiltered": 10, - "data": - [{"browser": "Safari 7.0.3", - "friendly_name": "Jon Snow", - "host": "http://plexpy.castleblack.com", - "ip_address": "xxx.xxx.xxx.xxx", - "os": "Mac OS X", - "timestamp": 1462591869, - "user": "LordCommanderSnow", - "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", - "user_group": "guest", - "user_id": 133788 - }, - {...}, - {...} - ] - } -``` - - -### get_user_names -Get a list of all user and user ids. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"friendly_name": "Jon Snow", "user_id": 133788}, - {"friendly_name": "DanyKhaleesi69", "user_id": 8008135}, - {"friendly_name": "Tyrion Lannister", "user_id": 696969}, - {...}, - ] -``` - - -### get_user_player_stats -Get a user's player statistics. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - grouping (int): 0 or 1 - -Returns: - json: - [{"platform_type": "Chrome", - "player_name": "Plex Web (Chrome)", - "result_id": 1, - "total_plays": 170 - }, - {"platform_type": "Chromecast", - "player_name": "Chromecast", - "result_id": 2, - "total_plays": 42 - }, - {...}, - {...} - ] -``` - - -### get_user_watch_time_stats -Get a user's watch time statistics. - -``` -Required parameters: - user_id (str): The id of the Plex user - -Optional parameters: - grouping (int): 0 or 1 - query_days (str): Comma separated days, e.g. "1,7,30,0" - -Returns: - json: - [{"query_days": 1, - "total_plays": 0, - "total_time": 0 - }, - {"query_days": 7, - "total_plays": 3, - "total_time": 15694 - }, - {"query_days": 30, - "total_plays": 35, - "total_time": 63054 - }, - {"query_days": 0, - "total_plays": 508, - "total_time": 1183080 - } - ] -``` - - -### get_users -Get a list of all users that have access to your server. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json: - [{"allow_guest": 1, - "do_notify": 1, - "email": "Jon.Snow.1337@CastleBlack.com", - "filter_all": "", - "filter_movies": "", - "filter_music": "", - "filter_photos": "", - "filter_tv": "", - "is_active": 1, - "is_admin": 0, - "is_allow_sync": 1, - "is_home_user": 1, - "is_restricted": 0, - "keep_history": 1, - "row_id": 1, - "server_token": "PU9cMuQZxJKFBtGqHk68", - "shared_libraries": "1;2;3", - "thumb": "https://plex.tv/users/k10w42309cynaopq/avatar", - "user_id": "133788", - "username": "Jon Snow" - }, - {...}, - {...} - ] -``` - - -### get_users_table -Get the data on Tautulli users table. - -``` -Required parameters: - None - -Optional parameters: - grouping (int): 0 or 1 - order_column (str): "user_thumb", "friendly_name", "last_seen", "ip_address", "platform", - "player", "last_played", "plays", "duration" - order_dir (str): "desc" or "asc" - start (int): Row to start from, 0 - length (int): Number of items to return, 25 - search (str): A string to search for, "Jon Snow" - -Returns: - json: - {"draw": 1, - "recordsTotal": 10, - "recordsFiltered": 10, - "data": - [{"allow_guest": "Checked", - "do_notify": "Checked", - "duration": 2998290, - "friendly_name": "Jon Snow", - "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", - "history_row_id": 1121, - "ip_address": "xxx.xxx.xxx.xxx", - "is_active": 1, - "keep_history": "Checked", - "last_played": "Game of Thrones - The Red Woman", - "last_seen": 1462591869, - "live": 0, - "media_index": 1, - "media_type": "episode", - "originally_available_at": "2016-04-24", - "parent_media_index": 6, - "parent_title": "", - "platform": "Chrome", - "player": "Plex Web (Chrome)", - "plays": 487, - "rating_key": 153037, - "row_id": 1, - "thumb": "/library/metadata/153036/thumb/1462175062", - "transcode_decision": "transcode", - "user_id": 133788, - "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar", - "year": 2016 - }, - {...}, - {...} - ] - } -``` - - -### get_whois_lookup -Get the connection info for an IP address. - -``` -Required parameters: - ip_address - -Optional parameters: - None - -Returns: - json: - {"host": "google-public-dns-a.google.com", - "nets": [{"description": "Google Inc.", - "address": "1600 Amphitheatre Parkway", - "city": "Mountain View", - "state": "CA", - "postal_code": "94043", - "country": "United States", - ... - }, - {...} - ] - json: - {"host": "Not available", - "nets": [], - "error": "IPv4 address 127.0.0.1 is already defined as Loopback via RFC 1122, Section 3.2.1.3." - } -``` - - -### import_database -Import a Tautulli, PlexWatch, or Plexivity database into Tautulli. - -``` -Required parameters: - app (str): "tautulli" or "plexwatch" or "plexivity" - database_path (str): The full path to the plexwatch database file - method (str): For Tautulli only, "merge" or "overwrite" - table_name (str): For PlexWatch or Plexivity only, "processed" or "grouped" - - -Optional parameters: - backup (bool): For Tautulli only, true or false whether to backup - the current database before importing - import_ignore_interval (int): For PlexWatch or Plexivity only, the minimum number - of seconds for a stream to import - -Returns: - None -``` - - -### notify -Send a notification using Tautulli. - -``` -Required parameters: - notifier_id (int): The ID number of the notification agent - subject (str): The subject of the message - body (str): The body of the message - -Optional parameters: - headers (str): The JSON headers for webhook notifications - script_args (str): The arguments for script notifications - -Returns: - None -``` - - -### notify_newsletter -Send a newsletter using Tautulli. - -``` -Required parameters: - newsletter_id (int): The ID number of the newsletter agent - -Optional parameters: - subject (str): The subject of the newsletter - body (str): The body of the newsletter - message (str): The message of the newsletter - -Returns: - None -``` - - -### notify_recently_added -Send a recently added notification using Tautulli. - -``` -Required parameters: - rating_key (int): The rating key for the media - -Optional parameters: - notifier_id (int): The ID number of the notification agent. - The notification will send to all enabled notification agents if notifier id is not provided. - -Returns: - json - {"result": "success", - "message": "Notification queued." - } -``` - - -### pms_image_proxy -Gets an image from the PMS and saves it to the image cache directory. - -``` -Required parameters: - img (str): /library/metadata/153037/thumb/1462175060 - or - rating_key (str): 54321 - -Optional parameters: - width (str): 300 - height (str): 450 - opacity (str): 25 - background (str): Hex color, e.g. 282828 - blur (str): 3 - img_format (str): png - fallback (str): "poster", "cover", "art", "poster-live", "art-live", "art-live-full" - refresh (bool): True or False whether to refresh the image cache - return_hash (bool): True or False to return the self-hosted image hash instead of the image - -Returns: - None -``` - - -### refresh_libraries_list -Refresh the Tautulli libraries list. - - -### refresh_users_list -Refresh the Tautulli users list. - - -### register_device -Registers the Tautulli Android App for notifications. - -``` -Required parameters: - device_name (str): The device name of the Tautulli Android App - device_id (str): The OneSignal device id of the Tautulli Android App - -Optional parameters: - friendly_name (str): A friendly name to identify the mobile device - -Returns: - None -``` - - -### restart -Restart Tautulli. - - -### search -Get search results from the PMS. - -``` -Required parameters: - query (str): The query string to search for - -Optional parameters: - limit (int): The maximum number of items to return per media type - -Returns: - json: - {"results_count": 69, - "results_list": - {"movie": - [{...}, - {...}, - ] - }, - {"episode": - [{...}, - {...}, - ] - }, - {...} - } -``` - - -### set_mobile_device_config -Configure an existing notification agent. - -``` -Required parameters: - mobile_device_id (int): The mobile device config to update - -Optional parameters: - friendly_name (str): A friendly name to identify the mobile device - -Returns: - None -``` - - -### set_newsletter_config -Configure an existing newsletter agent. - -``` -Required parameters: - newsletter_id (int): The newsletter config to update - agent_id (int): The newsletter type of the newsletter - -Optional parameters: - Pass all the config options for the agent with the 'newsletter_config_' and 'newsletter_email_' prefix. - -Returns: - None -``` - - -### set_notifier_config -Configure an existing notification agent. - -``` -Required parameters: - notifier_id (int): The notifier config to update - agent_id (int): The agent of the notifier - -Optional parameters: - Pass all the config options for the agent with the agent prefix: - e.g. For Telegram: telegram_bot_token - telegram_chat_id - telegram_disable_web_preview - telegram_html_support - telegram_incl_poster - telegram_incl_subject - Notify actions (int): 0 or 1, - e.g. on_play, on_stop, etc. - Notify text (str): - e.g. on_play_subject, on_play_body, etc. - -Returns: - None -``` - - -### sql -Query the Tautulli database with raw SQL. Automatically makes a backup of -the database if the latest backup is older then 24h. `api_sql` must be -manually enabled in the config file while Tautulli is shut down. - -``` -Required parameters: - query (str): The SQL query - -Optional parameters: - None - -Returns: - None -``` - - -### status -Get the current status of Tautulli. - -``` -Required parameters: - None - -Optional parameters: - check (str): database - -Returns: - json: - {"result": "success", - "message": "Ok", - } -``` - - -### terminate_session -Stop a streaming session. - -``` -Required parameters: - session_key (int): The session key of the session to terminate, OR - session_id (str): The session id of the session to terminate - -Optional parameters: - message (str): A custom message to send to the client - -Returns: - None -``` - - -### undelete_library -Restore a deleted library section to Tautulli. - -``` -Required parameters: - section_id (str): The id of the Plex library section - section_name (str): The name of the Plex library section - -Optional parameters: - None - -Returns: - None -``` - - -### undelete_user -Restore a deleted user to Tautulli. - -``` -Required parameters: - user_id (str): The id of the Plex user - username (str): The username of the Plex user - -Optional parameters: - None - -Returns: - None -``` - - -### update -Update Tautulli. - - -### update_check -Check for Tautulli updates. - -``` -Required parameters: - None - -Optional parameters: - None - -Returns: - json - {"result": "success", - "update": true, - "message": "An update for Tautulli is available." - } -``` - - -### update_metadata_details -Update the metadata in the Tautulli database by matching rating keys. -Also updates all parents or children of the media item if it is a show/season/episode -or artist/album/track. - -``` -Required parameters: - old_rating_key (str): 12345 - new_rating_key (str): 54321 - media_type (str): "movie", "show", "season", "episode", "artist", "album", "track" - -Optional parameters: - None - -Returns: - None -``` - +Tautulli API documentation has been moved to the [wiki page](https://github.com/Tautulli/Tautulli/wiki/Tautulli-API-Reference). \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 6080d235..b349b355 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,40 +1,996 @@ # Changelog -## v2.5.2-beta (2020-06-27) +## v2.15.3 (2025-08-03) + +* Exporter: + * New: Added hearingImpaired for subtitles and visualImpaired for audio attributes to exporter fields. +* Graphs: + * Fix: Remove duplicate "Total" entry in graph tooltips. (Thanks @zdimension) (#2534) +* UI: + * Fix: Failing to retrieve collections / playlists with over 1000 items. + * Fix: Scrollbar not showing on macosx and webkit browsers. (#2221) + * Fix: Incorrect rounding of minutes in global stats play duration. + * Fix: Disable browser autocomplete for notification agent and newsletter agent configurations. (#2557) +* API: + * New: Added ability to return svg files using pms_image_proxy API command. +* Other: + * New: Added ability to set config values using environment variables. (Thanks @komuw) (#2309, #2543) + + +## v2.15.2 (2025-04-12) + +* Activity: + * New: Added link to library by clicking media type icon. + * New: Added stream count to tab title on homepage. (#2517) +* History: + * Fix: Check stream watched status before stream stopped status. (#2506) +* Notifications: + * Fix: ntfy notifications failing to send if provider link is blank. + * Fix: Check Pushover notification attachment is under 5MB limit. (#2396) + * Fix: Track URLs redirecting to the correct media page. (#2513) + * New: Added audio profile notification parameters. + * New: Added PATCH method for Webhook notifications. +* Graphs: + * New: Added Total line to daily streams graph. (Thanks @zdimension) (#2497) +* UI: + * Fix: Do not redirect API requests to the login page. (#2490) + * Change: Swap source and stream columns in stream info modal. +* Other: + * Fix: Various typos. (Thanks @luzpaz) (#2520) + * Fix: CherryPy CORS response header not being set correctly. (#2279) + + +## v2.15.1 (2025-01-11) + +* Activity: + * Fix: Detection of HDR transcodes. (Thanks @cdecker08) (#2412, #2466) +* Newsletters: + * Fix: Disable basic authentication for /newsletter and /image endpoints. (#2472) +* Exporter: + * New: Added logos to season and episode exports. +* Other: + * Fix: Docker container https health check. + + +## v2.15.0 (2024-11-24) + +* Notes: + * Support for Python 3.8 has been dropped. The minimum Python version is now 3.9. +* Notifications: + * New: Allow Telegram blockquote and tg-emoji HTML tags. (Thanks @MythodeaLoL) (#2427) + * New: Added Plex slug and Plex Watch URL notification parameters. (#2420) + * Change: Update OneSignal API calls to use the new API endpoint for Tautulli Remote App notifications. +* Newsletters: + * Fix: Dumping custom dates in raw newsletter json. +* History: + * Fix: Unable to fix match for artists. (#2429) +* Exporter: + * New: Added movie and episode hasVoiceActivity attribute to exporter fields. + * New: Added subtitle canAutoSync attribute to exporter fields. + * New: Added logos to the exporter fields. +* UI: + * New: Add friendly name to the top bar of config modals. (Thanks @peagravel) (#2432) +* API: + * New: Added plex slugs to metadata in the get_metadata API command. +* Other: + * Fix: Tautulli failing to start with Python 3.13. (#2426) + + +## v2.14.6 (2024-10-12) + +* Newsletters: + * Fix: Allow formatting newsletter date parameters. + * Change: Support apscheduler compatible cron expressions. +* UI: + * Fix: Round runtime before converting to human duration. + * Fix: Make recently added/watched rows touch scrollable. +* Other: + * Fix: Auto-updater not running. + + +## v2.14.5 (2024-09-20) + +* Activity: + * Fix: Display of 2k resolution on activity card. +* Notifications: + * Fix: ntfy notifications with special characters failing to send. +* Other: + * Fix: Memory leak with database closing. (#2404) + + +## v2.14.4 (2024-08-10) + +* Notifications: + * Fix: Update Slack notification info card. + * New: Added ntfy notification agent. (Thanks @nwithan8) (#2356, #2000) +* UI: + * Fix: macOS platform capitalization. +* Other: + * Fix: Remove deprecated getdefaultlocale. (Thanks @teodorstelian) (#2364, #2345) + + +## v2.14.3 (2024-06-19) + +* Graphs: + * Fix: History table not loading when clicking on the graphs in some instances. +* UI: + * Fix: Scheduled tasks table not loading when certain tasks are disabled. + * Removed: Unnecessary Remote Server checkbox from the settings page. +* Other: + * Fix: Webserver not restarting after the setup wizard. + * Fix: Workaround webserver crashing in some instances. + + +## v2.14.2 (2024-05-18) + +* History: + * Fix: Live TV activity not logging to history. + * Fix: Incorrect grouping of live TV history. +* Notifications: + * Fix: Pushover configuration settings refreshing after entering a token. + * Fix: Plex remote access down notifications not triggering. + * Fix: Deleting all images from Cloudinary only deleting 1000 images. + * New: Added platform version and product version notification parameters. (#2244) + * New: Added LAN streams and WAN streams notification parameters. (#2276) + * New: Added Dolby Vision notification parameters. (#2240) + * New: Added live TV channel notification parameters. + * Change: Improved Tautulli Remote App notification encryption method. + * Note: Requires Tautulli Remote App version 3.2.4. +* Exporter: + * New: Added slug attribute to exporter fields. + * New: Added track genres to exporter fields. + * New: Added playlist source URI to exporter fields. + * New: Added artProvider and thumbProvider to exporter fields. +* UI: + * Fix: Mask deleted usernames in the logs. + * Fix: Live TV watch stats not showing on the media info page. + * Fix: Users without access to Plex server not showing as inactive. + * Removed: Deprecated synced item pages. + * Removed: Anonymous redirect settings. Links now use browser no-referrer policy instead. +* API: + * New: Added Dolby Vision info to the get_metadata API command. + * New: Added before and after parameters to the get_home_stats API command. (#2231) +* Packages: + * New: Universal binary for macOS for Apple silicon. + * New: Bump Snap package to core22. +* Other: + * Change: Login cookie expires changed to max-age. + * Change: Improved key generation for login password. It is recommended to reenter your HTTP Password in the settings after upgrading. + * Removed: Python 2 compatibility code. (#2098, #2226) (Thanks @zdimension) + + +## v2.13.4 (2023-12-07) + +* UI: + * Fix: Tautulli configuration settings page not loading when system language is None. + * Fix: Login cookie expiring too quickly. + + +## v2.13.3 (2023-12-03) + +* Notifications: + * New: Added duration_time notification parameter. + * New: Added file_size_bytes notification parameter. + * New: Added time formats notification text modifiers. + * New: Added support for thetvdb_url for movies. +* UI: + * Fix: Activity card overflowing due to screen scaling. (#2033) + * Fix: Stream duration on activity card not being updated on track changes in some cases. (#2206) + + +## v2.13.2 (2023-10-26) + +* History: + * New: Added quarter values icons for history watch status. (#2179, #2156) (Thanks @herby2212) +* Graphs: + * New: Added concurrent streams per day graph. (#2046) (Thanks @herby2212) +* Exporter: + * New: Added metadata directory to exporter fields. + * Removed: Banner exporter fields for tv shows. +* UI: + * New: Added last triggered time to notification agents and newsletter agent lists. +* Other: + * New: Added X-Plex-Language header override to config file. + + +## v2.13.1 (2023-08-25) + +* Notes: + * Support for Python 3.7 has been dropped. The minimum Python version is now 3.8. +* Other: + * Fix: Tautulli failing to start on some systems. + + +## v2.13.0 (2023-08-25) + +* Notes: + * Support for Python 3.7 has been dropped. The minimum Python version is now 3.8. +* Notifications: + * Fix: Improved watched notification trigger description. (#2104) + * New: Added notification image option for iOS Tautulli Remote app. +* Exporter: + * New: Added track chapter export fields. + * New: Added on-demand subtitle export fields. + + +## v2.12.5 (2023-07-13) + +* Activity: + * New: Added d3d11va to list of hardware decoders. +* History: + * Fix: Incorrect grouping of play history. + * New: Added button in settings to regroup play history. +* Notifications: + * Fix: Incorrect concurrent streams notifications by IP addresss for IPv6 addresses (#2096) (Thanks @pooley182) +* UI: + * Fix: Occasional UI crashing on Python 3.11. + * New: Added multiselect user filters to History and Graphs pages. (#2090) (Thanks @zdimension) +* API: + * New: Added regroup_history API command. + * Change: Updated graph API commands to accept a comma separated list of user IDs. + + +## v2.12.4 (2023-05-23) + +* History: + * Fix: Set view offset equal to duration if a stream is stopped within the last 10 sec. +* Other: + * Fix: Database import may fail for some older databases. + * Fix: Double-quoted strings for newer versions of SQLite. (#2015, #2057) +* API: + * Change: Return the ID for async API calls (export_metadata, notify, notify_newsletter). + + +## v2.12.3 (2023-04-14) + +* Activity: + * Fix: Incorrect subtitle decision shown when subtitles are transcoded. +* History: + * Fix: Incorrect order when sorting by the duration column in the history tables. +* Notifications: + * Fix: Logging error when running scripts that use PlexAPI. +* UI: + * Fix: Calculate file sizes setting causing the media info table to fail to load. + * Fix: Incorrect artwork and thumbnail shown for Live TV on the Most Active Libraries statistics card. +* API: + * Change: Renamed duration to play_duration in the get_history API response. (Note: duration kept for backwards compatibility.) + + +## v2.12.2 (2023-03-16) * Other: - * Fix: Login to Tautulli not working on Python 2. + * Fix: Tautulli not starting on FreeBSD jails. -## v2.5.1-beta (2020-06-26) +## v2.12.1 (2023-03-14) +* Activity: + * Fix: Stop checking for deprecated sync items sessions. + * Change: Do not show audio language on activity cards for music. +* Other: + * Fix: Tautulli not starting on macOS. + + +## v2.12.0 (2023-03-13) + +* Notifications: + * New: Added support for Telegram group topics. (#1980) + * New: Added anidb_id and anidb_url notification parameters. (#1973) + * New: Added notification triggers for Intro Marker, Commercial Marker, and Credits Marker. + * New: Added various intro, commercial, and credits marker notification parameters. + * New: Allow setting a custom Pushover notification sound. (#2005) + * Change: Notification images are now uploaded directly to Discord without the need for a 3rd party image hosting service. + * Change: Automatically strip whitespace from notification condition values. + * Change: Trigger watched notifications based on the video watched completion behaviour setting. +* Exporter: + * Fix: Unable to run exporter when using the Snap package. (#2007) + * New: Added credits marker, and audio/subtitle settings to export fields. +* UI: + * Fix: Incorrect styling and missing content for collection media info pages. + * New: Added edition details field on movie media info pages. (#1957) (Thanks @herby2212) + * New: Added setting to change the video watched completion behaviour. + * New: Added watch time and user statistics to collection and playlist media info pages. (#1982, #2012) (Thanks @herby2212) + * New: Added history table to collection and playlist media info pages. + * New: Dynamically change watched status in the UI based on video watched completion behaviour setting. + * New: Added hidden setting to override server name. + * Change: Move track artist to a details field instead of in the title on track media info pages. +* API: + * New: Added section_id and user_id parameters to get_home_stats API command. (#1944) + * New: Added marker info to get_metadata API command results. + * New: Added media_type parameter to get_item_watch_time_stats and get_item_user_stats API commands. (#1982) (Thanks @herby2212) + * New: Added last_refreshed timestamp to get_library_media_info API command response. +* Other: + * Change: Migrate analytics to Google Analytics 4. + + +## v2.11.1 (2022-12-22) + +* Activity: + * Fix: Use source language instead of stream language on activity cards. +* Notifications: + * Fix: Blank start time notification parameters causing recently added notifications to fail. (#1940) +* Other: + * Fix: Tautulli failing to start when using python 3.7. + * Fix: Snap install failing to start. (#1941) + * Fix: Update check crashing when git is missing. (#1943) (Thanks @Minituff) + + +## v2.11.0 (2022-12-22) + +* Activity: + * New: Added audio and subtitle language to activity cards. (#1831, #1900) (Thanks @fscorrupt) +* History: + * New: Log subtitle language and subtitle forced to database. (#1826) +* Notifications: + * Fix: Validating condition operators would fail with a blank parameter. + * New: Added start time and stop time notification parameters. (#1931) + * New: Added session_key to LunaSea notification payload. (#1929) (Thanks @JagandeepBrar) +* Newsletters: + * Fix: Allow CSS to support light and dark themes. +* Exporter: + * New: Added editionTitle to movie exporter fields. + * Change: m3u8 export changed to .m3u file extension. File is still encoded using UTF-8. +* UI: + * Fix: Link watch statistics to media page using metadata from history. (#1882) + * New: Show subtitle language and subtitle forced flag in stream data modal. +* Other: + * Fix: Mask more user and metadata fields for guest access. (#1913) + * Change: Disable TLS 1.0 and 1.1 for the webserver. Minimum TLS version is 1.2. (#1870) + * Change: Use system language for requests to Plex Media Server. + + +## v2.10.5 (2022-11-07) + +* Notifications: + * New: Added edition_title notification parameter. (#1838) + * Change: Track notifications link to MusicBrainz track instead of album. +* Newsletters: + * New: Added months time frame for newsletters. (#1876) +* UI: + * Fix: Broken link on library statistic cards. (#1852) + * Fix: Check for IPv6 host when generating QR code for app registration. + * Fix: Missing padding on condition operator dropdown on small screens. +* Other: + * Fix: Launching browser when webserver is bound to IPv6. + * New: Tautulli can be installed via the Windows Package Manager (winget). + * Change: Separate stdout and stderr console logging. (#1874) +* API: + * Fix: API not returning 400 response code. + * New: Added edition_title to get_metadata API response. + * New: Added collections to get_children_metadata API response. + * New: Added user_thumb to get_history API response. + * New: Validate custom notification conditions before saving notification agents. (#1846) + * Change: Fallback to parent_thumb for seasons in get_metadata API response. + + +## v2.10.4 (2022-09-05) + +* Activity: + * New: Added tooltip for quality profile on activity cards. +* Notifications: + * New: Added "does not begin with" and "does not end with" condition operators. +* UI: + * Fix: Album count showing 0 on library statistics. + * Fix: Library statistics not showing up for libraries without any history. + + +## v2.10.3 (2022-08-09) + +* Notifications: + * New: Added JSON support for MQTT notifications. (#1763) + * New: Added show year notification parameter. +* Exporter: + * New: Added guids to artist, album, and track metadata export fields. + * New: Added languageTag to stream media info export fields. +* UI: + * Fix: Long channel identifier overflowing activity card. (#1802) + * Change: Use the last played item's artwork for library statistics cards. +* Other: + * Fix: Username log filter causing database to lock up. (#1705) + * Change: Username log filter only applies to usernames longer than 3 characters. (#1806) +* API: + * New: Added parent_year and grandparent_year to get_metadata_details API command. + * New: Added last played metadata to top_libraries and top_users in get_home_stats API command. + * New: Allow fallback to another PMS image in pms_image_proxy API command. + + +## v2.10.2 (2022-07-03) + +* Activity: + * Fix: Incorrect audio stream info shown on the activity card when playing a secondary audio track. +* UI: + * Fix: Usernames not showing on the home statistics cards. + * Fix: Do not save a user's friendly name if it is the same as the username. + * Change: Update library icons to the latest Plex style. + + +## v2.10.1 (2022-06-01) + +* Notifications: + * New: Added support for MusicBrainz (mbid://) guids in notification parameters without MusicBrainz lookup enabled. Requires Plex Media Server 1.27.0 or newer with refreshed Plex Music agent metadata. +* Mobile App: + * Fix: OneSignal validation failing when registering a device. +* API: + * New: Added grandparent_guids and parent_guids to get_metadata API command. + * Change: Updated continent in get_geoip_lookup API command. + * Change: Removed server_token from from get_users API command. + * Change: shared_libraries changed to a list instead of a string for get_users API command. + + +## v2.10.0 (2022-05-23) + +* Activity: + * Fix: Detection of Dolby Vision missing for PMS 1.26.1. +* Notifications: + * Fix: Parsing of filename notification parameter incorrect for Windows PMS. +* Exporter: + * New: Added additional theme and label export fields. +* UI: + * Fix: Slow loading of collections and playlists tables. + * Change: Update default user thumbnail image to match Plex Web. +* API: + * Change: Values for get_users_table and get_libraries_table return an integer instead of "Checked". + + +## v2.9.7 (2022-04-11) + +* UI: + * Fix: Managed user missing the username in the Users table. + + +## v2.9.6 (2022-04-10) + +* Activity: + * New: Improved display of dynamic range on the activity cards. (Thanks @herby2212) +* Notifications: + * Change: Make include summary option apply to all media types for Discord and Slack notifications. +* UI: + * Fix: Validating Plex login in the setup wizard. (#1697) + * New: Added hidden username, email, and full name columns to users table. +* Other: + * Fix: Apply pms_timeout setting to websocket connection. + * Fix: Importing of Plex username instead of the full name. (#1710) + + +## v2.9.5 (2022-03-26) + +* Note: + * Updated Snap packages are currently unavailable due to an upstream issue. +* Activity: + * Change: Improve calculation for transcode progress bar percentage on the activity cards. +* History: + * Fix: Live TV history filter not working. (#1691) +* Newsletter: + * Fix: Newsletter not showing different album types. (#1559) +* UI: + * Fix: Display season summary on the media info page if available with a fallback to show summary. (#1657) + * Change: Colour active filter buttons to improve contrast. (#1663) +* API: + * New: Added transcode offset keys to get_activity command. +* Other: + * Fix: Reschedule backup task after changing backup interval. (#1662) + * Fix: Dynamic anonymous redirect setting not being enabled by default after the setup wizard. + * Fix: Usernames with special characters not being filtered in the logs. + + +## v2.9.4 (2022-02-12) + +* UI: + * Fix: Setup wizard appearing when restarting after saving settings. +* Other: + * Fix: Stop Tautulli from starting multiple instances on Windows after a clean reinstall. Check the startup items in Windows Task Manager if it is still occurring. + + +## v2.9.3 (2022-02-09) + +* UI: + * Fix: Setup wizard looping. +* Other: + * Fix: Logger username masking preventing Tautulli from starting on new installs. + + +## v2.9.2 (2022-02-08) + +* Notification: + * New: Added support for additional Telegram HTML tags. + * Removed: Revert Telegram defaulting to MarkdownV2 and only support HTML. (#1635) +* Other: + * Fix: The Local user being masked in the logs. + + +## v2.9.1 (2022-02-07) + +* Other: + * Fix: Incorrect changelog version number and date. + + +## v2.9.0 (2022-02-07) + +* Notification: + * New: Added track disc number notification parameter. + * Change: Default Telegram messages to MarkdownV2 when HTML is disabled. (#1635) +* Exporter: + * Fix: Images not being included in export zip file download. +* UI: + * Fix: Favicon missing from the newsletter authentication page. + * Fix: IPv6 details not being shown in IP address modal. (#1629) + * Fix: PWA not respecting device rotation settings. (#1633) + * New: Added intermediary login page to the Plex XML shortcuts. + * New: Added setting to mask usernames in logs (enabled by default). + * New: Added location, secure connection, and Plex Relay details to IP address modal. + * Change: Remove Plex token from the settings page. + * Change: Increase verifying server timeout to 30 seconds. +* API: + * New: Added get_tautulli_info API command. + * New: Added location, secure, and relayed to get_history API response. + * Change: Null pms_token and jwt_token in the response of the get_settings API command. (#1616) +* Other: + * Fix: Better validation of config when saving settings. + * Fix: Correct section_id and prevent rating_key collisions when updating metadata. (#1640) + * Change: Proxy Plex token check and Plex downloads json through the Tautulli server. + * Change: Remove tokens from downloaded database and config files. + * Change: Do not import pms_token or jwt_secret when importing a config file. + + +## v2.8.1 (2022-01-04) + +* API: + * New: Added grouping and query_days parameters to the get_item_watch_time_stats API command. + * New: Added grouping parameter to the get_item_user_stats API command. + * New: Added total_time to the get_library_user_stats, get_user_player_stats, and get_item_user_stats API command responses. + * Removed: media_type parameter no longer required for the get_item_watch_time_stats, and get_item_user_stats API commands. The media type is determined automatically. +* Other: + * Fix: Clean .pyc files automatically after updating. + * New: Allow Snap package to access /media and /mnt locations. Refer to the FAQ for instructions on how to enable access. + + +## v2.8.0 (2021-12-15) + +* History: + * Fix: Live TV history filter not working correctly when combined with other filters. + * Fix: Direct Stream history filter not remembering the state when reloading the page. + * Fix: History table not loading when no filters are selected. + * New: Added watch time and user stats to media info pages. (Thanks @herby2212) (#1417, #1471) +* Notifications: + * New: Added Microsoft Teams notification agent. (#1514) + * New: Added Gotify notification agent. (#1584) + * New: Add warning message that passwords are not copied when duplicating a notification or newsletter agent. (#1540) +* Newsletters: + * Fix: Different album types not shown on newsletter. (#1559) +* Exporter: + * New: Added album formats, subformats, and sonic analysis export fields. +* UI: + * Fix: Docker config volume message overlapping modal windows. (#1567) + * Fix: Different album types not shown on artist media info page. + * New: Added show more/less toggle for summaries on media info pages. (#1546) + * Change: Do not save datatable page or search states when reloading the page. (#1532) + * Change: Improve the Plex log reader. +* API: + * New: Added before and after parameters to the get_history API command. +* Other: + * Fix: Updated Python dependencies. (#1499) + * Fix: Some websocket connections not respecting the verify SSL setting. (Thanks @nmaggioni) (#1541) + * New: Support for Python 3.10. (#1522) + * New: Added dynamic anonymous redirect service setting. (#1526) + + +## v2.7.7 (2021-10-14) + +* Notifications: + * Fix: Colons and exclamation marks being replaced outside of expressions. + * New: Added LunaSea notification agent. Note: Requires a future LunaSea app update to function. +* Newsletters: + * Fix: Star rating not showing on newsletter with the new Plex metadata agents. (#1511) +* UI: + * Fix: Sorting of mobile devices table with uppercase and lowercase device names. + * Fix: Various dropdown menus with centered text to left-aligned text. +* Other: + * Fix: Plex.tv account token not changing when fetching a new token. + * New: Added check and warning message for missing Docker container volume mount. + + +## v2.7.6 (2021-08-31) + +* Notifications: + * Fix: Unable to parse colons (:) and exclamation marks (!) in notification text eval strings. +* Exporter: + * Fix: Unable to export playlists and collections from a library. (#1484) + * New: Added new episode export fields. +* Mobile App: + * Fix: Unable to scan QR code with dark mode enabled. + * New: Tautulli Remote App is out of beta for iOS and can be downloaded in the App Store. +* Other: + * New: Update PlexAPI to 4.6.3. + * New: Added popup alert message for Windows and macOS when Tautulli fails to start. + + +## v2.7.5 (2021-07-15) + +* History: + * Fix: Guest users were unable to view history. + * Fix: Most Active Library statistics was counting deleted libraries. +* Newsletters: + * Fix: Incorrect padding on the newsletter configuration modal. +* Mobile App: + * New: Tautulli Remote App is out of beta on Android. The iOS app is available for beta testing on TestFlight. +* API: + * New: Added mobile device platform and version to device registration. +* Other: + * Fix: Unable to remove authentication. + * Change: Improve API key and device token security on Python 3. + * Remove: Basic Authentication setting. + + +## v2.7.4 (2021-06-19) + +* Activity: + * Fix: Incorrect quality profile shown on the activity card. +* Notifications: + * New: Added ability to evaluate Python expressions in notification parameters. + * New: Added tilde (~) to represent blank notification condition values. +* Exporter: + * Fix: Blank fields missing from csv and json exports. + * New: Added some new exporter fields. +* Graphs: + * Fix: Play counts and durations not matching the homepage statistics. +* UI: + * New: Show search bar in the collapsed menu on the mobile layout. (#1446) + * Change: Do not show seconds for total played duration on Users and Libraries tables. +* Other: + * Fix: Check the Tautulli data folder is writable on startup. (#1441) + * New: Update PlexAPI to 4.6.1. + * Change: Always hash HTTP password in config file. + + +## v2.7.3 (2021-05-22) + +* Activity: + * Fix: Incorrect quality profile being shown when transcoding to a higher bitrate. +* Notifications: + * New: Added notification parameters for duration values in seconds. (#1434) + * New: Added setting to allow repeat Tautulli update notifications. By default the Tautulli update notification will only notify once. + * New: Added setting to allow repeat Plex Media Server update notifications. By default the Plex Media Server update notification will only notify once. + * New: Added setting to configure the Tautulli update check interval. +* UI: + * Fix: Prevent accidentally closing modals when dragging the mouse outside the window. + * Fix: Recently added queue modal not loading. (#1429) + * New: Show collections tab in music libraries. (#1421) + * New: Added method to logout of active Tautulli sessions from the login logs. +* API: + * Fix: Update edit_user and edit_library doc strings for required parameters. (#1432) +* Other: + * New: Added advanced hidden setting for CherryPy thread pool size. (Thanks @psaab #1425) + + +## v2.7.2 (2021-04-24) + +* UI: + * New: Show smart collections in the library collections tab. + + +## v2.7.1 (2021-04-22) + +* Notifications: + * Fix: Recently added single episode being sent as a show notification. (#1420) +* Newsletters: + * Change: Ignore items with incorrect added at dates in the future. +* Exporter: + * Fix: Exporting not working for libraries, collections, and playlists. (#1408) +* UI: + * Fix: Collections and playlist tabs not loading on library and user pages. (#1408) + * Fix: Header overlapping graphs tabs on mobile layout. + * Change: Rename "Plays by Period" graph tab to "Media Type". + * Removed: Clear logs button removed from main Tautulli logs. + + +## v2.7.0 (2021-04-10) + +* History: + * New: Added transcode decision filter added to history tables. + * New: History table filters changed to allow multiple selections. +* Notifications: + * Fix: Recently added notifications failing due to metadata not being available yet on the Plex server. (#1392) + * New: Added separate SSL/TLS support for Email notifications. + * New: Added notification image type setting for Tautulli Remote App notifications. + * New: Added guid notification parameter. + * New: Added a Plex server down notification threshold setting. +* Newsletters: + * Fix: Newsletters would fail if an episode was missing a season number. +* UI: + * Fix: Fixed spacing of rating images on the media info pages. + * Fix: Fixed refreshing cached image in the browser. + * Fix: Bootstrap tooltips logging javascript errors in some instances. + * Fix: Activity card progress bar not filling at 100%. (#1404) + * New: Added blurred background to the Most Active Users statistics card. + * New: Added transcode decision filter for all history tables. + * New: Added an error popup message if the Plex.tv token is no longer valid when visiting the settings page. + * New: Added Amazon Alexa platform logo. + * Change: Improved loading times for the homepage watch statistics. + * Change: Improved loading times for user and library watch time statistics. + * Change: Improved loading of the graph's history modal popup. + * Change: Automatically trim trailing slashes from the Tautulli Public Domain setting. + * Change: Renamed the Plex Media Server "Use SSL" setting to "Use Secure Connection". + * Change: Update Microsoft Edge platform logo. + * Change: Consider link local IP addresses as local addresses. + * Change: Reveal token fields if they are blank to make it easier to input new values. +* Mobile App: + * New: Accept disabled OneSignal ID during device registration. +* API: + * New: Added user fallback image option to the pms_image_proxy command. + * New: Added optional include_last_seen parameter to the get_user command. + * New: Added optional include_last_accessed parameter to the get_library command. + * New: Allow comma separated filter values for the get_history command. +* Other: + * Fix: Importing the newsletter table would fail when manually repairing a corrupted database. + * Fix: Make fix match in Tautulli for music case-insensitive. + * New: Update PlexAPI to 4.5.2. + * Change: Migrate section_id from the session_history_metadata database table to session_history. + * Change: Copy the database file to the cache folder when importing a database using the browse option. + * Change: Delete the cached database file after successfully importing. + + +## v2.6.10 (2021-03-17) + +* Other: + * Fix: Configuration upgrade would fail if the Most Active User card was disabled. (#1395) + + +## v2.6.9 (2021-03-17) + +* Notifications: + * New: Added tautulli_update_exe and tautulli_update_exe notification parameters for Tautulli update notifications. +* Exporter: + * New: Added new TV show export fields for the beta Plex TV agent. +* UI: + * Fix: Some popover images not showing up on hover. (#1391) + * Remove: HTTP Host setting removed from the UI. This setting may still be changed in the config file. + * New: Added a Most Active Libraries statistics card to the homepage. (Thanks @herby2212) + * New: Mask sensitive text fields in the settings. Settings can be revealed by clicking on the eye icon. +* Mobile App: + * Change: Make OneSignal validation asynchronous to help timeout issues when registering a device. +* API: + * Added top_libraries stat_id option to get_home_stats API commaand. +* Ohter: + * New: Updated PlexAPI to 4.4.1. + + +## v2.6.8 (2021-03-08) + +* Mobile App: + * New: An all new Tautulli Remote App 2.0. Go to the Google Play link in the settings to download the new version. + * Fix: Registering the new app would fail if OneSignal is blocked. + + +## v2.6.7 (2021-03-07) + +* History: + * New: Added audio language to detailed stream info. (Thanks @herby2212) +* Notifications: + * New: Added season_name notification parameter. + * New: Update notifications to support custom season titles. +* Newsletters: + * New: Update recently added newsletter template to support custom season titles. +* Exporter: + * New: Added originalTitle and bannerFile to TV show export fields. +* UI: + * New: Added TVDB rating image to info page for the new Plex TV agent. + * New: Update the UI to support custom season titles. +* API: + * Fix: Return rating key for collections/playlists in get_synced_items. + * Fix: Return error when delete_synced_item fails. + * New: Return sync_media_type for collections/playlist in get_synced_items. + * New: Update pms_image_proxy to support playlist composite images. +* Other: + * Remove: Auto-updater for the Windows exe installer due to it being flagged by antivirus software. + * New: Updated PlexAPI to 4.4.0. + + +## v2.6.6 (2021-02-06) + +* Exporter: + * Fix: Exporting failed with long file paths on Windows. + * New: Updated various exporter fields. + * Change: Renamed collection children to collection items. +* UI: + * Fix: Client side login redirect changed to server side. + * Change: Renamed "Fix Metadata" button to "Fix Match". +* API: + * New: Added get_children_metadata API command. + * New: Return more metadata from the get_home_stats API command. +* Other: + * New: Updated PlexAPI to 4.3.1. + + +## v2.6.5 (2021-01-09) + +* Other: + * Fix: Some IP addresses not being masked in the logs. + * New: Auto-updater for Windows exe installer. + * Change: Allow Snap package to access the user home directory. + * Change: Migrate Snap user data to a persistent location that is retained if Tautulli is reinstalled. + + +## v2.6.4 (2020-12-20) + +* Other: + * Fix: Restore Snap data folder from previous installs. + + +## v2.6.3 (2020-12-19) + +* Announcements: + * This is the last Tautulli version to support Python 2. Python 3 will be required to continue receiving updates. You can check your Python version on the settings page. +* Exporter: + * Fix: Accessible and exists attributes were blank for media info export level 9. +* UI: + * Fix: Guest usernames were not masked on mouse hover. +* Other: + * Fix: macOS menu bar icon for light and dark mode. + * New: Tautulli can officially be installed on Linux using a Snap package. See the installation wiki for details. + + +## v2.6.2 (2020-12-05) + +* Notifications: + * Change: Send a notification of a user new device for the first time only. This can be toggled off in the settings. +* Exporter: + * Fix: Allow exporting child fields only without requiring the parent fields as well. + * Fix: Exporting individual collection would fail. + * Change: Remove accessible and exists fields from the default media info export levels. This prevents the Plex server from reading the media files unnecessarily. +* Other: + * Fix: Enable high resolution for the macOS system tray icon and menu. + * New: Added rate limiting for failed login attempts. + * Change: Use a white logo for the macOS system tray icon. +* API: + * New: Added machine_id to the get_history API response. + + +## v2.6.1 (2020-11-03) + +* Other: + * Fix: High CPU/memory usage in some instances. + * Fix: Logger error preventing Tautulli from starting. + * Fix: Database issue with non-unique image hashes. + + +## v2.6.0 (2020-10-31) + +* Exporter: + * New: New exporter feature that allows you to export the metadata and images for any library, collection, playlist, or media item to csv, json, xml, or m3u8. Refer to the Exporter Guide in the wiki for more details. +* UI: + * Fix: Margin on the homepage activity and statistic/library cards. (Thanks @dotsam) + * Fix: Movie ratings not showing on the info page for the new Plex Movie agent. + * New: Added ability to browse collections and playlists from the library and user pages. + * Change: Updated platform brand logos and colours. +* API: + * New: Added export_metadata, download_export, and delete_export API commands. + * New: Added get_collections_table, and get_playlists_table API commands. + * New: Added min_version parameter to the register_device API command. + * New: Added include_activity parameter to the get_history API command. + * New: Added sync_id parameter to the get_metadata API command. + * New: Added delete_synced_item API command. + * New: Added a stat_id and stats_start parameters to the get_home_stats API command. + * New: Allow deleting a mobile device using the registration device_id for the delete_mobile_device API command. + * Change: Return Plex server info and Tautulli info from the register_device command. +* Other: + * New: The Docker container is now also built for the arm32v6 architecture. + * New: The Docker container is also published to the GitHub Container Registry at ghcr.io/tautulli/tautulli. + * Change: Tautulli is now using a forked version of plexapi 3.6.0. This is to support the exporter feature while still maintaining Python 2 compatibility. + * Change: Updated systemd script to remove process forking. (Thanks @MichaIng) + * Change: Cache GitHub update check on startup. + + +## v2.5.6 (2020-10-02) + +* Activity: + * Change: Renamed container "Transcode" to "Converting" on activity cards. +* Notifications: + * New: Added a silent notification option for Telegram. (Thanks @JohnnyKing94) + * New: Added container_decision notification parameter. + * New: Added notification trigger for Playback Error. + * New: Added remote access down notification threshold setting. +* Newsletter: + * Change: Stop flooring newsletter start date. +* UI: + * Fix: Unable to purge history from the library edit modal. + * Fix: QR code not showing up for localhost address when trying to register a device. + * New: Added library name to the fix metadata modal. +* API: + * New: Added default thumb and art to the Live TV library. +* Other: + * Fix: Synced items not loading for guest access. + * New: Schedule some more automatic database optimizations. + * Change: Added automatic uninstall before installing to the Windows installer. + + +## v2.5.5 (2020-09-06) + +* Activity: + * Fix: Filter out TV show background theme music sessions. +* Notifications: + * New: Check Plex external guids for notification metadata provider links. +* UI: + * Fix: Incorrect sorting for user/library recently played items. +* API: + * Fix: get_synced_items API command returning error with empty result. + * Fix: Download API commands not returning the file. + * Fix: get_logs API command encoding error. + * Fix: get_user_player_stats API command returning error instead of empty result. + * New: Added get_server_info API command. + * New: Added external guids to get_metadata API command. + * New: Added support for multi-column sorting for datatable API commands. + * Change: get_activity API command return thumbnail override for clips. + * Change: get_libraries_table API command return custom library artwork. +* Other: + * Fix: Tautulli failed to run with a stale pid file. + * New: Added scheduled task to optimize the Tautulli database. + * Change: Update plexapi to 3.6.0. + * Change: Update some libraries for Python 3 compatibility. + + +## v2.5.4 (2020-07-31) + +* Monitoring: + * Change: Montitoring remote access changed to use websockets. Refer to Tautulli/Tautulli-Issues#251 for details. +* Notifications: + * Fix: Uploading images to Cloudinary failed for titles with non-ASCII characters on Python 2. + * New: Added plex_id notification parameter. + * Remove: Running .exe files directly using script notifications is no longer supported. + * Remove: php, perl, and ruby prefix overrides for script notifications is no longer supported. + * Change: Stricter checking of file extensions for script notifications. + * Change: Fallback to The Movie Database lookup using title and year. + * Change: Fallback to TVmaze lookup using title. +* UI: + * New: Added ability to import a previous Tautullli configuration file in the settings. + * New: Added a browse button for settings which require a folder or file input. + * New: Added first streamed column to user IP addresses table. (Thanks @dotsam) + * New: Added The Movie Database rating image to media page. + * Change: Different icon to represent direct stream in the history tables. +* API: + * New: Updated API docs for importing a database and configuration file. + + +## v2.5.3 (2020-07-10) + +* History: + * Fix: Unable to delete more than 1000 history entries at the same time. +* Notifications: + * Change: Python script notifications to run using the same Python interpreter as Tautulli. +* Newsletters: + * Fix: Unable to view newsletters with special characters. +* Other: + * Fix: Tautulli failing to start after enabling HTTPS when installed using the Windows / macOS installers. + * Fix: Startup script not working on macOS. + * Fix: Unable to hide dock icon on macOS with the pkg install. Refer to the FAQ regarding the Python rocket dock icon. + * Change: Added path to Python interpreter in system startup (daemon) scripts. + * Change: Added Python version to Google analytics. + + +## v2.5.2 (2020-07-01) + +* Announcements: + * Tautulli now supports Python 3! + * Python 2 is still supported for the time being, but it is recommended to upgrade to Python 3. * Notifications: * Fix: Error uploading images to Cloudinary on Python 2. * Fix: Testing browser notifications alert not disappearing. * Change: Default recently added notification delay set to 300 seconds. * UI: * Fix: MacOS menu bar icon causing Tautulli to fail to start. - * New: Added platform icon for LG devices. -* Mobile App: - * Fix: Improved API security and validation when registering the Android app. -* Other: - * Fix: Error creating self-signed certificates on Python 3. - * Fix: Docker container not respecting the PUID and PGID environment variables. - * Fix: Tautulli login session cookie not set on the HTTP root path. - * Remove: Ability to login to Tautulli using a Plex username and password has been removed. Login using a Plex.tv account is only supported via OAuth. - - -## v2.5.0-beta (2020-05-31) - -* Announcements: - * Tautulli now supports Python 3! - * Python 2 is still supported for the time being, but it is recommended to upgrade to Python 3. -* UI: + * Fix: Unable to login to Tautulli on Python 2. * New: Windows and MacOS setting to enable Tautulli to start automatically when you login. * New: Added menu bar icon for MacOS. * New: Ability to import a Tautulli database in the settings. * New: Added Tautulli news area on the settings page. + * New: Added platform icon for LG devices. + * Remove: Ability to login to Tautulli using a Plex username and password has been removed. Login using a Plex.tv account is only supported via OAuth. +* Mobile App: + * Fix: Improved API security and validation when registering the Android app. +* Docker: + * Fix: Docker container not respecting the PUID and PGID environment variables. * Other: + * Fix: Error creating self-signed certificates on Python 3. + * Fix: Tautulli login session cookie not set on the HTTP root path. * New: Windows and MacOS app installers to install Tautulli without needing Python installed. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e687432e..46a644e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,12 +9,12 @@ All pull requests should be based on the `nightly` branch, to minimize cross mer ### Python Code #### Compatibility -The code should work with Python 2.7.17 or Python 3.6+. Note that Tautulli runs on many different platforms. +The code should work with Python 3.8+. Note that Tautulli runs on many different platforms. Re-use existing code. Do not hesitate to add logging in your code. You can the logger module `plexpy.logger.*` for this. Web requests are invoked via `plexpy.request.*` and derived ones. Use these methods to automatically add proper and meaningful error handling. #### Code conventions -Although Tautulli did not adapt a code convention in the past, we try to follow the [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide): +Although Tautulli did not adopt a code convention in the past, we try to follow [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide): * 4 space indentation * 80 characters per line diff --git a/Dockerfile b/Dockerfile index d30dc3be..8d8c324b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM tautulli/tautulli-baseimage:python3 +FROM ghcr.io/tautulli/tautulli-baseimage:python3 LABEL maintainer="Tautulli" @@ -9,15 +9,20 @@ ENV TAUTULLI_DOCKER=True ENV TZ=UTC WORKDIR /app - +COPY . /app RUN \ + groupadd -g 1000 tautulli && \ + useradd -u 1000 -g 1000 tautulli && \ echo ${BRANCH} > /app/branch.txt && \ echo ${COMMIT} > /app/version.txt -COPY . /app +RUN \ + mkdir /config && \ + touch /config/DOCKER +VOLUME /config +CMD [ "python", "Tautulli.py", "--datadir", "/config" ] ENTRYPOINT [ "./start.sh" ] -VOLUME /config EXPOSE 8181 -HEALTHCHECK --start-period=90s CMD curl -ILfSs http://localhost:8181/status > /dev/null || curl -ILfkSs https://localhost:8181/status > /dev/null || exit 1 +HEALTHCHECK --start-period=90s CMD curl -ILfks https://localhost:8181/status > /dev/null || curl -ILfs http://localhost:8181/status > /dev/null || exit 1 diff --git a/README.md b/README.md index 8157d43f..37829290 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,163 @@ # Tautulli -A python based web application for monitoring, analytics and notifications for [Plex Media Server](https://plex.tv). +A python based web application for monitoring, analytics and notifications for +[Plex Media Server](https://plex.tv). -This project is based on code from [Headphones](https://github.com/rembo10/headphones) and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb). +This project is based on code from [Headphones](https://github.com/rembo10/headphones) +and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb). ## Features -* Responsive web design viewable on desktop, tablet and mobile web browsers. -* Themed to complement Plex/Web. -* Easy configuration setup (no separate web server required). -* Monitor current Plex Media Server activity. -* Fully customizable notifications for stream activity and recently added media. -* Top statistics on home page with configurable duration and measurement metric. -* Global watching history with search/filtering & dynamic column sorting. -* Full user list with general information and comparison stats. -* Individual user information including devices IP addresses. -* Complete library statistics and media file information. -* Rich analytics presented using Highcharts graphing. -* Beautiful content information pages. -* Full sync list data on all users syncing items from your library. -* And many more!! +- Responsive web design viewable on desktop, tablet and mobile web browsers. +- Themed to complement Plex/Web. +- Easy configuration setup (no separate web server required). +- Monitor current Plex Media Server activity. +- Fully customizable notifications for stream activity and recently added media. +- Top statistics on home page with configurable duration and measurement metric. +- Global watching history with search/filtering & dynamic column sorting. +- Full user list with general information and comparison stats. +- Individual user information including devices IP addresses. +- Complete library statistics and media file information. +- Rich analytics presented using Highcharts graphing. +- Beautiful content information pages. +- Full sync list data on all users syncing items from your library. +- And many more!! ## Preview -* [Full preview gallery available on our website](https://tautulli.com) +[Full preview gallery available on our website][Tautulli] ![Tautulli Homepage](https://tautulli.com/images/screenshots/activity-compressed.jpg?v=2) -## Installation & Support +## Installation -[![Python](https://img.shields.io/badge/python-2.7.17,%203.6,%203.7,%203.8-blue?style=flat-square)](https://python.org/downloads) -[![Docker Pulls](https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) -[![Docker Stars](https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) +[![Python][badge-python]][Python] +[![Docker Pulls][badge-docker-pulls]][DockerHub] +[![Docker Stars][badge-docker-stars]][DockerHub] +[![Downloads][badge-downloads]][Releases Latest] + +[badge-python]: https://img.shields.io/badge/python->=3.9-blue?style=flat-square +[badge-docker-pulls]: https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square +[badge-docker-stars]: https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square +[badge-downloads]: https://img.shields.io/github/downloads/Tautulli/Tautulli/total?style=flat-square | Status | Branch: `master` | Branch: `beta` | Branch: `nightly` | | --- | --- | --- | --- | -| Release | [![Release@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest)
[![Release Date@master](https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/releases/latest) | [![Release@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases)
[![Commits@beta](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/beta) | [![Last Commits@nightly](https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly)
[![Commits@nightly](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly) | -| Docker | [![Docker@master](https://img.shields.io/badge/docker-latest-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Docker Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster) | [![Docker@beta](https://img.shields.io/badge/docker-beta-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Docker Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta) | [![Docker@nightly](https://img.shields.io/badge/docker-nightly-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Docker Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly) | -| Installer | [![Windows@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest)
[![MacOS@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest)
[![Installer Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Amaster) | [![Windows@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases)
[![MacOS@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases)
[![Installer Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Abeta) | [![Installer Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Anightly) | +| Release | [![Release@master][badge-release-master]][Releases Latest]
[![Release Date@master][badge-release-master-date]][Releases Latest] | [![Release@beta][badge-release-beta]][Releases]
[![Commits@beta][badge-release-beta-commits]][Commits Beta] | [![Last Commits@nightly][badge-release-nightly-last-commit]][commits Nightly]
[![Commits@nightly][badge-release-nightly-commits]][Commits Nightly] | +| Docker | [![Docker@master][badge-docker-master]][DockerHub]
[![Docker Build@master][badge-docker-master-ci]][Publish Docker Master] | [![Docker@beta][badge-docker-beta]][DockerHub]
[![Docker Build@beta][badge-docker-beta-ci]][Publish Docker Beta] | [![Docker@nightly][badge-docker-nightly]][DockerHub]
[![Docker Build@nightly][badge-docker-nightly-ci]][Publish Docker Nightly] | +| Snap | [![Snap@master][badge-snap-master]][Snapcraft]
[![Snap Build@master][badge-snap-master-ci]][Publish Snap Master] | [![Snap@beta][badge-snap-beta]][Snapcraft]
[![Snap Build@beta][badge-snap-beta-ci]][Publish Snap Beta] | [![Snap@nightly][badge-snap-nightly]][Snapcraft]
[![Snap Build@nightly][badge-snap-nightly-ci]][Publish Snap Nightly] | +| Installer | [![Windows@master][badge-installer-master-win]][Releases Latest]
[![MacOS@master][badge-installer-master-macos]][Releases Latest]
[![Installer Build@master][badge-installer-master-ci]][Publish Installer Master] | [![Windows@beta][badge-installer-beta-win]][Releases]
[![MacOS@beta][badge-installer-beta-macos]][Releases]
[![Installer Build@beta][badge-installer-beta-ci]][Publish Installer Beta] | [![Installer Build@nightly][badge-installer-nightly-ci]][Publish Installer Nightly] | -[![Wiki](https://img.shields.io/badge/github-wiki-black?style=flat-square)](https://github.com/Tautulli/Tautulli-Wiki/wiki) -[![Discord](https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA)](https://tautulli.com/discord) -[![Reddit](https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700)](https://www.reddit.com/r/Tautulli/) -[![Plex Forums](https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square)](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242) +Read the [Installation Guides][Installation] for instructions on how to install Tautulli. -* Read the [Installation Guides](https://github.com/Tautulli/Tautulli-Wiki/wiki/Installation) for instructions to install Tautulli. -* The [Frequently Asked Questions](https://github.com/Tautulli/Tautulli-Wiki/wiki/Frequently-Asked-Questions) in the wiki can help you with common problems. -* Support is available on [Discord](https://tautulli.com/discord), [Reddit](https://www.reddit.com/r/Tautulli), or the [Plex Forums](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242). +[badge-release-master]: https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square +[badge-release-master-date]: https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue +[badge-release-beta]: https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square +[badge-release-beta-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue +[badge-release-nightly-last-commit]: https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue +[badge-release-nightly-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue +[badge-docker-master]: https://img.shields.io/badge/docker-latest-blue?style=flat-square +[badge-docker-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=master +[badge-docker-beta]: https://img.shields.io/badge/docker-beta-blue?style=flat-square +[badge-docker-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=beta +[badge-docker-nightly]: https://img.shields.io/badge/docker-nightly-blue?style=flat-square +[badge-docker-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=nightly +[badge-snap-master]: https://img.shields.io/badge/snap-stable-blue?style=flat-square +[badge-snap-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=master +[badge-snap-beta]: https://img.shields.io/badge/snap-beta-blue?style=flat-square +[badge-snap-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=beta +[badge-snap-nightly]: https://img.shields.io/badge/snap-edge-blue?style=flat-square +[badge-snap-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=nightly +[badge-installer-master-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square +[badge-installer-master-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square +[badge-installer-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=master +[badge-installer-beta-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square +[badge-installer-beta-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square +[badge-installer-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=beta +[badge-installer-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=nightly -## Issues & Feature Requests +## Support -[![Issues](https://img.shields.io/badge/github-issues-red?style=flat-square)](https://github.com/Tautulli/Tautulli-Issues) -[![Feathub](https://img.shields.io/badge/feathub-requests-lightgrey?style=flat-square)](https://feathub.com/Tautulli/Tautulli) +[![Wiki][badge-wiki]][Wiki] +[![Discord][badge-discord]][Discord] +[![Reddit][badge-reddit]][Reddit] +[![Plex Forums][badge-forums]][Plex Forums] +[![Issues][badge-issues]][Issues] -* Please see the [Issues Repository](https://github.com/Tautulli/Tautulli-Issues). +[badge-wiki]: https://img.shields.io/badge/github-wiki-black?style=flat-square +[badge-discord]: https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA +[badge-reddit]: https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700 +[badge-forums]: https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square +[badge-issues]: https://img.shields.io/badge/github-issues-black?style=flat-square + +If you think you've found a bug in Tautulli make sure you have read the [FAQ][] +first to make sure it hasn't been covered by one of the questions there. If your +problem isn't answered in the FAQ try the following first: + +- Update to the latest version of Tautulli. +- Turning your device off and on again. +- Analyzing your logs, you just might find the solution yourself! +- Using the **search** function to see if this issue has already been reported/solved. +- Checking the [Wiki][] for [Installation][] instructions and reading the [FAQs][FAQ]. +- For basic questions try asking on [Discord][], [Reddit][], + or the [Plex Forums][] first before opening an issue. + +**If nothing has worked:** + +1. Please check the [issues tracker][Issues] to see if someone else has already reported the bug. +2. If this is a new bug, open a [bug report][Issue New] on the issues tracker. +3. Provide a clear title to easily help identify your problem. +4. Use proper [Markdown syntax][] to structure your post (i.e. code/log in code blocks). +5. Make sure to fill out the required information on the issue template. +6. Close your issue when it's solved! If you found the solution yourself please + comment so that others benefit from it. + +## Feature Requests + +1. Pleases check the [issues tracker][Issues] to see if someone else has already requested the feature. + If a similar idea has already been requested, _give it a thumbs up_. **Do not comment + with `+1` or something similar as it creates unnecessary spam.** +2. If this is a new feature request, open a [feature request][Issue New] on the issues tracker. ## License -[![License](https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/blob/master/LICENSE) +[![License][badge-license]][License] -This is free software under the GPL v3 open source license. Feel free to do with it what you wish, but any modification must be open sourced. A copy of the license is included. +[badge-license]: https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square -This software includes Highsoft software libraries which you may freely distribute for non-commercial use. Commerical users must licence this software, for more information visit https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution. \ No newline at end of file +This is free software under the GPL v3 open source license. Feel free to do with it what you wish, +but any modification must be open sourced. A copy of the license is included. + +This software includes Highsoft software libraries which you may freely distribute for +non-commercial use. Commercial users must licence this software, for more information visit +https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution. + + +[Python]: https://python.org/downloads +[DockerHub]: https://hub.docker.com/r/tautulli/tautulli +[Releases]: https://github.com/Tautulli/Tautulli/releases +[Releases Latest]: https://github.com/Tautulli/Tautulli/releases/latest +[License]: https://github.com/Tautulli/Tautulli/blob/master/LICENSE +[FAQ]: https://github.com/Tautulli/Tautulli/wiki/Frequently-Asked-Questions +[Installation]: https://github.com/Tautulli/Tautulli/wiki/Installation +[Issues]: https://github.com/Tautulli/Tautulli/issues +[Issue New]: https://github.com/Tautulli/Tautulli/issues/new/choose +[Markdown syntax]: https://help.github.com/articles/github-flavored-markdown +[Tautulli]: http://tautulli.com +[Wiki]: https://github.com/Tautulli/Tautulli/wiki +[Discord]: https://tautulli.com/discord +[Reddit]: https://reddit.com/r/Tautulli +[Plex Forums]: https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242 +[Snapcraft]: https://snapcraft.io/tautulli +[Commits Beta]: https://github.com/Tautulli/Tautulli/commits/beta +[Commits Nightly]: https://github.com/Tautulli/Tautulli/commits/nightly + +[Publish Docker Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster +[Publish Docker Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta +[Publish Docker Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly +[Publish Snap Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Amaster +[Publish Snap Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Abeta +[Publish Snap Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Anightly +[Publish Installer Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Amaster +[Publish Installer Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Abeta +[Publish Installer Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Anightly diff --git a/Tautulli.py b/Tautulli.py index c0f36a41..b3cf4736 100755 --- a/Tautulli.py +++ b/Tautulli.py @@ -23,17 +23,18 @@ import sys # Ensure lib added to path, before any other imports sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib')) -from future.builtins import str -import appdirs import argparse import datetime import locale +import platformdirs import pytz import signal +import shutil import time import threading import tzlocal +import ctypes import plexpy from plexpy import common, config, database, helpers, logger, webstart @@ -69,8 +70,26 @@ def main(): plexpy.SYS_ENCODING = None try: - locale.setlocale(locale.LC_ALL, "") - plexpy.SYS_LANGUAGE, plexpy.SYS_ENCODING = locale.getdefaultlocale() + + # Attempt to get the system's locale settings + language_code, encoding = locale.getlocale() + + # Special handling for Windows platform + if sys.platform == 'win32': + # Get the user's current language settings on Windows + windll = ctypes.windll.kernel32 + lang_id = windll.GetUserDefaultLCID() + + # Map Windows language ID to locale identifier + language_code = locale.windows_locale.get(lang_id, '') + + # Get the preferred encoding + encoding = locale.getpreferredencoding() + + # Assign values to application-specific variable + plexpy.SYS_LANGUAGE = language_code + plexpy.SYS_ENCODING = encoding + except (locale.Error, IOError): pass @@ -110,7 +129,7 @@ def main(): if args.quiet: plexpy.QUIET = True - # Do an intial setup of the logger. + # Do an initial setup of the logger. # Require verbose for pre-initilization to see critical errors logger.initLogger(console=not plexpy.QUIET, log_dir=False, verbose=True) @@ -124,6 +143,9 @@ def main(): if helpers.bool_true(os.getenv('TAUTULLI_DOCKER', False)): plexpy.DOCKER = True + plexpy.DOCKER_MOUNT = not os.path.isfile('/config/DOCKER') + if helpers.bool_true(os.getenv('TAUTULLI_SNAP', False)): + plexpy.SNAP = True if args.dev: plexpy.DEV = True @@ -131,8 +153,7 @@ def main(): if args.daemon: if sys.platform == 'win32': - sys.stderr.write( - "Daemonizing not supported under Windows, starting normally\n") + logger.warn("Daemonizing not supported under Windows, starting normally") else: plexpy.DAEMON = True plexpy.QUIET = True @@ -150,11 +171,13 @@ def main(): try: with open(plexpy.PIDFILE, 'r') as fp: pid = int(fp.read()) - os.kill(pid, 0) except IOError as e: raise SystemExit("Unable to read PID file: %s", e) + + try: + os.kill(pid, 0) except OSError: - logger.warn("PID file '%s' already exists, but PID %d is " \ + logger.warn("PID file '%s' already exists, but PID %d is " "not running. Ignoring PID file." % (plexpy.PIDFILE, pid)) else: @@ -181,10 +204,19 @@ def main(): if args.datadir: plexpy.DATA_DIR = args.datadir elif plexpy.FROZEN: - plexpy.DATA_DIR = appdirs.user_data_dir("Tautulli", False) + plexpy.DATA_DIR = platformdirs.user_data_dir("Tautulli", False) else: plexpy.DATA_DIR = plexpy.PROG_DIR + # Migrate Snap data dir + if plexpy.SNAP: + snap_common = os.environ['SNAP_COMMON'] + old_data_dir = os.path.join(snap_common, 'Tautulli') + if os.path.exists(old_data_dir) and os.listdir(old_data_dir): + plexpy.SNAP_MIGRATE = True + logger.info("Migrating Snap user data.") + shutil.move(old_data_dir, plexpy.DATA_DIR) + if args.config: config_file = args.config else: @@ -199,9 +231,18 @@ def main(): 'Could not create data directory: ' + plexpy.DATA_DIR + '. Exiting....') # Make sure the DATA_DIR is writeable - if not os.access(plexpy.DATA_DIR, os.W_OK): + test_file = os.path.join(plexpy.DATA_DIR, '.TEST') + try: + with open(test_file, 'w'): + pass + except IOError: raise SystemExit( 'Cannot write to the data directory: ' + plexpy.DATA_DIR + '. Exiting...') + finally: + try: + os.remove(test_file) + except OSError: + pass # Put the database in the DATA_DIR plexpy.DB_FILE = os.path.join(plexpy.DATA_DIR, database.FILENAME) @@ -223,23 +264,13 @@ def main(): # Start the background threads plexpy.start() - # Force the http port if neccessary + # Force the http port if necessary if args.port: plexpy.HTTP_PORT = args.port logger.info('Using forced web server port: %i', plexpy.HTTP_PORT) else: plexpy.HTTP_PORT = int(plexpy.CONFIG.HTTP_PORT) - # Check if pyOpenSSL is installed. It is required for certificate generation - # and for CherryPy. - if plexpy.CONFIG.ENABLE_HTTPS: - try: - import OpenSSL - except ImportError: - logger.warn("The pyOpenSSL module is missing. Install this " - "module to enable HTTPS. HTTPS will be disabled.") - plexpy.CONFIG.ENABLE_HTTPS = False - # Try to start the server. Will exit here is address is already in use. webstart.start() @@ -265,7 +296,10 @@ def main(): if plexpy.CONFIG.SYS_TRAY_ICON: # MacOS menu bar icon must be run on the main thread and is blocking # Start the rest of Tautulli on a new thread - threading.Thread(target=wait).start() + thread = threading.Thread(target=wait) + thread.daemon = True + thread.start() + plexpy.MAC_SYS_TRAY_ICON = macos.MacOSSystemTray() plexpy.MAC_SYS_TRAY_ICON.start() else: diff --git a/contrib/clean_pyc.bat b/contrib/clean_pyc.bat new file mode 100755 index 00000000..e4436dea --- /dev/null +++ b/contrib/clean_pyc.bat @@ -0,0 +1,11 @@ +@echo off +:: Display information +echo This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated. +echo Press enter to continue, or CTRL + C to quit. +pause + +cd ..\ +:: Remove *.pyc files +del /S *.pyc +:: Remove __pycache__ folders +for /d /r . %%d in (__pycache__) do @if exist "%%d" rd /s /q "%%d" \ No newline at end of file diff --git a/contrib/clean_pyc.sh b/contrib/clean_pyc.sh index e3d47e44..ea555159 100755 --- a/contrib/clean_pyc.sh +++ b/contrib/clean_pyc.sh @@ -1,9 +1,11 @@ -#!/bin/bash +#!/usr/bin/env bash # Display information echo "This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated." echo "Press enter to continue, or CTRL + C to quit." read -# Remove the *.pyc -find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \; \ No newline at end of file +# Remove *.pyc files +find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \; +# Remove __pycache__ folders +find "`dirname $0`/.." -type d -name "__pycache__" -exec rm -rf {} \; \ No newline at end of file diff --git a/contrib/downgrade.sh b/contrib/downgrade.sh index edd4779e..e4822c46 100755 --- a/contrib/downgrade.sh +++ b/contrib/downgrade.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Parameter check if [ -z "$1" ]; then diff --git a/data/interfaces/default/app_import.html b/data/interfaces/default/app_import.html index 4edfcaee..74af4313 100644 --- a/data/interfaces/default/app_import.html +++ b/data/interfaces/default/app_import.html @@ -5,7 +5,7 @@ -

Upload the ${app} database you wish to import.

+

Upload the ${app} database file you wish to import (max file size is 1GB).

@@ -40,13 +40,13 @@
- + - +
-

Browse for the ${app} database you wish to import.

+

Browse for the ${app} database file you wish to import.

% if app == 'Tautulli':
@@ -64,7 +64,6 @@
  • Merge will add all history and remove any duplicates from the imported database into the current database.
  • Overwrite will replace all history in the current database with the imported database.
  • -

    Note: Libraries, users, notification agents, newsletter agents, and registered mobile devices will also be imported

    Automatically create a backup of the current database before importing.

    +
    + +

    The following data will also be imported:

    + +
    % else:
    @@ -106,19 +114,9 @@
    + + + - + + + + \ No newline at end of file diff --git a/data/interfaces/default/configuration_table.html b/data/interfaces/default/configuration_table.html index 989b1766..e0f3155d 100644 --- a/data/interfaces/default/configuration_table.html +++ b/data/interfaces/default/configuration_table.html @@ -11,6 +11,7 @@ DOCUMENTATION :: END <%! import os + import sqlite3 import sys import plexpy from plexpy import common, logger @@ -22,11 +23,11 @@ DOCUMENTATION :: END % if plexpy.CURRENT_VERSION: Git Branch: - ${plexpy.CONFIG.GIT_BRANCH} + ${plexpy.CONFIG.GIT_BRANCH} Git Commit Hash: - ${plexpy.CURRENT_VERSION} + ${plexpy.CURRENT_VERSION} % endif @@ -49,6 +50,10 @@ DOCUMENTATION :: END Cache Directory: ${plexpy.CONFIG.CACHE_DIR} + + Export Directory: + ${plexpy.CONFIG.EXPORT_DIR} + Newsletter Directory: ${plexpy.CONFIG.NEWSLETTER_DIR} @@ -65,28 +70,36 @@ DOCUMENTATION :: END System Timezone: - ${plexpy.SYS_TIMEZONE.zone} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)}) + ${str(plexpy.SYS_TIMEZONE)} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)}) + + + System Language: + ${plexpy.SYS_LANGUAGE}${' (override {})'.format(plexpy.CONFIG.PMS_LANGUAGE) if plexpy.CONFIG.PMS_LANGUAGE else ''} Python Version: ${sys.version} + + SQLite Version: + ${sqlite3.sqlite_version} + Resources: - Tautulli Website | - GitHub Source | - GitHub Issues | - GitHub Wiki | - FeatHub Feature Requests + Tautulli Website | + Source | + Wiki | + Bug Reports | + Feature Requests Support: - Tautulli Discord Server | - Tautulli Subreddit | - Plex Forums + Tautulli Discord Server | + Tautulli Subreddit | + Plex Forums diff --git a/data/interfaces/default/css/bootstrap-select.min.css b/data/interfaces/default/css/bootstrap-select.min.css new file mode 100644 index 00000000..d22faa63 --- /dev/null +++ b/data/interfaces/default/css/bootstrap-select.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap-select v1.13.14 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2020 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */@-webkit-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@-o-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}.bootstrap-select>select.bs-select-hidden,select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px\0;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover{color:rgba(255,255,255,.5)}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none;z-index:0!important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2!important}.bootstrap-select.is-invalid .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus,.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*=col-]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*=col-].dropdown-menu-right,.row .bootstrap-select[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select,.form-horizontal .bootstrap-select,.form-inline .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-lg .dropdown-toggle,.bootstrap-select.form-control-sm .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:0!important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0!important;padding:0!important}.bootstrap-select.bs-container .dropdown-menu{z-index:1060}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0!important;float:left;opacity:0!important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:0!important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:rgba(255,255,255,.5)!important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{-webkit-animation:.3s linear 750ms forwards bs-notify-fadeOut;-o-animation:.3s linear 750ms forwards bs-notify-fadeOut;animation:.3s linear 750ms forwards bs-notify-fadeOut}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:'\00a0'}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:'';display:block;width:.5em;height:1em;border-style:solid;border-width:0 .26em .26em 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none} \ No newline at end of file diff --git a/data/interfaces/default/css/bootstrap3/bootstrap.min.css b/data/interfaces/default/css/bootstrap3/bootstrap.min.css index d65c66b1..c5887780 100644 --- a/data/interfaces/default/css/bootstrap3/bootstrap.min.css +++ b/data/interfaces/default/css/bootstrap3/bootstrap.min.css @@ -2,4 +2,4 @@ * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.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:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.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:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.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:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.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:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.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:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.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:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../../fonts/bootstrap3/glyphicons-halflings-regular.eot);src:url(../../fonts/bootstrap3/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../../fonts/bootstrap3/glyphicons-halflings-regular.woff2) format('woff2'),url(../../fonts/bootstrap3/glyphicons-halflings-regular.woff) format('woff'),url(../../fonts/bootstrap3/glyphicons-halflings-regular.ttf) format('truetype'),url(../../fonts/bootstrap3/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:'Open Sans',sans-serif;font-size:14px;line-height:1.42857143;color:#fff;background-color:#1f1f1f}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{margin-top:5px;color:#fff;border:0 solid #444;background:#333;height:30px;padding:2px 5px 2px 12px;background-color:#3a3a3a;border-radius:14.5px;transition:background-color .3s}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{outline:0;color:#555;background-color:#fff;transition:background-color .3s}a{text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.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:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.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:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.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:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.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:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.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:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.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:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{min-height:16.42857143px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;opacity:0;line-break:auto}.tooltip.in{opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/data/interfaces/default/css/dataTables.bootstrap.css b/data/interfaces/default/css/dataTables.bootstrap.css deleted file mode 100644 index 033c6522..00000000 --- a/data/interfaces/default/css/dataTables.bootstrap.css +++ /dev/null @@ -1,371 +0,0 @@ -div.dataTables_length label { - font-weight: normal; - text-align: left; - white-space: nowrap; -} - -div.dataTables_length select { - width: 75px; - display: inline-block; -} - -div.dataTables_filter { - text-align: right; -} - -div.dataTables_filter label { - font-weight: normal; - white-space: nowrap; - text-align: left; -} - -div.dataTables_filter input { - margin-left: 0.5em; - display: inline-block; - width: auto; -} - -div.dataTables_info { - padding-top: 8px; - white-space: nowrap; -} - -div.dataTables_paginate { - margin: 0; - white-space: nowrap; - text-align: right; -} - -div.dataTables_paginate ul.pagination { - margin: 2px 0; - white-space: nowrap; -} - -@media screen and (max-width: 767px) { - div.dataTables_wrapper > div.row > div, - div.dataTables_length, - div.dataTables_filter, - div.dataTables_info, - div.dataTables_paginate { - text-align: center; - } - - div.DTTT { - margin-bottom: 0.5em; - } -} - - -table.dataTable td, -table.dataTable th { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - - -table.dataTable { - clear: both; - margin-top: 6px !important; - margin-bottom: 6px !important; - max-width: none !important; -} - -table.dataTable thead .sorting, -table.dataTable thead .sorting_asc, -table.dataTable thead .sorting_desc, -table.dataTable thead .sorting_asc_disabled, -table.dataTable thead .sorting_desc_disabled { - cursor: pointer; - position: relative; -} - -table.dataTable thead .sorting:after, -table.dataTable thead .sorting_asc:after, -table.dataTable thead .sorting_desc:after { - position: absolute; - top: 8px; - right: 8px; - display: block; - font-family: 'Glyphicons Halflings'; - opacity: 0.5; -} -table.dataTable thead .sorting:after { - opacity: 0.2; - content: "\e150"; /* sort */ -} -table.dataTable thead .sorting_asc:after { - content: "\e155"; /* sort-by-attributes */ -} -table.dataTable thead .sorting_desc:after { - content: "\e156"; /* sort-by-attributes-alt */ -} -div.dataTables_scrollBody table.dataTable thead .sorting:after, -div.dataTables_scrollBody table.dataTable thead .sorting_asc:after, -div.dataTables_scrollBody table.dataTable thead .sorting_desc:after { - display: none; -} - -table.dataTable thead .sorting_asc_disabled:after, -table.dataTable thead .sorting_desc_disabled:after { - color: #eee; -} - -table.dataTable thead > tr > th { - padding-right: 30px; -} - -table.dataTable th:active { - outline: none; -} - - -/* Condensed */ -table.dataTable.table-condensed thead > tr > th { - padding-right: 20px; -} - -table.dataTable.table-condensed thead .sorting:after, -table.dataTable.table-condensed thead .sorting_asc:after, -table.dataTable.table-condensed thead .sorting_desc:after { - top: 6px; - right: 6px; -} - -/* Scrolling */ -div.dataTables_scrollHead table { - margin-bottom: 0 !important; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -div.dataTables_scrollHead table thead tr:last-child th:first-child, -div.dataTables_scrollHead table thead tr:last-child td:first-child { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.dataTables_scrollBody table { - border-top: none; - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -div.dataTables_scrollBody tbody tr:first-child th, -div.dataTables_scrollBody tbody tr:first-child td { - border-top: none; -} - -div.dataTables_scrollFoot table { - margin-top: 0 !important; - border-top: none; -} - -/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column - width calculations when using scrolling impossible to align columns. We have - to use separate - */ -table.table-bordered.dataTable { - border-collapse: separate !important; -} -table.table-bordered thead th, -table.table-bordered thead td { - border-left-width: 0; - border-top-width: 0; -} -table.table-bordered tbody th, -table.table-bordered tbody td { - border-left-width: 0; - border-bottom-width: 0; -} -table.table-bordered tfoot th, -table.table-bordered tfoot td { - border-left-width: 0; - border-bottom-width: 0; -} -table.table-bordered th:last-child, -table.table-bordered td:last-child { - border-right-width: 0; -} -div.dataTables_scrollHead table.table-bordered { - border-bottom-width: 0; -} - - - - -/* - * TableTools styles - */ -.table.dataTable tbody tr.active td, -.table.dataTable tbody tr.active th { - background-color: #08C; - color: white; -} - -.table.dataTable tbody tr.active:hover td, -.table.dataTable tbody tr.active:hover th { - background-color: #0075b0 !important; -} - -.table.dataTable tbody tr.active th > a, -.table.dataTable tbody tr.active td > a { - color: white; -} - -.table-striped.dataTable tbody tr.active:nth-child(odd) td, -.table-striped.dataTable tbody tr.active:nth-child(odd) th { - background-color: #017ebc; -} - -table.DTTT_selectable tbody tr { - cursor: pointer; -} - -div.DTTT .btn:hover { - text-decoration: none !important; -} - -ul.DTTT_dropdown.dropdown-menu { - z-index: 2003; -} - -ul.DTTT_dropdown.dropdown-menu a { - color: #333 !important; /* needed only when demo_page.css is included */ -} - -ul.DTTT_dropdown.dropdown-menu li { - position: relative; -} - -ul.DTTT_dropdown.dropdown-menu li:hover a { - background-color: #0088cc; - color: white !important; -} - -div.DTTT_collection_background { - z-index: 2002; -} - -/* TableTools information display */ -div.DTTT_print_info { - position: fixed; - top: 50%; - left: 50%; - width: 400px; - height: 150px; - margin-left: -200px; - margin-top: -75px; - text-align: center; - color: #333; - padding: 10px 30px; - opacity: 0.95; - - background-color: white; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); -} - -div.DTTT_print_info h6 { - font-weight: normal; - font-size: 28px; - line-height: 28px; - margin: 1em; -} - -div.DTTT_print_info p { - font-size: 14px; - line-height: 20px; -} - -div.dataTables_processing { - position: absolute; - top: 50%; - left: 50%; - width: 100%; - height: 60px; - margin-left: -50%; - margin-top: -25px; - padding-top: 20px; - padding-bottom: 20px; - text-align: center; - font-size: 1.2em; - background-color: white; - background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0))); - background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); - background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); -} - - - -/* - * FixedColumns styles - */ -div.DTFC_LeftHeadWrapper table, -div.DTFC_LeftFootWrapper table, -div.DTFC_RightHeadWrapper table, -div.DTFC_RightFootWrapper table, -table.DTFC_Cloned tr.even { - background-color: white; - margin-bottom: 0; -} - -div.DTFC_RightHeadWrapper table , -div.DTFC_LeftHeadWrapper table { - border-bottom: none !important; - margin-bottom: 0 !important; - border-top-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, -div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, -div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, -div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -div.DTFC_RightBodyWrapper table, -div.DTFC_LeftBodyWrapper table { - border-top: none; - margin: 0 !important; -} - -div.DTFC_RightBodyWrapper tbody tr:first-child th, -div.DTFC_RightBodyWrapper tbody tr:first-child td, -div.DTFC_LeftBodyWrapper tbody tr:first-child th, -div.DTFC_LeftBodyWrapper tbody tr:first-child td { - border-top: none; -} - -div.DTFC_RightFootWrapper table, -div.DTFC_LeftFootWrapper table { - border-top: none; - margin-top: 0 !important; -} - - -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after, -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after, -div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after, -div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after { - display: none; -} - - -/* - * FixedHeader styles - */ -div.FixedHeader_Cloned table { - margin: 0 !important -} diff --git a/data/interfaces/default/css/dataTables.bootstrap.min.css b/data/interfaces/default/css/dataTables.bootstrap.min.css new file mode 100644 index 00000000..1d319758 --- /dev/null +++ b/data/interfaces/default/css/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +td.dt-control{background:url("https://www.datatables.net/examples/resources/details_open.png") no-repeat center center;cursor:pointer}tr.dt-hasChild td.dt-control{background:url("https://www.datatables.net/examples/resources/details_close.png") no-repeat center center}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:"Glyphicons Halflings";opacity:.5}table.dataTable thead .sorting:after{opacity:.2;content:"î…"}table.dataTable thead .sorting_asc:after{opacity:.5;content:"î…•"}table.dataTable thead .sorting_desc:after{opacity:.5;content:"î…–"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} diff --git a/data/interfaces/default/css/dataTables.colVis.css b/data/interfaces/default/css/dataTables.colVis.css index 94bcdd39..dcbfa76f 100644 --- a/data/interfaces/default/css/dataTables.colVis.css +++ b/data/interfaces/default/css/dataTables.colVis.css @@ -71,7 +71,7 @@ ul.ColVis_collection { list-style: none; width: 150px; padding: 8px 8px 4px 8px; - margin: 10px 0px 0px 0px; + margin: 10px 0px 10px 0px; background-color: #444; overflow: hidden; z-index: 2002; diff --git a/data/interfaces/default/css/tautulli.css b/data/interfaces/default/css/tautulli.css index f6b10992..ceb9b91c 100644 --- a/data/interfaces/default/css/tautulli.css +++ b/data/interfaces/default/css/tautulli.css @@ -1,6 +1,6 @@ body { font-family: 'Open Sans', Arial, sans-serif; - color: #fff; + color: #eee; margin-top: 50px; overflow: hidden; } @@ -36,7 +36,7 @@ select.input-sm { select[multiple] { height: 125px; margin: 5px 0 5px 0; - color: #fff; + color: #eee; border: 0px solid #444; background: #555; padding: 2px 2px; @@ -48,7 +48,7 @@ select[multiple]:focus { outline: 0; outline: thin dotted \9; color: #555; - background-color: #fff; + background-color: #eee; transition: background-color .3s; } select[multiple]:focus::-webkit-scrollbar-thumb { @@ -63,7 +63,7 @@ select[multiple] option { select.form-control, div.form-control .selectize-input { margin: 5px 0 5px 0; - color: #fff; + color: #eee; border: 0px solid #444; background: #555; padding: 6px 12px; @@ -76,10 +76,9 @@ select.form-control { } .react-selectize.root-node .react-selectize-control, .selectize-control.form-control .selectize-input { - color: #fff !important; + color: #eee !important; border: 0px solid #444 !important; background: #555 !important; - padding: 1px 2px; transition: background-color .3s; } .selectize-control.form-control .selectize-input { @@ -87,7 +86,6 @@ select.form-control { align-items: center; flex-wrap: wrap; margin-bottom: 4px; - padding-left: 5px; } .selectize-control.form-control.selectize-pms-ip .selectize-input { padding-left: 12px !important; @@ -122,16 +120,26 @@ select.form-control { #condition-widget .fa-minus { cursor: pointer; } +#condition-widget .condition-operator-col { + padding-left: 0; + padding-right: 0; +} +@media (max-width: 767px) { + #condition-widget .condition-operator-col { + padding-left: 15px; + padding-right: 15px; + } +} .react-selectize.root-node .react-selectize-control .react-selectize-placeholder { - color: #fff !important; + color: #eee !important; } .react-selectize.root-node .react-selectize-control .react-selectize-toggle-button path { - fill: #fff !important; + fill: #eee !important; } .react-selectize.root-node .simple-value, .selectize-control.multi .selectize-input > div { - background: #444444 !important; - color: #ffffff !important; + background: #444 !important; + color: #eee !important; padding-bottom: 2px !important; transition: background-color .3s; } @@ -156,7 +164,7 @@ select.form-control:focus, outline: 0; outline: thin dotted \9; color: #555 !important; - background-color: #fff !important; + background-color: #eee !important; transition: background-color .3s; } .react-selectize.root-node.open .simple-value, @@ -217,9 +225,16 @@ select.form-control:focus, .selectize-dropdown .optgroup-header { font-weight: bold; } +.selectize-dropdown [data-selectable].option-disabled { + color: #aaa; + cursor: default; +} select.form-control option { color: #555; - background-color: #fff; + background-color: #eee; +} +select.btn { + text-align: left; } img { -webkit-box-sizing: content-box; @@ -278,13 +293,13 @@ object { } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #fff; + color: #eee; background-color: #2f2f2f; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; + color: #eee; background-color: #2f2f2f; } .dropdown-menu > .disabled > a, @@ -323,20 +338,20 @@ object { } .btn-dark:focus, .btn-dark.focus { - color: #d7d7d7; - background-color: #3B3B3B; + color: #d7d7d7; + background-color: #3B3B3B; } .btn-dark:hover { - color: #fff; - background-color: #333; - border-color: #444; + color: #eee; + background-color: #333; + border-color: #444; } .btn-dark:active, .btn-dark.active, .open > .dropdown-toggle.btn-dark { - color: #fff; - background-color: #333; - border-color: #444; + color: #eee; + background-color: #333; + border-color: #444; } .btn-dark:active:hover, .btn-dark.active:hover, @@ -347,13 +362,13 @@ object { .btn-dark:active.focus, .btn-dark.active.focus, .open > .dropdown-toggle.btn-dark.focus { - color: #fff; - background-color: #333; + color: #eee; + background-color: #333; } .btn-dark:active, .btn-dark.active, .open > .dropdown-toggle.btn-dark { - background-image: none; + background-image: none; } .btn-dark.disabled, .btn-dark[disabled], @@ -373,8 +388,8 @@ fieldset[disabled] .btn-dark:active, .btn-dark.disabled.active, .btn-dark[disabled].active, fieldset[disabled] .btn-dark.active { - background-color: #333; - color: #aaa; + background-color: #333; + color: #aaa; } .btn-dark.inactive:hover { color: #d7d7d7; @@ -383,30 +398,30 @@ fieldset[disabled] .btn-dark.active { cursor: default; } .btn-dark .badge { - color: #e5e5e5; - background-color: #3B3B3B; + color: #e5e5e5; + background-color: #3B3B3B; } .btn-bright { - color: #fff; - background-color: #cc7b19; - box-shadow: inset 0 1px 0 #e7993b; + color: #eee; + background-color: #cc7b19; + box-shadow: inset 0 1px 0 #e7993b; } .btn-bright:focus, .btn-bright.focus { - color: #fff; - background-color: #eb8600; + color: #eee; + background-color: #eb8600; } .btn-bright:hover { - color: #fff; - background-color: #e59029; - box-shadow: inset 0 1px 0 #ebac60; + color: #eee; + background-color: #e59029; + box-shadow: inset 0 1px 0 #ebac60; } .btn-bright:active, .btn-bright.active, .open > .dropdown-toggle.btn-bright { - color: #fff; - background-color: #cc7b19; - box-shadow: inset 0 1px 0 #e7993b; + color: #eee; + background-color: #cc7b19; + box-shadow: inset 0 1px 0 #e7993b; } .btn-bright:active:hover, .btn-bright.active:hover, @@ -417,14 +432,14 @@ fieldset[disabled] .btn-dark.active { .btn-bright:active.focus, .btn-bright.active.focus, .open > .dropdown-toggle.btn-bright.focus { - color: #fff; - background-color: #cc7b19; - box-shadow: inset 0 1px 0 #e7993b; + color: #eee; + background-color: #cc7b19; + box-shadow: inset 0 1px 0 #e7993b; } .btn-bright:active, .btn-bright.active, .open > .dropdown-toggle.btn-bright { - background-image: none; + background-image: none; } .btn-bright.disabled, .btn-bright[disabled], @@ -444,13 +459,13 @@ fieldset[disabled] .btn-bright:active, .btn-bright.disabled.active, .btn-bright[disabled].active, fieldset[disabled] .btn-bright.active { - background-color: #cc7b19; - border-color: #b56d16; + background-color: #cc7b19; + border-color: #b56d16; } .btn-bright .badge { - color: #fff; - background-color: #cc7b19; - box-shadow: inset 0 1px 0 #e7993b; + color: #eee; + background-color: #cc7b19; + box-shadow: inset 0 1px 0 #e7993b; } .btn-danger.btn-edit { color: #d7d7d7; @@ -459,22 +474,26 @@ fieldset[disabled] .btn-bright.active { float: right; } .btn-danger.btn-edit:hover { - color: #fff; + color: #eee; background-color: #c9302c; border-color: #ac2925; } .btn-danger.btn-edit.active { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; + color: #eee; + background-color: #c9302c; + border-color: #ac2925; } .btn-danger.btn-edit.active:hover { - color: #fff; - background-color: #ac2925; - border-color: #761c19; + color: #eee; + background-color: #ac2925; + border-color: #761c19; } .btn-group select { margin-top: 0; + height: 34px; +} +.btn-group label { + margin-bottom: 0; } .input-group-addon-form { display: inline-block; @@ -488,9 +507,6 @@ fieldset[disabled] .btn-bright.active { width: 100%; margin-top: 5px; } -#user-selection label { - margin-bottom: 0; -} .alert-edit { display: none; float: left; @@ -512,7 +528,7 @@ fieldset[disabled] .btn-bright.active { background-color: #222222; } .modal-body table { - color: #fff; + color: #eee; } .modal-body li { margin-top: 7px; @@ -526,7 +542,7 @@ fieldset[disabled] .btn-bright.active { color: #E5A00D; } .modal-body i.fa { - color: #fff; + color: #eee; } .modal-body td:hover a .fa, .modal-body a:focus i.fa { @@ -560,7 +576,7 @@ input[type="tel"], input[type="color"], .uneditable-input { margin: 5px 0 5px 0; - color: #fff; + color: #eee; border: 0px solid #444; background: #555; height: 32px; @@ -572,7 +588,7 @@ input[type="color"], textarea.form-control { height: initial; margin: 5px 0 5px 0; - color: #fff; + color: #eee; border: 0px solid #444; background: #555; padding: 6px 12px; @@ -584,7 +600,7 @@ textarea.form-control { textarea.form-control:focus { outline: 0; color: #555; - background-color: #fff; + background-color: #eee; transition: background-color .3s; } .pagination > li > a, @@ -594,7 +610,7 @@ textarea.form-control:focus { padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; - color: #fff; + color: #eee; text-decoration: none; background-color: #262626; border: 1px solid #444444; @@ -613,7 +629,7 @@ textarea.form-control:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; - color: #fff; + color: #eee; cursor: default; background-color: #cc7b19; border-color: #444444; @@ -632,7 +648,7 @@ textarea.form-control:focus { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; + color: #eee; background-color: #cc7b19; } .nav-pills > li > a { @@ -651,12 +667,12 @@ textarea.form-control:focus { white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; - touch-action: manipulation; + touch-action: manipulation; cursor: pointer; -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; background-image: none; background-color: #3B3B3B; color: #e5e5e5; @@ -666,11 +682,18 @@ textarea.form-control:focus { -webkit-appearance:none; } .btn-form:hover { - color: #fff; + color: #eee; background-color: #333; } .btn-form:focus { - color: #fff; + color: #eee; +} +.btn-filter.active, +.btn-filter.active.focus { + background-color: #b7800a !important; +} +.btn-filter.active:hover { + background-color: #896007 !important; } .form-control-feedback { color: #E5A00D; @@ -682,7 +705,7 @@ fieldset[disabled] .form-control { background-color: #555; } .form-control[readonly]:focus { - background-color: #fff; + background-color: #eee; } .poster { position: relative; @@ -745,16 +768,17 @@ a .users-poster-face:hover { position: relative; } #dashboard-checking-activity, -#dashboard-no-activity { +#dashboard-no-activity, +#dashboard-checking-recently-added, +#dashboard-no-recently-added { margin-bottom: 20px; } .dashboard-activity-instance { float: left; position: relative; height: 290px; - min-width: 350px; max-width: 500px; - margin-right: 25px; + margin-left: 25px; margin-bottom: 25px; } .dashboard-activity-container { @@ -941,7 +965,7 @@ a .users-poster-face:hover { font-size: 10px; text-align: right; text-transform: uppercase; - line-height: 14px; + line-height: 10px; -webkit-flex-shrink: 0; flex-shrink: 0; } @@ -981,6 +1005,12 @@ a .users-poster-face:hover { font-size: 10px; z-index: 2; } +.dashboard-activity-info-channel { + display: inline-block; + max-width: 75px; + text-overflow: ellipsis; + overflow: hidden; +} .dashboard-activity-progress { width: 100%; height: 5px; @@ -1030,7 +1060,7 @@ a .users-poster-face:hover { height: 249px; } .dashboard-activity-container:hover .dashboard-activity-progress { - height: 14px; + height: 14px; } .dashboard-activity-container:hover .progress-bar { color: rgba(255, 255, 255, 1); @@ -1071,7 +1101,7 @@ a:hover .dashboard-activity-cover { font-size: 13px; font-weight: bold; line-height: 25px; - color: #fff; + color: #eee; } .dashboard-activity-metadata-play_state-icon { flex-basis: 25px; @@ -1155,9 +1185,8 @@ a .dashboard-activity-metadata-user-thumb:hover { float: left; position: relative; height: 160px; - min-width: 350px; max-width: 500px; - margin-right: 25px; + margin-left: 25px; margin-bottom: 25px; } .dashboard-stats-container { @@ -1252,7 +1281,7 @@ a .dashboard-activity-metadata-user-thumb:hover { -webkit-backface-visibility: hidden; backface-visibility: hidden; z-index: 1; - -webkit-border-radius: 50%; + -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 350%; overflow: hidden; @@ -1443,16 +1472,14 @@ a:hover .dashboard-stats-square { -moz-box-shadow: inset 0 0 0 2px #e9a049; box-shadow: inset 0 0 0 2px #e9a049; } -#dashboard-no-recently-added { - margin-bottom: 20px; -} .dashboard-recent-media-row { width: 100%; margin: 0 auto; text-align: center; position: relative; z-index: 0; - overflow: hidden; + overflow: auto; + scrollbar-width: none; } .dashboard-recent-media { width: 100%; @@ -1534,7 +1561,7 @@ a:hover .dashboard-recent-media-cover { } .dashboard-recent-media-metacontainer h3 { padding: 5px 3px 0 3px; - color: #fff; + color: #eee; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -1647,12 +1674,12 @@ a:hover .dashboard-recent-media-cover { color: #f9be03; } .summary-content-title h1 a:hover { - color: #fff; + color: #eee; } .summary-content-title h2 { margin-top: 0; margin-bottom: 10px; - color: #fff; + color: #eee; font-size: 28px; line-height: 40px; float: left; @@ -1749,6 +1776,7 @@ a:hover .dashboard-recent-media-cover { box-shadow: inset 0 0 0 2px #e9a049; opacity: 0; transition: opacity .2s; + z-index: 2; } .summary-poster-face-overlay span { display: block; @@ -1806,7 +1834,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { line-height: 24px; } .summary-content-details-tag strong { - color: #fff; + color: #eee; margin-left: 2px; margin-right: 10px; } @@ -1824,15 +1852,32 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { max-height: 15px; margin: 0 5px; } -.summary-content-summary { +.summary-content-text { overflow: hidden; - color: #fff; + color: #eee; float: left; position: relative; clear: both; - height: auto; - max-height: 160px; - padding-bottom: 0px; + padding-bottom: 0; +} +.summary-content-tagline { + font-weight: bold; +} +.summary-content-summary { + height: 60px; +} +.summary-content-summary p { + margin-bottom: 0; +} +.summary-toggle { + display: none; + margin-top: 10px; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; +} +.summary-toggle a { + color: #999; } .summary-content-people-wrapper { margin-right: 20px; @@ -1860,7 +1905,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { display: block; font-size: 12px; line-height: 18px; - color: #fff; + color: #eee; } .summary-content-genres { margin-top: 13px; @@ -1879,7 +1924,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { display: block; font-size: 12px; line-height: 18px; - color: #fff; + color: #eee; } .summary-content-writers { margin-top: 13px; @@ -1898,7 +1943,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { display: block; font-size: 12px; line-height: 18px; - color: #fff; + color: #eee; } .star-rating { display: inline-block; @@ -1920,7 +1965,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { color: #999; } .critic-rating { - display: inline-block; + display: flex; font-size: 14px; overflow: hidden; white-space: nowrap; @@ -1951,7 +1996,7 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { position: relative; margin: 0; line-height: 22px; - color: #fff; + color: #eee; font-size: 16px; text-align: center; text-transform: uppercase; @@ -1962,7 +2007,10 @@ a:hover .summary-poster-face-track .summary-poster-face-overlay span { .item-children-instance { list-style: none; margin: 0; - overflow: hidden; + overflow: auto; +} +.item-children-instance.max-height { + max-height: 700px; } .item-children-instance li { float: left; @@ -2047,7 +2095,7 @@ a:hover .item-children-poster { .item-children-instance-text-wrapper h3 { width: 100%; padding: 5px 3px 0 3px; - color: #fff; + color: #eee; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -2098,7 +2146,7 @@ a:hover .item-children-poster { } .item-children-list-item-title { display: inline-block; - width: calc(100% - 110px); + width: calc(100% - 125px); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; @@ -2108,11 +2156,19 @@ a:hover .item-children-poster { color: #777; text-align: right; display: inline-block; - width: 40px; + width: 60px; margin-right: 20px; } +.nav-list { + float: left; + list-style: none; + padding: 0; +} +.nav-list.nav-pills > li > a { + margin-bottom: 0; +} #new_title h3 { - color: #f9be03; + color: #E5A00D; font-size: 14px; line-height: 1.42857143; font-weight: bold; @@ -2148,15 +2204,28 @@ span.settings-warning { padding-left: 10px; } #menu_link_show_advanced_settings.active { - color: #fff; - background-color: #cc7b19; + color: #eee; + background-color: #cc7b19; +} +#configUpdate .form-group, +#configUpdate .checkbox{ + padding-left: 10px; + margin-left: -10px; +} +.hidden-settings { + overflow: hidden; + padding-left: 10px; + margin-left: -10px; +} +#newsletter_agent_options.hidden-settings { + padding-left: 15px; + margin-left: 0; } .advanced-setting { display: none; } div.advanced-setting { border-left: 1px solid #cc7b19; - padding-left: 10px; } li.advanced-setting { border-left: 1px solid #cc7b19; @@ -2183,33 +2252,18 @@ li.advanced-setting { } .user-info-username { font-size: 24px; - color: #fff; - padding-top: 27px; + color: #eee; + padding-top: 15px; padding-left: 105px; } .user-info-nav { margin-top: 15px; -} -.user-info-nav > .active > a { - color: #cc7b19; + padding-left: 105px; } .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus { color: #e9a049; } -.user-info-nav a:hover { - color: #e9a049; - text-decoration: none; -} -.user-info-nav ul { - list-style: none; - padding: 0; -} -.user-info-nav li { - float: left; - margin-left: 10px; - margin-right: 10px; -} .user-overview-stats-wrapper { } .user-overview-stats-wrapper ul { @@ -2249,7 +2303,7 @@ li.advanced-setting { left: 0px; } .user-overview-stats-instance h3 strong{ - color: #fff; + color: #eee; } .user-overview-stats-instance h3 { font-size: 30px; @@ -2262,7 +2316,7 @@ li.advanced-setting { float: left; } .user-overview-stats-instance h4 { - color: #fff; + color: #eee; margin-bottom: 25px; } .user-overview-stats-instance h1 { @@ -2302,7 +2356,7 @@ li.advanced-setting { .user-player-instance-name { float: left; padding-top: 14px; - color: #fff; + color: #eee; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -2361,9 +2415,6 @@ a .library-user-instance-box:hover { -moz-box-shadow: inset 0 0 0 2px #e9a049; box-shadow: inset 0 0 0 2px #e9a049; } -#watched-stats-days-selection label { - margin-bottom: 0; -} .home-padded-header { margin: 25px 0; height: 34px; @@ -2441,7 +2492,7 @@ a .library-user-instance-box:hover { overflow: hidden; } .home-platforms-instance-name { - color: #fff; + color: #eee; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -2628,7 +2679,7 @@ a .library-user-instance-box:hover { } .home-platforms-instance-list-name { float: left; - color: #fff; + color: #eee; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -2804,6 +2855,34 @@ a .home-platforms-list-cover-face:hover overflow: hidden; max-width: 350px; } +.circle { + width: 1.55rem; + height: 1.55rem; + border-radius: 50%; + border: 0.2rem solid #eeeeee; +} +.circle-quarter { + background-image: + linear-gradient(00deg, #2b2b2b 50%, transparent 50%), + linear-gradient(270deg, #eeeeee 50%, transparent 50%); +} +.circle-half { + background-image: + linear-gradient(90deg, #2b2b2b 50%, transparent 50%), + linear-gradient(-90deg, #eeeeee 50%, transparent 50%); + } +.circle-three-quarter { + background-image: + linear-gradient(180deg, transparent 50%, #eeeeee 50%), + linear-gradient(-90deg, #eeeeee 50%, transparent 50%); +} +.circle-full { + background: #eeeeee; +} +#graph-tabs { + padding-bottom: 10px; + float: none; +} .graphs-instance { height: 330px; padding: 20px; @@ -2860,7 +2939,7 @@ a .home-platforms-list-cover-face:hover margin-bottom: -20px; width: 100%; max-width: 1750px; - overflow: hidden; + display: flow-root; } .table-card-back td { font-size: 12px; @@ -2930,14 +3009,15 @@ a .home-platforms-list-cover-face:hover max-width: 900px; } .stacked-configs > li > span { - display: block; + display: inline-block; + width: inherit; padding: 8px 20px 8px 15px; color: #eee; border-left: 2px solid #444; border-top: 1px solid #2d2d2d; -webkit-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; } .stacked-configs > li > span:hover, .stacked-configs > li > span:focus { @@ -3043,7 +3123,7 @@ a .home-platforms-list-cover-face:hover } .submenu a:hover { background: #f9be03; - color: #FFF; + color: #eee; } .ajaxMsg { background-color: rgba(255,255,255,0.075); @@ -3102,21 +3182,21 @@ div.dataTables_info { white-space: normal !important; } .tooltip.top .tooltip-arrow { - border-top-color: #fff; + border-top-color: #eee; } .tooltip.right .tooltip-arrow { - border-right-color: #fff; + border-right-color: #eee; } .tooltip.bottom .tooltip-arrow { - border-bottom-color: #fff; + border-bottom-color: #eee; } .tooltip.left .tooltip-arrow { - border-left-color: #fff; + border-left-color: #eee; } .tooltip-inner { max-width: 250px; color: #000; - background: #fff; + background: #eee; border: 0; font-weight: bold; border-radius: 2px; @@ -3136,6 +3216,10 @@ div.dataTables_info { bottom: 0; text-shadow: 0 0 2px rgba(0,0,0,.5); } +.sign-out-tooltip:hover { + color: #E5A00D; + cursor: pointer; +} .history-thumbnail-popover { z-index: 2000; padding: 0; @@ -3208,7 +3292,7 @@ div.dataTables_info { } .edit-user-toggles > input[type='checkbox']:checked + label, .edit-library-toggles > input[type='checkbox']:checked + label { - color: #fff; + color: #eee; cursor: pointer; } .edit-user-name > input[type='text'] { @@ -3227,7 +3311,7 @@ div.dataTables_info { #libraries-to-purge > li { color: #e9a049; } -#updatebar { +#updatebar, #token_error_bar { background-color: #444; opacity: 0.95; color: #999999; @@ -3242,32 +3326,35 @@ div.dataTables_info { z-index: 9999; display: block; } -#updatebar .msg { +#updatebar .msg, #token_error_bar .msg { line-height: normal; padding-left: 20px; } -#updatebar .loader { +#updatebar .loader, #token_error_bar .loader { position: relative; top: 2px; } -#updatebar.success { +#updatebar.success, #token_error_bar.success { padding: 15px 10px; text-align: left; } -#updatebar.error { +#updatebar.error, #token_error_bar.error { padding: 15px 10px; text-align: left; } -#updatebar .ui-icon { +#updatebar .ui-icon, #token_error_bar .ui-icon { display: inline-block; margin-left: -20px; top: 2px; position: relative; margin-right: 3px; } -#updatebar a:hover { +#updatebar a:hover, #token_error_bar a:hover { color: #e9a049; } +#token_error_bar { + background-color: rgba(255,0,0,0.5) !important; +} .body-container { position: absolute; top: 50px; @@ -3296,23 +3383,36 @@ pre::-webkit-scrollbar-track { pre::-webkit-scrollbar-thumb { background-color: rgba(0,0,0,.15); } +#currentActivity, +#home-stats, +#library-stats { + margin-left: -25px; +} +#currentActivity > *, +#home-stats > *, +#library-stats > * { + margin-left: 25px; +} @media only screen - and (min-device-width: 300px) - and (max-device-width: 450px) { + and (min-width: 300px) + and (max-width: 450px) { .home-platforms-instance { width: calc(100% - 20px); } - .dashboard-activity-instance { - width: 100%; - } + .dashboard-activity-instance, .dashboard-stats-instance { width: 100%; } + #currentActivity, + #home-stats, + #library-stats { + margin-right: 25px; + } } @media only screen - and (min-device-width: 300px) - and (max-device-width: 740px) { + and (min-width: 300px) + and (max-width: 740px) { .header-bar { display: block; float: none !important; @@ -3320,29 +3420,45 @@ pre::-webkit-scrollbar-thumb { .button-bar { float: left !important; clear: both; - margin-top: 15px; + margin-top: 5px; } .button-bar > div, .button-bar > button, .button-bar > span { float: left !important; clear: both !important; - margin-bottom: 10px; + margin-top: 10px; } .button-bar > div > button.btn { float: left !important; clear: both !important; } .home-padded-header .button-bar { - margin-top: 10px; + margin-top: 0; margin-bottom: 15px; } } @media only screen - and (min-device-width: 740px) - and (max-device-width: 1024px) { + and (min-width: 740px) + and (max-width: 1280px) { + .header-bar { + display: block; + float: none !important; + } .button-bar { - float: right !important; + float: left !important; + clear: both; + margin-top: 5px; + } + .button-bar .btn-group, + .button-bar > button.btn { + margin-right: 3px; + } + .button-bar > div, + .button-bar > button, + .button-bar > span { + float: left !important; + margin-top: 10px; } .button-bar > div > button.btn { float: left !important; @@ -3350,6 +3466,8 @@ pre::-webkit-scrollbar-thumb { } .home-padded-header .button-bar { float: left !important; + margin-top: 0; + margin-bottom: 15px; } } #search_form { @@ -3385,6 +3503,22 @@ pre::-webkit-scrollbar-thumb { -o-transition: background 0.3s; transition: background 0.3s; } +@media (max-width: 767px) { + #search_form { + width: 100%; + } + #search_form span.input-textbox { + width: 100%; + } + #search_form #query { + width: 100%; + right: 0; + } + #search_form #query.active { + width: 100%; + right: 0px; + } +} #update_search_form div.input-group { display: inline-table; vertical-align: middle; @@ -3454,10 +3588,6 @@ pre::-webkit-scrollbar-thumb { .activity-queue tr:nth-child(even) td { background-color: rgba(255,255,255,0.010); } -#days-selection label, -#months-selection label { - margin-bottom: 0; -} .card-sortable { height: 36px; padding: 0 20px 0 0; @@ -3491,6 +3621,9 @@ pre::-webkit-scrollbar-thumb { .selectize-input input[type='text'] { height: 20px; } +.selectize-input.disabled, .selectize-input.disabled * { + cursor: not-allowed !important; +} .small-muted { font-size: small; color: #777; @@ -3512,13 +3645,13 @@ pre::-webkit-scrollbar-thumb { width: 225px; } .config-scheduler-table th { - color: #fff; + color: #eee; } a.no-highlight { color: #777; } a.no-highlight:hover { - color: #fff; + color: #eee; } .top-line { border-top: 1px dotted #777; @@ -3526,7 +3659,7 @@ a.no-highlight:hover { } .help-bold { font-weight: bold; - color: #fff; + color: #eee; } .save-button { margin-top: 15px; @@ -3594,10 +3727,6 @@ a.no-highlight:hover { .login-container .form-group { margin-bottom: 20px; } -.login-container .form-group label { - font-weight: 400; - color: #999; -} .login-container .form-control { height: 38px; line-height: 1.5em; @@ -3671,7 +3800,7 @@ a.no-highlight:hover { margin: 0 2px; padding: 2px 5px; font-size: 13px; - color: #fff; + color: #eee; background-color: #555; border: 0px solid #444; border-radius: 3px; @@ -3689,7 +3818,7 @@ a.no-highlight:hover { -webkit-transition: all .1s cubic-bezier(.4,0,1,1); -moz-transition: all .1s cubic-bezier(.4,0,1,1); -o-transition: all .1s cubic-bezier(.4,0,1,1); - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff; + text-shadow: -1px -1px 0 #eee, 1px -1px 0 #eee, -1px 1px 0 #eee, 1px 1px 0 #eee; } .overlay-refresh-image.left { left: 10px; @@ -3703,7 +3832,7 @@ a.no-highlight:hover { cursor: pointer; } .overlay-refresh-image.info-art:hover { - color: #fff; + color: #eee; text-shadow: none; } a:hover .overlay-refresh-image { @@ -3713,6 +3842,21 @@ a:hover .overlay-refresh-image { a:hover .overlay-refresh-image:hover { opacity: .9; } +.smart-collection-image, +.smart-playlist-image { + float: left; + position: absolute; + top: 5px; + left: 5px; + background-color: #8e6191; + border-radius: 4px; + color: #fff; + font-size: 16px; + z-index: 1; + width: 32px; + padding: 5px; + text-align: center; +} #ip_error, #isp_error { color: #aaa; display: none; @@ -3720,10 +3864,6 @@ a:hover .overlay-refresh-image:hover { padding-top: 10px; padding-bottom: 10px; } -#plexpy-log-levels label, -#plex-log-levels label { - margin-bottom: 0; -} #plexpy-notifiers-table .friendly_name, #notifier-config-modal span.notifier_id, #plexpy-newsletters-table .friendly_name, @@ -3758,7 +3898,7 @@ a:hover .overlay-refresh-image:hover { #newsletter-config-modal .nav-tabs > li.active > a, #newsletter-config-modal .nav-tabs > li.active > a:hover, #newsletter-config-modal .nav-tabs > li.active > a:focus { - color: #fff; + color: #eee; background: #222; } #notifier-config-modal .nav-tabs > li.active > a, @@ -3811,16 +3951,15 @@ a:hover .overlay-refresh-image:hover { #changelog-modal ul { padding-left: 20px; } -.google-play-badge { - display:inline-block; - height:45px; - margin-top: 10px; +.app-badge { + float: left; + display: inline-block; + height: 46px; + margin-right: 10px; + margin-bottom: 5px; } -.google-play-badge img { - border: 1px solid #3B3B3B; - border-radius: 6px; - box-sizing: border-box; - height: 45px; +.app-badge img { + height: 46px; vertical-align: middle; } @@ -3830,20 +3969,24 @@ a:hover .overlay-refresh-image:hover { background-repeat: no-repeat !important; background-position: center !important; } +.platform-alexa { + background-color: #00caff; + background-image: url(../images/platforms/alexa.svg); +} .platform-android { - background-color: #a4ca39; + background-color: #3ddc84; background-image: url(../images/platforms/android.svg); } .platform-atv { - background-color: #858487; + background-color: #a2aaad; background-image: url(../images/platforms/atv.svg); } .platform-chrome { - background-color: #ed5e50; + background-color: #db4437; background-image: url(../images/platforms/chrome.svg); } .platform-chromecast { - background-color: #10a4e8; + background-color: #4285f4; background-image: url(../images/platforms/chromecast.svg); } .platform-default { @@ -3851,11 +3994,11 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/platforms/default.svg); } .platform-dlna { - background-color: #0cb14b; + background-color: #4ba32f; background-image: url(../images/platforms/dlna.svg); } .platform-firefox { - background-color: #e67817; + background-color: #ff7139; background-image: url(../images/platforms/firefox.svg); } .platform-gtv { @@ -3863,27 +4006,27 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/platforms/gtv.svg); } .platform-ie { - background-color: #00599e; + background-color: #18bcef; background-image: url(../images/platforms/ie.svg); } .platform-ios { - background-color: #858487; + background-color: #a2aaad; background-image: url(../images/platforms/ios.svg); } .platform-kodi { - background-color: #31afe1; + background-color: #30aada; background-image: url(../images/platforms/kodi.svg); } .platform-lg { - background-color: #a50034; + background-color: #990033; background-image: url(../images/platforms/lg.svg); } .platform-linux { - background-color: #1793d0; + background-color: #0099cc; background-image: url(../images/platforms/linux.svg); } .platform-macos { - background-color: #858487; + background-color: #a2aaad; background-image: url(../images/platforms/macos.svg); } .platform-msedge { @@ -3891,11 +4034,11 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/platforms/msedge.svg); } .platform-opera { - background-color: #ff1b2d; + background-color: #fa1e4e; background-image: url(../images/platforms/opera.svg); } .platform-playstation { - background-color: #034da2; + background-color: #003087; background-image: url(../images/platforms/playstation.svg); } .platform-plex { @@ -3907,11 +4050,11 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/platforms/plexamp.svg); } .platform-roku { - background-color: #6d3c97; + background-color: #673293; background-image: url(../images/platforms/roku.svg); } .platform-safari { - background-color: #00a9ec; + background-color: #00d3f9; background-image: url(../images/platforms/safari.svg); } .platform-samsung { @@ -3931,7 +4074,7 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/platforms/wiiu.svg); } .platform-windows { - background-color: #2fc0f5; + background-color: #0078d7; background-image: url(../images/platforms/windows.svg); } .platform-wp { @@ -3946,56 +4089,59 @@ a:hover .overlay-refresh-image:hover { background-color: #107c10; background-image: url(../images/platforms/xbox.svg); } +.platform-alexa-rgba { + background-color: rgba(0, 202, 255, 0.40); +} .platform-android-rgba { - background-color: rgba(164, 202, 57, 0.40); + background-color: rgba(61, 220, 132, 0.40); } .platform-atv-rgba { - background-color: rgba(133, 132, 135, 0.40); + background-color: rgba(162, 170, 173, 0.40); } .platform-chrome-rgba { - background-color: rgba(237, 94, 80, 0.40); + background-color: rgba(219, 68, 55, 0.40); } .platform-chromecast-rgba { - background-color: rgba(16, 164, 232, 0.40); + background-color: rgba(66, 133, 244, 0.40); } .platform-default-rgba { background-color: rgba(229, 160, 13, 0.40); } .platform-dlna-rgba { - background-color: rgba(12, 177, 75, 0.40); + background-color: rgba(75, 163, 47, 0.40); } .platform-firefox-rgba { - background-color: rgba(230, 120, 23, 0.40); + background-color: rgba(255, 113, 57, 0.40); } .platform-gtv-rgba { background-color: rgba(0, 139, 207, 0.40); } .platform-ie-rgba { - background-color: rgba(0, 89, 158, 0.40); + background-color: rgba(24, 188, 239, 0.40); } .platform-ios-rgba { - background-color: rgba(133, 132, 135, 0.40); + background-color: rgba(162, 170, 173, 0.40); } .platform-kodi-rgba { - background-color: rgba(49, 175, 225, 0.40); + background-color: rgba(48, 170, 218, 0.40); } .platform-lg-rgba { - background-color: rgba(165, 0, 52, 0.40); + background-color: rgba(153, 0, 51, 0.40); } .platform-linux-rgba { - background-color: rgba(23, 147, 208, 0.40); + background-color: rgba(0, 153, 204, 0.40); } .platform-macos-rgba { - background-color: rgba(133, 132, 135, 0.40); + background-color: rgba(162, 170, 173, 0.40); } .platform-msedge-rgba { background-color: rgba(0, 120, 215, 0.40); } .platform-opera-rgba { - background-color: rgba(255, 27, 45, 0.40); + background-color: rgba(250, 30, 78, 0.40); } .platform-playstation-rgba { - background-color: rgba(3, 77, 162, 0.40); + background-color: rgba(0, 48, 135, 0.40); } .platform-plex-rgba { background-color: rgba(229, 160, 13, 0.40); @@ -4004,10 +4150,10 @@ a:hover .overlay-refresh-image:hover { background-color: rgba(229, 160, 13, 0.40); } .platform-roku-rgba { - background-color: rgba(109, 60, 151, 0.40); + background-color: rgba(103, 50, 147, 0.40); } .platform-safari-rgba { - background-color: rgba(0, 169, 236, 0.40); + background-color: rgba(0, 211, 249, 0.40); } .platform-samsung-rgba { background-color: rgba(3, 78, 162, 0.40); @@ -4022,7 +4168,7 @@ a:hover .overlay-refresh-image:hover { background-color: rgba(3, 169, 244, 0.40); } .platform-windows-rgba { - background-color: rgba(47, 192, 245, 0.40); + background-color: rgba(0, 120, 215, 0.40); } .platform-wp-rgba { background-color: rgba(104, 33, 122, 0.40); @@ -4055,31 +4201,48 @@ a:hover .overlay-refresh-image:hover { background-image: url(../images/icons/most-concurrent-streams.svg); } .rating-image { - width: 51px; height: 20px; margin-left: 10px; + margin-right: 5px; display: inline-block; background-origin: content-box !important; - background-size: contain !important; background-repeat: no-repeat !important; background-position: left !important; - text-align: right; } .rating-imdb { - width: 62px !important; + width: 36px; background-image: url(../images/rating/imdb.svg); + background-size: auto 20px; +} +.rating-themoviedb { + width: 38px; + background-image: url(../images/rating/themoviedb.svg); + background-size: auto 16px; +} +.rating-thetvdb { + width: 36px; + background-image: url(../images/rating/thetvdb.svg); + background-size: auto 36px; } .rating-rottentomatos-ripe { + width: 17px; background-image: url(../images/rating/tomato-ripe.svg); + background-size: auto 20px; } .rating-rottentomatos-rotten { + width: 17px; background-image: url(../images/rating/tomato-rotten.svg); + background-size: auto 20px; } .rating-rottentomatos-upright { + width: 16px; background-image: url(../images/rating/popcorn-upright.svg); + background-size: auto 20px; } .rating-rottentomatos-spilled { + width: 19px; background-image: url(../images/rating/popcorn-spilled.svg); + background-size: auto 20px; } .transparent { background-color: transparent !important; @@ -4112,7 +4275,7 @@ a:hover .overlay-refresh-image:hover { flex-shrink: 0; } #info-modal .stream-info-item .sub-value { - color: #fff; + color: #eee; font-weight: bold; margin-left: 10px; text-align: left; @@ -4135,7 +4298,7 @@ a:hover .overlay-refresh-image:hover { .stream-info th:first-child { width: 125px; height: 30px; - color: #fff; + color: #eee; font-size: 12px; text-align: right; text-transform: uppercase; @@ -4162,6 +4325,10 @@ a:hover .overlay-refresh-image:hover { .stream-info tr:nth-child(even) td { background-color: rgba(255,255,255,0.010); } +.stream-info td:nth-child(3), +.stream-info th:nth-child(3) { + width: 25px; +} .number-input { margin: 0 !important; width: 55px !important; @@ -4258,7 +4425,7 @@ a[data-tab-destination] { transform: translate(-50%, -50%); } .iframe-button { - color: #fff; + color: #eee; border-radius: 20px; text-align: center; cursor: pointer; @@ -4275,7 +4442,7 @@ a[data-tab-destination] { } .iframe-button:hover, .iframe-button:focus { - color: #fff; + color: #eee; box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 0px 99999px inset, rgba(0, 0, 0, 0.2) 0px 1px 5px 0px, rgba(0, 0, 0, 0.14) 0px 2px 2px 0px, rgba(0, 0, 0, 0.12) 0px 3px 1px -2px; } .iframe-button:active { @@ -4340,8 +4507,107 @@ a[data-tab-destination] { display: inline !important; background: none !important; padding: 0 !important; - color: #fff; + color: #eee; } .news-body a:hover { color: #f9be03; } + +a.donate-with-crypto, +a.donate-with-crypto > span { + background: none; + border: none; + border-radius: 0; + box-sizing: border-box; + clear: none; + clip: auto; + cursor: default; + display: block; + float: none; + height: auto; + margin: 0; + max-height: none; + min-height: none; + padding: 0; + opacity: 1; + text-shadow: none; + vertical-align: baseline; + visibility: visible; + width: auto; +} +a.donate-with-crypto { + user-select: none; + user-drag: none; + -webkit-user-drag: none; + text-decoration: none; + background: #1652f0 linear-gradient(#1652f0, #0655ab); + cursor: pointer; + transition: background 0.2s ease-in-out, padding 0.2s; + border-radius: 6px; + display: inline-block; + height: 40px; + padding: 9px 15px 11px 15px; + position: relative; + min-width: 160px; +} +a.donate-with-crypto:hover { + background: #1652f0; +} +a.donate-with-crypto > span { + color: white; + font: normal 500 14px/20px -apple-system, BlinkMacSystemFont, '.SFNSText-Regular', 'San Francisco', 'Roboto', 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', sans-serif; + letter-spacing: 0; + overflow: hidden; + text-align: center; + text-overflow: ellipsis; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.15); + white-space: nowrap; +} +a.donate-with-crypto::after { + border-radius: 6px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2); + content: ''; + display: block; + width: 100%; + height: 100%; + position: absolute; + opacity: 1; + top: 0; + left: 0; +} +#crypto-select { + width: 280px; + margin: 15px auto; +} +#crypto-qrcode { + width: 258px; + padding: 0; + margin: 15px auto; + line-height: 0; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + display: none; +} +#crypto-address { + margin: 15px auto; + text-align: center; + display: none; +} + +#api_qr_code { + width: 100%; + padding: 0; + margin: 0 0 10px; + line-height: 0; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} + +.docker-mount { + margin: 20px auto 0 auto; + position: relative; +} \ No newline at end of file diff --git a/data/interfaces/default/current_activity_instance.html b/data/interfaces/default/current_activity_instance.html index 9dddde5e..64d6f25e 100644 --- a/data/interfaces/default/current_activity_instance.html +++ b/data/interfaces/default/current_activity_instance.html @@ -62,7 +62,7 @@ DOCUMENTATION :: END % if session is not None: <% from collections import defaultdict - from plexpy.helpers import cast_to_int, page + from plexpy.helpers import cast_to_int, get_percent, page, short_season from plexpy.common import VIDEO_RESOLUTION_OVERRIDES, AUDIO_CODEC_OVERRIDES, EXTRA_TYPES import plexpy %> @@ -74,6 +74,8 @@ DOCUMENTATION :: END parent_href = page('info', data['parent_rating_key']) grandparent_href = page('info', data['grandparent_rating_key']) user_href = page('user', data['user_id']) if data['user_id'] else '#' + library_href = page('library', data['section_id']) if data['section_id'] else '#' + season = short_season(data['parent_title']) %>
    % elif data['media_type'] in ('photo', 'clip'): - % if data['extra_type']: -
    - % elif data['parent_thumb']: + % if data['parent_thumb']:
    % else:
    @@ -161,7 +161,8 @@ DOCUMENTATION :: END
  • Quality
    -
    +
    + % if data['media_type'] != 'photo' and data['quality_profile'] != 'Unknown': <% br = cast_to_int(data['stream_bitrate']) or '' @@ -175,6 +176,8 @@ DOCUMENTATION :: END % else: ${data['quality_profile']} % endif + +
  • % if data['optimized_version'] == 1: @@ -220,7 +223,7 @@ DOCUMENTATION :: END
    Container
    % if data['stream_container_decision'] == 'transcode': - Transcode (${data['container'].upper()} ${data['stream_container'].upper()}) + Converting (${data['container'].upper()} ${data['stream_container'].upper()}) % else: Direct Play (${data['stream_container'].upper()}) % endif @@ -232,11 +235,14 @@ DOCUMENTATION :: END
    % if data['media_type'] in ('movie', 'episode', 'clip') and data['stream_video_decision']: <% - if data['video_dynamic_range'] == 'HDR': + if data['video_dynamic_range'] != 'SDR': video_dynamic_range = ' ' + data['video_dynamic_range'] + else: + video_dynamic_range = '' + if data['stream_video_dynamic_range'] != 'SDR' or video_dynamic_range: stream_video_dynamic_range = ' ' + data['stream_video_dynamic_range'] else: - video_dynamic_range = stream_video_dynamic_range = '' + stream_video_dynamic_range = '' %> % if data['stream_video_decision'] == 'transcode': <% @@ -260,12 +266,15 @@ DOCUMENTATION :: END
    Audio
    % if data['stream_audio_decision']: + <% + audio_language = (data['audio_language'] or 'Unknown') + ' - ' if data['media_type'] != 'track' else '' + %> % if data['stream_audio_decision'] == 'transcode': - Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + Transcode (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) % elif data['stream_audio_decision'] == 'copy': - Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + Direct Stream (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) % else: - Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + Direct Play (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) % endif % endif
    @@ -280,13 +289,13 @@ DOCUMENTATION :: END subtitle_codec = 'None' if data['stream_subtitle_codec'] and data['stream_subtitle_transient'] else data['subtitle_codec'].upper() %> % if data['stream_subtitle_decision'] == 'transcode': - Transcode (${subtitle_codec} ${data['stream_subtitle_codec'].upper()}) + Transcode (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec} ${data['stream_subtitle_codec'].upper()}) % elif data['stream_subtitle_decision'] == 'copy': - Direct Stream (${subtitle_codec}) + Direct Stream (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec}) % elif data['stream_subtitle_decision'] == 'burn': - Burn (${subtitle_codec}) + Burn (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec}) % else: - Direct Play (${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()}) + Direct Play (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()}) % endif % else: None @@ -316,7 +325,8 @@ DOCUMENTATION :: END % if data['relayed']: % else: - + % endif \ No newline at end of file diff --git a/data/interfaces/default/edit_user.html b/data/interfaces/default/edit_user.html index ede4168e..ebb18867 100644 --- a/data/interfaces/default/edit_user.html +++ b/data/interfaces/default/edit_user.html @@ -134,13 +134,5 @@ DOCUMENTATION :: END var url = 'undelete_user'; confirmAjaxCall(url, msg, { user_id: '${data["user_id"]}' }, null, function () { location.reload(); }); }); - - $(document).ready(function() { - // Move #confirm-modal-purge to parent container - if (!($('#edit-user-modal').next().is('#confirm-modal-purge'))) { - $('#confirm-modal-purge').appendTo($('#edit-user-modal').parent()); - } - $('#edit-user-modal > #confirm-modal-purge').remove(); - }); % endif \ No newline at end of file diff --git a/data/interfaces/default/export_modal.html b/data/interfaces/default/export_modal.html new file mode 100644 index 00000000..390ee268 --- /dev/null +++ b/data/interfaces/default/export_modal.html @@ -0,0 +1,310 @@ +<%doc> +USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE + +For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/ + +Filename: export_modal.html +Version: 0.1 +Variable names: data [list] + +data :: Usable parameters + +== Global keys == + +DOCUMENTATION :: END + +<% + import plexpy + from plexpy import exporter + from plexpy.helpers import anon_url + export = exporter.Export() + thumb_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[0]]) + art_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[1]]) + logo_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[2]]) +%> + + + \ No newline at end of file diff --git a/data/interfaces/default/graphs.html b/data/interfaces/default/graphs.html index c74fa590..7201c35f 100644 --- a/data/interfaces/default/graphs.html +++ b/data/interfaces/default/graphs.html @@ -1,7 +1,8 @@ <%inherit file="base.html"/> <%def name="headIncludes()"> - + + @@ -14,17 +15,15 @@
    -
    @@ -40,17 +39,17 @@
    -
    -
    @@ -158,10 +190,13 @@ DOCUMENTATION :: END
    - % if data['media_type'] == 'movie' or data['live']: -