diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d7c23d635..5a830ca53 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ +github: encode custom: https://fund.django-rest-framework.org/topics/funding/ diff --git a/.github/ISSUE_TEMPLATE/1-issue.md b/.github/ISSUE_TEMPLATE/1-issue.md new file mode 100644 index 000000000..0da154953 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-issue.md @@ -0,0 +1,10 @@ +--- +name: Issue +about: Please only raise an issue if you've been advised to do so after discussion. Thanks! 🙏 +--- + +## Checklist + +- [ ] Raised initially as discussion #... +- [ ] This cannot be dealt with as a third party library. (We prefer new functionality to be [in the form of third party libraries](https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages) where possible.) +- [ ] I have reduced the issue to the simplest possible case. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..382fc521a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +blank_issues_enabled: false +contact_links: +- name: Discussions + url: https://github.com/encode/django-rest-framework/discussions + about: > + The "Discussions" forum is where you want to start. 💖 diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..f9ebbced4 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,22 @@ +# Documentation: https://github.com/probot/stale + +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 + +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 1 + +# Label to use when marking as stale +staleLabel: stale diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..b635573f2 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,52 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + +jobs: + tests: + name: Python ${{ matrix.python-version }} + runs-on: ubuntu-20.04 + + strategy: + matrix: + python-version: + - '3.6' + - '3.7' + - '3.8' + - '3.9' + - '3.10' + - '3.11' + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: 'requirements/*.txt' + + - name: Upgrade packaging tools + run: python -m pip install --upgrade pip setuptools virtualenv wheel + + - name: Install dependencies + run: python -m pip install --upgrade codecov tox tox-py + + - name: Run tox targets for ${{ matrix.python-version }} + run: tox --py current + + - name: Run extra tox targets + if: ${{ matrix.python-version == '3.9' }} + run: | + python setup.py bdist_wheel + rm -r djangorestframework.egg-info # see #6139 + tox -e base,dist,docs + tox -e dist --installpkg ./dist/djangorestframework-*.whl + + - name: Upload coverage + run: | + codecov -e TOXENV,DJANGO diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 000000000..9c29ed056 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,24 @@ +name: pre-commit + +on: + push: + branches: + - master + pull_request: + +jobs: + pre-commit: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + + - uses: pre-commit/action@v2.0.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 41768084c..641714d16 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ *.db *~ .* +*.py.bak + /site/ /htmlcov/ @@ -13,6 +15,6 @@ MANIFEST coverage.* +!.github !.gitignore -!.travis.yml -!.isort.cfg +!.pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..5a6e554b9 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.4.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-json + - id: check-merge-conflict + - id: check-symlinks + - id: check-toml +- repo: https://github.com/pycqa/isort + rev: 5.8.0 + hooks: + - id: isort +- repo: https://github.com/PyCQA/flake8 + rev: 3.9.0 + hooks: + - id: flake8 + additional_dependencies: + - flake8-tidy-imports diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2c2724bf6..000000000 --- a/.travis.yml +++ /dev/null @@ -1,53 +0,0 @@ -language: python -cache: pip -dist: bionic -matrix: - fast_finish: true - include: - - - { python: "3.5", env: DJANGO=2.2 } - - - { python: "3.6", env: DJANGO=2.2 } - - { python: "3.6", env: DJANGO=3.0 } - - { python: "3.6", env: DJANGO=3.1 } - - { python: "3.6", env: DJANGO=master } - - - { python: "3.7", env: DJANGO=2.2 } - - { python: "3.7", env: DJANGO=3.0 } - - { python: "3.7", env: DJANGO=3.1 } - - { python: "3.7", env: DJANGO=master } - - - { python: "3.8", env: DJANGO=3.0 } - - { python: "3.8", env: DJANGO=3.1 } - - { python: "3.8", env: DJANGO=master } - - - { python: "3.9-dev", env: DJANGO=3.1 } - - { python: "3.9-dev", env: DJANGO=master } - - - { python: "3.8", env: TOXENV=base } - - { python: "3.8", env: TOXENV=lint } - - { python: "3.8", env: TOXENV=docs } - - - python: "3.8" - env: TOXENV=dist - script: - - python setup.py bdist_wheel - - rm -r djangorestframework.egg-info # see #6139 - - tox --installpkg ./dist/djangorestframework-*.whl - - tox # test sdist - - allow_failures: - - env: DJANGO=master - -install: - - pip install tox tox-travis - -script: - - tox - -after_success: - - pip install codecov - - codecov -e TOXENV,DJANGO - -notifications: - email: false diff --git a/.tx/config b/.tx/config new file mode 100644 index 000000000..e151a7e6f --- /dev/null +++ b/.tx/config @@ -0,0 +1,9 @@ +[main] +host = https://www.transifex.com +lang_map = sr@latin:sr_Latn, zh-Hans:zh_Hans, zh-Hant:zh_Hant + +[django-rest-framework.djangopo] +file_filter = rest_framework/locale//LC_MESSAGES/django.po +source_file = rest_framework/locale/en_US/LC_MESSAGES/django.po +source_lang = en_US +type = PO diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2f1aad08f..d567d45a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,207 +1,7 @@ # Contributing to REST framework -> The world can only really be changed one piece at a time. The art is picking that piece. -> -> — [Tim Berners-Lee][cite] +At this point in it's lifespan we consider Django REST framework to be essentially feature-complete. We may accept pull requests that track the continued development of Django versions, but would prefer not to accept new features or code formatting changes. -There are many ways you can contribute to Django REST framework. We'd like it to be a community-led project, so please get involved and help shape the future of the project. +Apart from minor documentation changes, the [GitHub discussions page](https://github.com/encode/django-rest-framework/discussions) should generally be your starting point. Please only raise an issue or pull request if you've been recommended to do so after discussion. -## Community - -The most important thing you can do to help push the REST framework project forward is to be actively involved wherever possible. Code contributions are often overvalued as being the primary way to get involved in a project, we don't believe that needs to be the case. - -If you use REST framework, we'd love you to be vocal about your experiences with it - you might consider writing a blog post about using REST framework, or publishing a tutorial about building a project with a particular JavaScript framework. Experiences from beginners can be particularly helpful because you'll be in the best position to assess which bits of REST framework are more difficult to understand and work with. - -Other really great ways you can help move the community forward include helping to answer questions on the [discussion group][google-group], or setting up an [email alert on StackOverflow][so-filter] so that you get notified of any new questions with the `django-rest-framework` tag. - -When answering questions make sure to help future contributors find their way around by hyperlinking wherever possible to related threads and tickets, and include backlinks from those items if relevant. - -## Code of conduct - -Please keep the tone polite & professional. For some users a discussion on the REST framework mailing list or ticket tracker may be their first engagement with the open source community. First impressions count, so let's try to make everyone feel welcome. - -Be mindful in the language you choose. As an example, in an environment that is heavily male-dominated, posts that start 'Hey guys,' can come across as unintentionally exclusive. It's just as easy, and more inclusive to use gender neutral language in those situations. (e.g. 'Hey folks,') - -The [Django code of conduct][code-of-conduct] gives a fuller set of guidelines for participating in community forums. - -# Issues - -It's really helpful if you can make sure to address issues on the correct channel. Usage questions should be directed to the [discussion group][google-group]. Feature requests, bug reports and other issues should be raised on the GitHub [issue tracker][issues]. - -Some tips on good issue reporting: - -* When describing issues try to phrase your ticket in terms of the *behavior* you think needs changing rather than the *code* you think need changing. -* Search the issue list first for related items, and make sure you're running the latest version of REST framework before reporting an issue. -* If reporting a bug, then try to include a pull request with a failing test case. This will help us quickly identify if there is a valid issue, and make sure that it gets fixed more quickly if there is one. -* Feature requests will often be closed with a recommendation that they be implemented outside of the core REST framework library. Keeping new feature requests implemented as third party libraries allows us to keep down the maintenance overhead of REST framework, so that the focus can be on continued stability, bug fixes, and great documentation. -* Closing an issue doesn't necessarily mean the end of a discussion. If you believe your issue has been closed incorrectly, explain why and we'll consider if it needs to be reopened. - -## Triaging issues - -Getting involved in triaging incoming issues is a good way to start contributing. Every single ticket that comes into the ticket tracker needs to be reviewed in order to determine what the next steps should be. Anyone can help out with this, you just need to be willing to: - -* Read through the ticket - does it make sense, is it missing any context that would help explain it better? -* Is the ticket reported in the correct place, would it be better suited as a discussion on the discussion group? -* If the ticket is a bug report, can you reproduce it? Are you able to write a failing test case that demonstrates the issue and that can be submitted as a pull request? -* If the ticket is a feature request, do you agree with it, and could the feature request instead be implemented as a third party package? -* If a ticket hasn't had much activity and it addresses something you need, then comment on the ticket and try to find out what's needed to get it moving again. - -# Development - -To start developing on Django REST framework, clone the repo: - - git clone https://github.com/encode/django-rest-framework - -Changes should broadly follow the [PEP 8][pep-8] style conventions, and we recommend you set up your editor to automatically indicate non-conforming styles. - -## Testing - -To run the tests, clone the repository, and then: - - # Setup the virtual environment - python3 -m venv env - source env/bin/activate - pip install django - pip install -r requirements.txt - - # Run the tests - ./runtests.py - -### Test options - -Run using a more concise output style. - - ./runtests.py -q - -Run the tests using a more concise output style, no coverage, no flake8. - - ./runtests.py --fast - -Don't run the flake8 code linting. - - ./runtests.py --nolint - -Only run the flake8 code linting, don't run the tests. - - ./runtests.py --lintonly - -Run the tests for a given test case. - - ./runtests.py MyTestCase - -Run the tests for a given test method. - - ./runtests.py MyTestCase.test_this_method - -Shorter form to run the tests for a given test method. - - ./runtests.py test_this_method - -Note: The test case and test method matching is fuzzy and will sometimes run other tests that contain a partial string match to the given command line input. - -### Running against multiple environments - -You can also use the excellent [tox][tox] testing tool to run the tests against all supported versions of Python and Django. Install `tox` globally, and then simply run: - - tox - -## Pull requests - -It's a good idea to make pull requests early on. A pull request represents the start of a discussion, and doesn't necessarily need to be the final, finished submission. - -It's also always best to make a new branch before starting work on a pull request. This means that you'll be able to later switch back to working on another separate issue without interfering with an ongoing pull requests. - -It's also useful to remember that if you have an outstanding pull request then pushing new commits to your GitHub repo will also automatically update the pull requests. - -GitHub's documentation for working on pull requests is [available here][pull-requests]. - -Always run the tests before submitting pull requests, and ideally run `tox` in order to check that your modifications are compatible on all supported versions of Python and Django. - -Once you've made a pull request take a look at the Travis build status in the GitHub interface and make sure the tests are running as you'd expect. - -## Managing compatibility issues - -Sometimes, in order to ensure your code works on various different versions of Django, Python or third party libraries, you'll need to run slightly different code depending on the environment. Any code that branches in this way should be isolated into the `compat.py` module, and should provide a single common interface that the rest of the codebase can use. - -# Documentation - -The documentation for REST framework is built from the [Markdown][markdown] source files in [the docs directory][docs]. - -There are many great Markdown editors that make working with the documentation really easy. The [Mou editor for Mac][mou] is one such editor that comes highly recommended. - -## Building the documentation - -To build the documentation, install MkDocs with `pip install mkdocs` and then run the following command. - - mkdocs build - -This will build the documentation into the `site` directory. - -You can build the documentation and open a preview in a browser window by using the `serve` command. - - mkdocs serve - -## Language style - -Documentation should be in American English. The tone of the documentation is very important - try to stick to a simple, plain, objective and well-balanced style where possible. - -Some other tips: - -* Keep paragraphs reasonably short. -* Don't use abbreviations such as 'e.g.' but instead use the long form, such as 'For example'. - -## Markdown style - -There are a couple of conventions you should follow when working on the documentation. - -##### 1. Headers - -Headers should use the hash style. For example: - - ### Some important topic - -The underline style should not be used. **Don't do this:** - - Some important topic - ==================== - -##### 2. Links - -Links should always use the reference style, with the referenced hyperlinks kept at the end of the document. - - Here is a link to [some other thing][other-thing]. - - More text... - - [other-thing]: http://example.com/other/thing - -This style helps keep the documentation source consistent and readable. - -If you are hyperlinking to another REST framework document, you should use a relative link, and link to the `.md` suffix. For example: - - [authentication]: ../api-guide/authentication.md - -Linking in this style means you'll be able to click the hyperlink in your Markdown editor to open the referenced document. When the documentation is built, these links will be converted into regular links to HTML pages. - -##### 3. Notes - -If you want to draw attention to a note or warning, use a pair of enclosing lines, like so: - - --- - - **Note:** A useful documentation note. - - --- - - -[cite]: https://www.w3.org/People/Berners-Lee/FAQ.html -[code-of-conduct]: https://www.djangoproject.com/conduct/ -[google-group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework -[so-filter]: https://stackexchange.com/filters/66475/rest-framework -[issues]: https://github.com/encode/django-rest-framework/issues?state=open -[pep-8]: https://www.python.org/dev/peps/pep-0008/ -[pull-requests]: https://help.github.com/articles/using-pull-requests -[tox]: https://tox.readthedocs.io/en/latest/ -[markdown]: https://daringfireball.net/projects/markdown/basics -[docs]: https://github.com/encode/django-rest-framework/tree/master/docs -[mou]: http://mouapp.com/ +The [Contributing guide in the documentation](https://www.django-rest-framework.org/community/contributing/) gives some more information on our process and code of conduct. diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 566bf9543..000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,14 +0,0 @@ -## Checklist - -- [ ] I have verified that that issue exists against the `master` branch of Django REST framework. -- [ ] I have searched for similar issues in both open and closed tickets and cannot find a duplicate. -- [ ] This is not a usage question. (Those should be directed to the [discussion group](https://groups.google.com/forum/#!forum/django-rest-framework) instead.) -- [ ] This cannot be dealt with as a third party library. (We prefer new functionality to be [in the form of third party libraries](https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages) where possible.) -- [ ] I have reduced the issue to the simplest possible case. -- [ ] I have included a failing test as a pull request. (If you are unable to do so we can still accept the issue.) - -## Steps to reproduce - -## Expected behavior - -## Actual behavior diff --git a/MANIFEST.in b/MANIFEST.in index 262e3dc91..f7b975e6f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,7 @@ include README.md include LICENSE.md -recursive-include tests/* * -recursive-include rest_framework/static *.js *.css *.png *.ico *.eot *.svg *.ttf *.woff *.woff2 +recursive-include tests/ * +recursive-include rest_framework/static *.js *.css *.map *.png *.ico *.eot *.svg *.ttf *.woff *.woff2 recursive-include rest_framework/templates *.html schema.js recursive-include rest_framework/locale *.mo global-exclude __pycache__ diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 70673c6c1..e9230d5c9 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ -*Note*: Before submitting this pull request, please review our [contributing guidelines](https://github.com/encode/django-rest-framework/blob/master/CONTRIBUTING.md#pull-requests). +*Note*: Before submitting this pull request, please review our [contributing guidelines](https://www.django-rest-framework.org/community/contributing/#pull-requests). ## Description diff --git a/README.md b/README.md index 8af1466f8..e8375291d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # [Django REST framework][docs] -[![build-status-image]][travis] +[![build-status-image]][build-status] [![coverage-status-image]][codecov] [![pypi-version]][pypi] @@ -21,12 +21,14 @@ The initial aim is to provide a single full-time position on REST framework. [![][sentry-img]][sentry-url] [![][stream-img]][stream-url] -[![][rollbar-img]][rollbar-url] -[![][esg-img]][esg-url] +[![][spacinov-img]][spacinov-url] [![][retool-img]][retool-url] [![][bitio-img]][bitio-url] +[![][posthog-img]][posthog-url] +[![][cryptapi-img]][cryptapi-url] +[![][fezto-img]][fezto-url] -Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Rollbar][rollbar-url], [ESG][esg-url], [Retool][retool-url], and [bit.io][bitio-url]. +Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], and [FEZTO][fezto-url]. --- @@ -52,8 +54,8 @@ There is a live example API for testing purposes, [available here][sandbox]. # Requirements -* Python (3.5, 3.6, 3.7, 3.8, 3.9) -* Django (2.2, 3.0, 3.1) +* Python 3.6+ +* Django 4.1, 4.0, 3.2, 3.1, 3.0 We **highly recommend** and only officially support the latest patch release of each Python and Django series. @@ -65,11 +67,12 @@ Install using `pip`... pip install djangorestframework Add `'rest_framework'` to your `INSTALLED_APPS` setting. - - INSTALLED_APPS = [ - ... - 'rest_framework', - ] +```python +INSTALLED_APPS = [ + ... + 'rest_framework', +] +``` # Example @@ -87,9 +90,10 @@ Startup up a new project like so... Now edit the `example/urls.py` module in your project: ```python -from django.urls import path, include from django.contrib.auth.models import User -from rest_framework import serializers, viewsets, routers +from django.urls import include, path +from rest_framework import routers, serializers, viewsets + # Serializers define the API representation. class UserSerializer(serializers.HyperlinkedModelSerializer): @@ -108,12 +112,11 @@ class UserViewSet(viewsets.ModelViewSet): router = routers.DefaultRouter() router.register(r'users', UserViewSet) - # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ path('', include(router.urls)), - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), ] ``` @@ -131,7 +134,7 @@ REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', ] } ``` @@ -168,7 +171,7 @@ Or to create a new user: Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. -For questions and support, use the [REST framework discussion group][group], or `#restframework` on freenode IRC. +For questions and support, use the [REST framework discussion group][group], or `#restframework` on libera.chat IRC. You may also want to [follow the author on Twitter][twitter]. @@ -176,13 +179,13 @@ You may also want to [follow the author on Twitter][twitter]. Please see the [security policy][security-policy]. -[build-status-image]: https://secure.travis-ci.org/encode/django-rest-framework.svg?branch=master -[travis]: https://travis-ci.org/encode/django-rest-framework?branch=master +[build-status-image]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml/badge.svg +[build-status]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml [coverage-status-image]: https://img.shields.io/codecov/c/github/encode/django-rest-framework/master.svg [codecov]: https://codecov.io/github/encode/django-rest-framework?branch=master [pypi-version]: https://img.shields.io/pypi/v/djangorestframework.svg [pypi]: https://pypi.org/project/djangorestframework/ -[twitter]: https://twitter.com/_tomchristie +[twitter]: https://twitter.com/starletdreaming [group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework [sandbox]: https://restframework.herokuapp.com/ @@ -191,17 +194,21 @@ Please see the [security policy][security-policy]. [sentry-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/sentry-readme.png [stream-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/stream-readme.png -[rollbar-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/rollbar-readme.png -[esg-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/esg-readme.png +[spacinov-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/spacinov-readme.png [retool-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/retool-readme.png [bitio-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/bitio-readme.png +[posthog-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/posthog-readme.png +[cryptapi-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cryptapi-readme.png +[fezto-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/fezto-readme.png [sentry-url]: https://getsentry.com/welcome/ -[stream-url]: https://getstream.io/try-the-api/?utm_source=drf&utm_medium=banner&utm_campaign=drf -[rollbar-url]: https://rollbar.com/?utm_source=django&utm_medium=sponsorship&utm_campaign=freetrial -[esg-url]: https://software.esg-usa.com/ +[stream-url]: https://getstream.io/?utm_source=DjangoRESTFramework&utm_medium=Webpage_Logo_Ad&utm_content=Developer&utm_campaign=DjangoRESTFramework_Jan2022_HomePage +[spacinov-url]: https://www.spacinov.com/ [retool-url]: https://retool.com/?utm_source=djangorest&utm_medium=sponsorship [bitio-url]: https://bit.io/jobs?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship +[posthog-url]: https://posthog.com?utm_source=drf&utm_medium=sponsorship&utm_campaign=open-source-sponsorship +[cryptapi-url]: https://cryptapi.io +[fezto-url]: https://www.fezto.xyz/?utm_source=DjangoRESTFramework [oauth1-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth [oauth2-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit diff --git a/SECURITY.md b/SECURITY.md index d3faefa3c..a92a1b0cf 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,8 +2,8 @@ ## Reporting a Vulnerability -If you believe you've found something in Django REST framework which has security implications, please **do not raise the issue in a public forum**. +Security issues are handled under the supervision of the [Django security team](https://www.djangoproject.com/foundation/teams/#security-team). -Send a description of the issue via email to [rest-framework-security@googlegroups.com][security-mail]. The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure. + **Please report security issues by emailing security@djangoproject.com**. -[security-mail]: mailto:rest-framework-security@googlegroups.com + The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure. diff --git a/docs/api-guide/authentication.md b/docs/api-guide/authentication.md index 5878040a4..2eb3a2921 100644 --- a/docs/api-guide/authentication.md +++ b/docs/api-guide/authentication.md @@ -11,9 +11,9 @@ source: Authentication is the mechanism of associating an incoming request with a set of identifying credentials, such as the user the request came from, or the token that it was signed with. The [permission] and [throttling] policies can then use those credentials to determine if the request should be permitted. -REST framework provides a number of authentication schemes out of the box, and also allows you to implement custom schemes. +REST framework provides several authentication schemes out of the box, and also allows you to implement custom schemes. -Authentication is always run at the very start of the view, before the permission and throttling checks occur, and before any other code is allowed to proceed. +Authentication always runs at the very start of the view, before the permission and throttling checks occur, and before any other code is allowed to proceed. The `request.user` property will typically be set to an instance of the `contrib.auth` package's `User` class. @@ -23,7 +23,7 @@ The `request.auth` property is used for any additional authentication informatio **Note:** Don't forget that **authentication by itself won't allow or disallow an incoming request**, it simply identifies the credentials that the request was made with. -For information on how to setup the permission polices for your API please see the [permissions documentation][permission]. +For information on how to set up the permission policies for your API please see the [permissions documentation][permission]. --- @@ -60,8 +60,8 @@ using the `APIView` class-based views. def get(self, request, format=None): content = { - 'user': unicode(request.user), # `django.contrib.auth.User` instance. - 'auth': unicode(request.auth), # None + 'user': str(request.user), # `django.contrib.auth.User` instance. + 'auth': str(request.auth), # None } return Response(content) @@ -72,8 +72,8 @@ Or, if you're using the `@api_view` decorator with function based views. @permission_classes([IsAuthenticated]) def example_view(request, format=None): content = { - 'user': unicode(request.user), # `django.contrib.auth.User` instance. - 'auth': unicode(request.auth), # None + 'user': str(request.user), # `django.contrib.auth.User` instance. + 'auth': str(request.auth), # None } return Response(content) @@ -120,6 +120,14 @@ Unauthenticated responses that are denied permission will result in an `HTTP 401 ## TokenAuthentication +--- + +**Note:** The token authentication provided by Django REST framework is a fairly simple implementation. + +For an implementation which allows more than one token per user, has some tighter security implementation details, and supports token expiry, please see the [Django REST Knox][django-rest-knox] third party package. + +--- + This authentication scheme uses a simple token-based HTTP Authentication scheme. Token authentication is appropriate for client-server setups, such as native desktop and mobile clients. To use the `TokenAuthentication` scheme you'll need to [configure the authentication classes](#setting-the-authentication-scheme) to include `TokenAuthentication`, and additionally include `rest_framework.authtoken` in your `INSTALLED_APPS` setting: @@ -129,11 +137,9 @@ To use the `TokenAuthentication` scheme you'll need to [configure the authentica 'rest_framework.authtoken' ] ---- +Make sure to run `manage.py migrate` after changing your settings. -**Note:** Make sure to run `manage.py migrate` after changing your settings. The `rest_framework.authtoken` app provides Django database migrations. - ---- +The `rest_framework.authtoken` app provides Django database migrations. You'll also need to create tokens for your users. @@ -146,7 +152,7 @@ For clients to authenticate, the token key should be included in the `Authorizat Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b -**Note:** If you want to use a different keyword in the header, such as `Bearer`, simply subclass `TokenAuthentication` and set the `keyword` class variable. +*If you want to use a different keyword in the header, such as `Bearer`, simply subclass `TokenAuthentication` and set the `keyword` class variable.* If successfully authenticated, `TokenAuthentication` provides the following credentials. @@ -167,9 +173,9 @@ The `curl` command line tool may be useful for testing token authenticated APIs. --- -#### Generating Tokens +### Generating Tokens -##### By using signals +#### By using signals If you want every user to have an automatically generated Token, you can simply catch the User's `post_save` signal. @@ -193,7 +199,7 @@ If you've already created some users, you can generate tokens for all existing u for user in User.objects.all(): Token.objects.get_or_create(user=user) -##### By exposing an api endpoint +#### By exposing an api endpoint When using `TokenAuthentication`, you may want to provide a mechanism for clients to obtain a token given the username and password. REST framework provides a built-in view to provide this behavior. To use it, add the `obtain_auth_token` view to your URLconf: @@ -210,7 +216,7 @@ The `obtain_auth_token` view will return a JSON response when valid `username` a Note that the default `obtain_auth_token` view explicitly uses JSON requests and responses, rather than using default renderer and parser classes in your settings. -By default there are no permissions or throttling applied to the `obtain_auth_token` view. If you do wish to apply throttling you'll need to override the view class, +By default, there are no permissions or throttling applied to the `obtain_auth_token` view. If you do wish to apply throttling you'll need to override the view class, and include them using the `throttle_classes` attribute. If you need a customized version of the `obtain_auth_token` view, you can do so by subclassing the `ObtainAuthToken` view class, and using that in your url conf instead. @@ -242,9 +248,9 @@ And in your `urls.py`: ] -##### With Django admin +#### With Django admin -It is also possible to create Tokens manually through admin interface. In case you are using a large user base, we recommend that you monkey patch the `TokenAdmin` class to customize it to your needs, more specifically by declaring the `user` field as `raw_field`. +It is also possible to create Tokens manually through the admin interface. In case you are using a large user base, we recommend that you monkey patch the `TokenAdmin` class to customize it to your needs, more specifically by declaring the `user` field as `raw_field`. `your_app/admin.py`: @@ -279,11 +285,11 @@ If successfully authenticated, `SessionAuthentication` provides the following cr Unauthenticated responses that are denied permission will result in an `HTTP 403 Forbidden` response. -If you're using an AJAX style API with SessionAuthentication, you'll need to make sure you include a valid CSRF token for any "unsafe" HTTP method calls, such as `PUT`, `PATCH`, `POST` or `DELETE` requests. See the [Django CSRF documentation][csrf-ajax] for more details. +If you're using an AJAX-style API with SessionAuthentication, you'll need to make sure you include a valid CSRF token for any "unsafe" HTTP method calls, such as `PUT`, `PATCH`, `POST` or `DELETE` requests. See the [Django CSRF documentation][csrf-ajax] for more details. **Warning**: Always use Django's standard login view when creating login pages. This will ensure your login views are properly protected. -CSRF validation in REST framework works slightly differently to standard Django due to the need to support both session and non-session based authentication to the same views. This means that only authenticated requests require CSRF tokens, and anonymous requests may be sent without CSRF tokens. This behaviour is not suitable for login views, which should always have CSRF validation applied. +CSRF validation in REST framework works slightly differently from standard Django due to the need to support both session and non-session based authentication to the same views. This means that only authenticated requests require CSRF tokens, and anonymous requests may be sent without CSRF tokens. This behavior is not suitable for login views, which should always have CSRF validation applied. ## RemoteUserAuthentication @@ -293,7 +299,7 @@ environment variable. To use it, you must have `django.contrib.auth.backends.RemoteUserBackend` (or a subclass) in your `AUTHENTICATION_BACKENDS` setting. By default, `RemoteUserBackend` creates `User` objects for usernames that don't -already exist. To change this and other behaviour, consult the +already exist. To change this and other behavior, consult the [Django documentation](https://docs.djangoproject.com/en/stable/howto/auth-remote-user/). If successfully authenticated, `RemoteUserAuthentication` provides the following credentials: @@ -301,7 +307,7 @@ If successfully authenticated, `RemoteUserAuthentication` provides the following * `request.user` will be a Django `User` instance. * `request.auth` will be `None`. -Consult your web server's documentation for information about configuring an authentication method, e.g.: +Consult your web server's documentation for information about configuring an authentication method, for example: * [Apache Authentication How-To](https://httpd.apache.org/docs/2.4/howto/auth.html) * [NGINX (Restricting Access)](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/) @@ -316,7 +322,7 @@ In some circumstances instead of returning `None`, you may want to raise an `Aut Typically the approach you should take is: * If authentication is not attempted, return `None`. Any other authentication schemes also in use will still be checked. -* If authentication is attempted but fails, raise a `AuthenticationFailed` exception. An error response will be returned immediately, regardless of any permissions checks, and without checking any other authentication schemes. +* If authentication is attempted but fails, raise an `AuthenticationFailed` exception. An error response will be returned immediately, regardless of any permissions checks, and without checking any other authentication schemes. You *may* also override the `.authenticate_header(self, request)` method. If implemented, it should return a string that will be used as the value of the `WWW-Authenticate` header in a `HTTP 401 Unauthorized` response. @@ -332,7 +338,7 @@ If the `.authenticate_header()` method is not overridden, the authentication sch The following example will authenticate any incoming request as the user given by the username in a custom request header named 'X-USERNAME'. - from django.contrib.auth.models import User + from django.contrib.auth.models import User from rest_framework import authentication from rest_framework import exceptions @@ -353,13 +359,17 @@ The following example will authenticate any incoming request as the user given b # Third party packages -The following third party packages are also available. +The following third-party packages are also available. + +## django-rest-knox + +[Django-rest-knox][django-rest-knox] library provides models and views to handle token-based authentication in a more secure and extensible way than the built-in TokenAuthentication scheme - with Single Page Applications and Mobile clients in mind. It provides per-client tokens, and views to generate them when provided some other authentication (usually basic authentication), to delete the token (providing a server enforced logout) and to delete all tokens (logs out all clients that a user is logged into). ## Django OAuth Toolkit -The [Django OAuth Toolkit][django-oauth-toolkit] package provides OAuth 2.0 support and works with Python 3.4+. The package is maintained by [Evonove][evonove] and uses the excellent [OAuthLib][oauthlib]. The package is well documented, and well supported and is currently our **recommended package for OAuth 2.0 support**. +The [Django OAuth Toolkit][django-oauth-toolkit] package provides OAuth 2.0 support and works with Python 3.4+. The package is maintained by [jazzband][jazzband] and uses the excellent [OAuthLib][oauthlib]. The package is well documented, and well supported and is currently our **recommended package for OAuth 2.0 support**. -#### Installation & configuration +### Installation & configuration Install using `pip`. @@ -384,9 +394,9 @@ For more details see the [Django REST framework - Getting started][django-oauth- The [Django REST framework OAuth][django-rest-framework-oauth] package provides both OAuth1 and OAuth2 support for REST framework. -This package was previously included directly in REST framework but is now supported and maintained as a third party package. +This package was previously included directly in the REST framework but is now supported and maintained as a third-party package. -#### Installation & configuration +### Installation & configuration Install the package using `pip`. @@ -408,7 +418,7 @@ HTTP Signature (currently a [IETF draft][http-signature-ietf-draft]) provides a ## Djoser -[Djoser][djoser] library provides a set of views to handle basic actions such as registration, login, logout, password reset and account activation. The package works with a custom user model and it uses token based authentication. This is a ready to use REST implementation of Django authentication system. +[Djoser][djoser] library provides a set of views to handle basic actions such as registration, login, logout, password reset and account activation. The package works with a custom user model and uses token-based authentication. This is a ready to use REST implementation of the Django authentication system. ## django-rest-auth / dj-rest-auth @@ -420,17 +430,23 @@ There are currently two forks of this project. * [Django-rest-auth][django-rest-auth] is the original project, [but is not currently receiving updates](https://github.com/Tivix/django-rest-auth/issues/568). * [Dj-rest-auth][dj-rest-auth] is a newer fork of the project. -## django-rest-framework-social-oauth2 +## drf-social-oauth2 -[Django-rest-framework-social-oauth2][django-rest-framework-social-oauth2] library provides an easy way to integrate social plugins (facebook, twitter, google, etc.) to your authentication system and an easy oauth2 setup. With this library, you will be able to authenticate users based on external tokens (e.g. facebook access token), convert these tokens to "in-house" oauth2 tokens and use and generate oauth2 tokens to authenticate your users. - -## django-rest-knox - -[Django-rest-knox][django-rest-knox] library provides models and views to handle token based authentication in a more secure and extensible way than the built-in TokenAuthentication scheme - with Single Page Applications and Mobile clients in mind. It provides per-client tokens, and views to generate them when provided some other authentication (usually basic authentication), to delete the token (providing a server enforced logout) and to delete all tokens (logs out all clients that a user is logged into). +[Drf-social-oauth2][drf-social-oauth2] is a framework that helps you authenticate with major social oauth2 vendors, such as Facebook, Google, Twitter, Orcid, etc. It generates tokens in a JWTed way with an easy setup. ## drfpasswordless -[drfpasswordless][drfpasswordless] adds (Medium, Square Cash inspired) passwordless support to Django REST Framework's own TokenAuthentication scheme. Users log in and sign up with a token sent to a contact point like an email address or a mobile number. +[drfpasswordless][drfpasswordless] adds (Medium, Square Cash inspired) passwordless support to Django REST Framework's TokenAuthentication scheme. Users log in and sign up with a token sent to a contact point like an email address or a mobile number. + +## django-rest-authemail + +[django-rest-authemail][django-rest-authemail] provides a RESTful API interface for user signup and authentication. Email addresses are used for authentication, rather than usernames. API endpoints are available for signup, signup email verification, login, logout, password reset, password reset verification, email change, email change verification, password change, and user detail. A fully functional example project and detailed instructions are included. + +## Django-Rest-Durin + +[Django-Rest-Durin][django-rest-durin] is built with the idea to have one library that does token auth for multiple Web/CLI/Mobile API clients via one interface but allows different token configuration for each API Client that consumes the API. It provides support for multiple tokens per user via custom models, views, permissions that work with Django-Rest-Framework. The token expiration time can be different per API client and is customizable via the Django Admin Interface. + +More information can be found in the [Documentation](https://django-rest-durin.readthedocs.io/en/latest/index.html). [cite]: https://jacobian.org/writing/rest-worst-practices/ [http401]: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2 @@ -448,7 +464,7 @@ There are currently two forks of this project. [djangorestframework-digestauth]: https://github.com/juanriaza/django-rest-framework-digestauth [oauth-1.0a]: https://oauth.net/core/1.0a/ [django-oauth-toolkit]: https://github.com/evonove/django-oauth-toolkit -[evonove]: https://github.com/evonove/ +[jazzband]: https://github.com/jazzband/ [oauthlib]: https://github.com/idan/oauthlib [djangorestframework-simplejwt]: https://github.com/davesque/django-rest-framework-simplejwt [etoccalino]: https://github.com/etoccalino/ @@ -463,6 +479,8 @@ There are currently two forks of this project. [djoser]: https://github.com/sunscrapers/djoser [django-rest-auth]: https://github.com/Tivix/django-rest-auth [dj-rest-auth]: https://github.com/jazzband/dj-rest-auth -[django-rest-framework-social-oauth2]: https://github.com/PhilipGarnero/django-rest-framework-social-oauth2 +[drf-social-oauth2]: https://github.com/wagnerdelima/drf-social-oauth2 [django-rest-knox]: https://github.com/James1345/django-rest-knox [drfpasswordless]: https://github.com/aaronn/django-rest-framework-passwordless +[django-rest-authemail]: https://github.com/celiao/django-rest-authemail +[django-rest-durin]: https://github.com/eshaan7/django-rest-durin diff --git a/docs/api-guide/caching.md b/docs/api-guide/caching.md index 96517b15e..ab4f82cd2 100644 --- a/docs/api-guide/caching.md +++ b/docs/api-guide/caching.md @@ -13,13 +13,13 @@ provided in Django. Django provides a [`method_decorator`][decorator] to use decorators with class based views. This can be used with -other cache decorators such as [`cache_page`][page] and -[`vary_on_cookie`][cookie]. +other cache decorators such as [`cache_page`][page], +[`vary_on_cookie`][cookie] and [`vary_on_headers`][headers]. ```python from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page -from django.views.decorators.vary import vary_on_cookie +from django.views.decorators.vary import vary_on_cookie, vary_on_headers from rest_framework.response import Response from rest_framework.views import APIView @@ -27,8 +27,7 @@ from rest_framework import viewsets class UserViewSet(viewsets.ViewSet): - - # Cache requested url for each user for 2 hours + # With cookie: cache requested url for each user for 2 hours @method_decorator(cache_page(60*60*2)) @method_decorator(vary_on_cookie) def list(self, request, format=None): @@ -38,8 +37,18 @@ class UserViewSet(viewsets.ViewSet): return Response(content) -class PostView(APIView): +class ProfileView(APIView): + # With auth: cache requested url for each user for 2 hours + @method_decorator(cache_page(60*60*2)) + @method_decorator(vary_on_headers("Authorization",)) + def get(self, request, format=None): + content = { + 'user_feed': request.user.get_user_feed() + } + return Response(content) + +class PostView(APIView): # Cache page for the requested url @method_decorator(cache_page(60*60*2)) def get(self, request, format=None): @@ -55,4 +64,5 @@ class PostView(APIView): [page]: https://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache [cookie]: https://docs.djangoproject.com/en/dev/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie +[headers]: https://docs.djangoproject.com/en/dev/topics/http/decorators/#django.views.decorators.vary.vary_on_headers [decorator]: https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-the-class diff --git a/docs/api-guide/content-negotiation.md b/docs/api-guide/content-negotiation.md index 3a4b0357f..81cff6a89 100644 --- a/docs/api-guide/content-negotiation.md +++ b/docs/api-guide/content-negotiation.md @@ -82,7 +82,7 @@ The default content negotiation class may be set globally, using the `DEFAULT_CO You can also set the content negotiation used for an individual view, or viewset, using the `APIView` class-based views. - from myapp.negotiation import IgnoreClientContentNegotiation + from myapp.negotiation import IgnoreClientContentNegotiation from rest_framework.response import Response from rest_framework.views import APIView diff --git a/docs/api-guide/exceptions.md b/docs/api-guide/exceptions.md index d7d73a2f2..347541d56 100644 --- a/docs/api-guide/exceptions.md +++ b/docs/api-guide/exceptions.md @@ -38,7 +38,7 @@ Might receive an error response indicating that the `DELETE` method is not allow Validation errors are handled slightly differently, and will include the field names as the keys in the response. If the validation error was not specific to a particular field then it will use the "non_field_errors" key, or whatever string value has been set for the `NON_FIELD_ERRORS_KEY` setting. -Any example validation error might look like this: +An example validation error might look like this: HTTP/1.1 400 Bad Request Content-Type: application/json @@ -222,7 +222,7 @@ By default this exception results in a response with the HTTP status code "429 T The `ValidationError` exception is slightly different from the other `APIException` classes: * The `detail` argument is mandatory, not optional. -* The `detail` argument may be a list or dictionary of error details, and may also be a nested data structure. +* The `detail` argument may be a list or dictionary of error details, and may also be a nested data structure. By using a dictionary, you can specify field-level errors while performing object-level validation in the `validate()` method of a serializer. For example. `raise serializers.ValidationError({'name': 'Please enter a valid name.'})` * By convention you should import the serializers module and use a fully qualified `ValidationError` style, in order to differentiate it from Django's built-in validation error. For example. `raise serializers.ValidationError('This field must be an integer value.')` The `ValidationError` class should be used for serializer and field validation, and by validator classes. It is also raised when calling `serializer.is_valid` with the `raise_exception` keyword argument: @@ -260,6 +260,15 @@ Set as `handler400`: handler400 = 'rest_framework.exceptions.bad_request' +# Third party packages + +The following third-party packages are also available. + +## DRF Standardized Errors + +The [drf-standardized-errors][drf-standardized-errors] package provides an exception handler that generates the same format for all 4xx and 5xx responses. It is a drop-in replacement for the default exception handler and allows customizing the error response format without rewriting the whole exception handler. The standardized error response format is easier to document and easier to handle by API consumers. + [cite]: https://doughellmann.com/blog/2009/06/19/python-exception-handling-techniques/ [authentication]: authentication.md [django-custom-error-views]: https://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views +[drf-standardized-errors]: https://github.com/ghazi-git/drf-standardized-errors diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md index 0492af9aa..4b4ea83cc 100644 --- a/docs/api-guide/fields.md +++ b/docs/api-guide/fields.md @@ -42,11 +42,11 @@ Set to false if this field is not required to be present during deserialization. Setting this to `False` also allows the object attribute or dictionary key to be omitted from output when serializing the instance. If the key is not present it will simply not be included in the output representation. -Defaults to `True`. +Defaults to `True`. If you're using [Model Serializer](https://www.django-rest-framework.org/api-guide/serializers/#modelserializer) default value will be `False` if you have specified `blank=True` or `default` or `null=True` at your field in your `Model`. ### `default` -If set, this gives the default value that will be used for the field if no input value is supplied. If not set the default behaviour is to not populate the attribute at all. +If set, this gives the default value that will be used for the field if no input value is supplied. If not set the default behavior is to not populate the attribute at all. The `default` is not applied during partial update operations. In the partial update case only fields that are provided in the incoming data will have a validated value returned. @@ -78,7 +78,14 @@ Defaults to `False` ### `source` -The name of the attribute that will be used to populate the field. May be a method that only takes a `self` argument, such as `URLField(source='get_absolute_url')`, or may use dotted notation to traverse attributes, such as `EmailField(source='user.email')`. When serializing fields with dotted notation, it may be necessary to provide a `default` value if any object is not present or is empty during attribute traversal. +The name of the attribute that will be used to populate the field. May be a method that only takes a `self` argument, such as `URLField(source='get_absolute_url')`, or may use dotted notation to traverse attributes, such as `EmailField(source='user.email')`. + +When serializing fields with dotted notation, it may be necessary to provide a `default` value if any object is not present or is empty during attribute traversal. Beware of possible n+1 problems when using source attribute if you are accessing a relational orm model. For example: + + class CommentSerializer(serializers.Serializer): + email = serializers.EmailField(source="user.email") + +This case would require user object to be fetched from database when it is not prefetched. If that is not wanted, be sure to be using `prefetch_related` and `select_related` methods appropriately. For more information about the methods refer to [django documentation][django-docs-select-related]. The value `source='*'` has a special meaning, and is used to indicate that the entire object should be passed through to the field. This can be useful for creating nested representations, or for fields which require access to the complete object in order to determine the output representation. @@ -144,7 +151,7 @@ Prior to Django 2.1 `models.BooleanField` fields were always `blank=True`. Thus since Django 2.1 default `serializers.BooleanField` instances will be generated without the `required` kwarg (i.e. equivalent to `required=True`) whereas with previous versions of Django, default `BooleanField` instances will be generated -with a `required=False` option. If you want to control this behaviour manually, +with a `required=False` option. If you want to control this behavior manually, explicitly declare the `BooleanField` on the serializer class, or use the `extra_kwargs` option to set the `required` flag. @@ -152,14 +159,6 @@ Corresponds to `django.db.models.fields.BooleanField`. **Signature:** `BooleanField()` -## NullBooleanField - -A boolean representation that also accepts `None` as a valid value. - -Corresponds to `django.db.models.fields.NullBooleanField`. - -**Signature:** `NullBooleanField()` - --- # String fields @@ -172,10 +171,10 @@ Corresponds to `django.db.models.fields.CharField` or `django.db.models.fields.T **Signature:** `CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)` -- `max_length` - Validates that the input contains no more than this number of characters. -- `min_length` - Validates that the input contains no fewer than this number of characters. -- `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. -- `trim_whitespace` - If set to `True` then leading and trailing whitespace is trimmed. Defaults to `True`. +* `max_length` - Validates that the input contains no more than this number of characters. +* `min_length` - Validates that the input contains no fewer than this number of characters. +* `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. +* `trim_whitespace` - If set to `True` then leading and trailing whitespace is trimmed. Defaults to `True`. The `allow_null` option is also available for string fields, although its usage is discouraged in favor of `allow_blank`. It is valid to set both `allow_blank=True` and `allow_null=True`, but doing so means that there will be two differing types of empty value permissible for string representations, which can lead to data inconsistencies and subtle application bugs. @@ -223,11 +222,11 @@ A field that ensures the input is a valid UUID string. The `to_internal_value` m **Signature:** `UUIDField(format='hex_verbose')` -- `format`: Determines the representation format of the uuid value - - `'hex_verbose'` - The canonical hex representation, including hyphens: `"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"` - - `'hex'` - The compact hex representation of the UUID, not including hyphens: `"5ce0e9a55ffa654bcee01238041fb31a"` - - `'int'` - A 128 bit integer representation of the UUID: `"123456789012312313134124512351145145114"` - - `'urn'` - RFC 4122 URN representation of the UUID: `"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"` +* `format`: Determines the representation format of the uuid value + * `'hex_verbose'` - The canonical hex representation, including hyphens: `"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"` + * `'hex'` - The compact hex representation of the UUID, not including hyphens: `"5ce0e9a55ffa654bcee01238041fb31a"` + * `'int'` - A 128 bit integer representation of the UUID: `"123456789012312313134124512351145145114"` + * `'urn'` - RFC 4122 URN representation of the UUID: `"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"` Changing the `format` parameters only affects representation values. All formats are accepted by `to_internal_value` ## FilePathField @@ -238,11 +237,11 @@ Corresponds to `django.forms.fields.FilePathField`. **Signature:** `FilePathField(path, match=None, recursive=False, allow_files=True, allow_folders=False, required=None, **kwargs)` -- `path` - The absolute filesystem path to a directory from which this FilePathField should get its choice. -- `match` - A regular expression, as a string, that FilePathField will use to filter filenames. -- `recursive` - Specifies whether all subdirectories of path should be included. Default is `False`. -- `allow_files` - Specifies whether files in the specified location should be included. Default is `True`. Either this or `allow_folders` must be `True`. -- `allow_folders` - Specifies whether folders in the specified location should be included. Default is `False`. Either this or `allow_files` must be `True`. +* `path` - The absolute filesystem path to a directory from which this FilePathField should get its choice. +* `match` - A regular expression, as a string, that FilePathField will use to filter filenames. +* `recursive` - Specifies whether all subdirectories of path should be included. Default is `False`. +* `allow_files` - Specifies whether files in the specified location should be included. Default is `True`. Either this or `allow_folders` must be `True`. +* `allow_folders` - Specifies whether folders in the specified location should be included. Default is `False`. Either this or `allow_files` must be `True`. ## IPAddressField @@ -252,8 +251,8 @@ Corresponds to `django.forms.fields.IPAddressField` and `django.forms.fields.Gen **Signature**: `IPAddressField(protocol='both', unpack_ipv4=False, **options)` -- `protocol` Limits valid inputs to the specified protocol. Accepted values are 'both' (default), 'IPv4' or 'IPv6'. Matching is case insensitive. -- `unpack_ipv4` Unpacks IPv4 mapped addresses like ::ffff:192.0.2.1. If this option is enabled that address would be unpacked to 192.0.2.1. Default is disabled. Can only be used when protocol is set to 'both'. +* `protocol` Limits valid inputs to the specified protocol. Accepted values are 'both' (default), 'IPv4' or 'IPv6'. Matching is case insensitive. +* `unpack_ipv4` Unpacks IPv4 mapped addresses like ::ffff:192.0.2.1. If this option is enabled that address would be unpacked to 192.0.2.1. Default is disabled. Can only be used when protocol is set to 'both'. --- @@ -267,8 +266,8 @@ Corresponds to `django.db.models.fields.IntegerField`, `django.db.models.fields. **Signature**: `IntegerField(max_value=None, min_value=None)` -- `max_value` Validate that the number provided is no greater than this value. -- `min_value` Validate that the number provided is no less than this value. +* `max_value` Validate that the number provided is no greater than this value. +* `min_value` Validate that the number provided is no less than this value. ## FloatField @@ -278,8 +277,8 @@ Corresponds to `django.db.models.fields.FloatField`. **Signature**: `FloatField(max_value=None, min_value=None)` -- `max_value` Validate that the number provided is no greater than this value. -- `min_value` Validate that the number provided is no less than this value. +* `max_value` Validate that the number provided is no greater than this value. +* `min_value` Validate that the number provided is no less than this value. ## DecimalField @@ -289,13 +288,14 @@ Corresponds to `django.db.models.fields.DecimalField`. **Signature**: `DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)` -- `max_digits` The maximum number of digits allowed in the number. It must be either `None` or an integer greater than or equal to `decimal_places`. -- `decimal_places` The number of decimal places to store with the number. -- `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. Note that setting `localize` will force the value to `True`. -- `max_value` Validate that the number provided is no greater than this value. -- `min_value` Validate that the number provided is no less than this value. -- `localize` Set to `True` to enable localization of input and output based on the current locale. This will also force `coerce_to_string` to `True`. Defaults to `False`. Note that data formatting is enabled if you have set `USE_L10N=True` in your settings file. -- `rounding` Sets the rounding mode used when quantising to the configured precision. Valid values are [`decimal` module rounding modes][python-decimal-rounding-modes]. Defaults to `None`. +* `max_digits` The maximum number of digits allowed in the number. It must be either `None` or an integer greater than or equal to `decimal_places`. +* `decimal_places` The number of decimal places to store with the number. +* `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. Note that setting `localize` will force the value to `True`. +* `max_value` Validate that the number provided is no greater than this value. +* `min_value` Validate that the number provided is no less than this value. +* `localize` Set to `True` to enable localization of input and output based on the current locale. This will also force `coerce_to_string` to `True`. Defaults to `False`. Note that data formatting is enabled if you have set `USE_L10N=True` in your settings file. +* `rounding` Sets the rounding mode used when quantising to the configured precision. Valid values are [`decimal` module rounding modes][python-decimal-rounding-modes]. Defaults to `None`. +* `normalize_output` Will normalize the decimal value when serialized. This will strip all trailing zeroes and change the value's precision to the minimum required precision to be able to represent the value without loosing data. Defaults to `False`. #### Example usage @@ -307,10 +307,6 @@ And to validate numbers up to anything less than one billion with a resolution o serializers.DecimalField(max_digits=19, decimal_places=10) -This field also takes an optional argument, `coerce_to_string`. If set to `True` the representation will be output as a string. If set to `False` the representation will be left as a `Decimal` instance and the final representation will be determined by the renderer. - -If unset, this will default to the same value as the `COERCE_DECIMAL_TO_STRING` setting, which is `True` unless set otherwise. - --- # Date and time fields @@ -325,7 +321,7 @@ Corresponds to `django.db.models.fields.DateTimeField`. * `format` - A string representing the output format. If not specified, this defaults to the same value as the `DATETIME_FORMAT` settings key, which will be `'iso-8601'` unless set. Setting to a format string indicates that `to_representation` return values should be coerced to string output. Format strings are described below. Setting this value to `None` indicates that Python `datetime` objects should be returned by `to_representation`. In this case the datetime encoding will be determined by the renderer. * `input_formats` - A list of strings representing the input formats which may be used to parse the date. If not specified, the `DATETIME_INPUT_FORMATS` setting will be used, which defaults to `['iso-8601']`. -* `default_timezone` - A `pytz.timezone` representing the timezone. If not specified and the `USE_TZ` setting is enabled, this defaults to the [current timezone][django-current-timezone]. If `USE_TZ` is disabled, then datetime objects will be naive. +* `default_timezone` - A `tzinfo` subclass (`zoneinfo` or `pytz`) prepresenting the timezone. If not specified and the `USE_TZ` setting is enabled, this defaults to the [current timezone][django-current-timezone]. If `USE_TZ` is disabled, then datetime objects will be naive. #### `DateTimeField` format strings. @@ -385,8 +381,8 @@ The representation is a string following this format `'[DD] [HH:[MM:]]ss[.uuuuuu **Signature:** `DurationField(max_value=None, min_value=None)` -- `max_value` Validate that the duration provided is no greater than this value. -- `min_value` Validate that the duration provided is no less than this value. +* `max_value` Validate that the duration provided is no greater than this value. +* `min_value` Validate that the duration provided is no less than this value. --- @@ -400,10 +396,10 @@ Used by `ModelSerializer` to automatically generate fields if the corresponding **Signature:** `ChoiceField(choices)` -- `choices` - A list of valid values, or a list of `(key, display_name)` tuples. -- `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. -- `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Can be used to ensure that automatically generated ChoiceFields with very large possible selections do not prevent a template from rendering. Defaults to `None`. -- `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` +* `choices` - A list of valid values, or a list of `(key, display_name)` tuples. +* `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. +* `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Can be used to ensure that automatically generated ChoiceFields with very large possible selections do not prevent a template from rendering. Defaults to `None`. +* `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` Both the `allow_blank` and `allow_null` are valid options on `ChoiceField`, although it is highly recommended that you only use one and not both. `allow_blank` should be preferred for textual choices, and `allow_null` should be preferred for numeric or other non-textual choices. @@ -413,10 +409,10 @@ A field that can accept a set of zero, one or many values, chosen from a limited **Signature:** `MultipleChoiceField(choices)` -- `choices` - A list of valid values, or a list of `(key, display_name)` tuples. -- `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. -- `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Can be used to ensure that automatically generated ChoiceFields with very large possible selections do not prevent a template from rendering. Defaults to `None`. -- `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` +* `choices` - A list of valid values, or a list of `(key, display_name)` tuples. +* `allow_blank` - If set to `True` then the empty string should be considered a valid value. If set to `False` then the empty string is considered invalid and will raise a validation error. Defaults to `False`. +* `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Can be used to ensure that automatically generated ChoiceFields with very large possible selections do not prevent a template from rendering. Defaults to `None`. +* `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` As with `ChoiceField`, both the `allow_blank` and `allow_null` options are valid, although it is highly recommended that you only use one and not both. `allow_blank` should be preferred for textual choices, and `allow_null` should be preferred for numeric or other non-textual choices. @@ -437,9 +433,9 @@ Corresponds to `django.forms.fields.FileField`. **Signature:** `FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)` - - `max_length` - Designates the maximum length for the file name. - - `allow_empty_file` - Designates if empty files are allowed. -- `use_url` - If set to `True` then URL string values will be used for the output representation. If set to `False` then filename string values will be used for the output representation. Defaults to the value of the `UPLOADED_FILES_USE_URL` settings key, which is `True` unless set otherwise. +* `max_length` - Designates the maximum length for the file name. +* `allow_empty_file` - Designates if empty files are allowed. +* `use_url` - If set to `True` then URL string values will be used for the output representation. If set to `False` then filename string values will be used for the output representation. Defaults to the value of the `UPLOADED_FILES_USE_URL` settings key, which is `True` unless set otherwise. ## ImageField @@ -449,9 +445,9 @@ Corresponds to `django.forms.fields.ImageField`. **Signature:** `ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)` - - `max_length` - Designates the maximum length for the file name. - - `allow_empty_file` - Designates if empty files are allowed. -- `use_url` - If set to `True` then URL string values will be used for the output representation. If set to `False` then filename string values will be used for the output representation. Defaults to the value of the `UPLOADED_FILES_USE_URL` settings key, which is `True` unless set otherwise. +* `max_length` - Designates the maximum length for the file name. +* `allow_empty_file` - Designates if empty files are allowed. +* `use_url` - If set to `True` then URL string values will be used for the output representation. If set to `False` then filename string values will be used for the output representation. Defaults to the value of the `UPLOADED_FILES_USE_URL` settings key, which is `True` unless set otherwise. Requires either the `Pillow` package or `PIL` package. The `Pillow` package is recommended, as `PIL` is no longer actively maintained. @@ -465,10 +461,10 @@ A field class that validates a list of objects. **Signature**: `ListField(child=, allow_empty=True, min_length=None, max_length=None)` -- `child` - A field instance that should be used for validating the objects in the list. If this argument is not provided then objects in the list will not be validated. -- `allow_empty` - Designates if empty lists are allowed. -- `min_length` - Validates that the list contains no fewer than this number of elements. -- `max_length` - Validates that the list contains no more than this number of elements. +* `child` - A field instance that should be used for validating the objects in the list. If this argument is not provided then objects in the list will not be validated. +* `allow_empty` - Designates if empty lists are allowed. +* `min_length` - Validates that the list contains no fewer than this number of elements. +* `max_length` - Validates that the list contains no more than this number of elements. For example, to validate a list of integers you might use something like the following: @@ -489,8 +485,8 @@ A field class that validates a dictionary of objects. The keys in `DictField` ar **Signature**: `DictField(child=, allow_empty=True)` -- `child` - A field instance that should be used for validating the values in the dictionary. If this argument is not provided then values in the mapping will not be validated. -- `allow_empty` - Designates if empty dictionaries are allowed. +* `child` - A field instance that should be used for validating the values in the dictionary. If this argument is not provided then values in the mapping will not be validated. +* `allow_empty` - Designates if empty dictionaries are allowed. For example, to create a field that validates a mapping of strings to strings, you would write something like this: @@ -507,8 +503,8 @@ A preconfigured `DictField` that is compatible with Django's postgres `HStoreFie **Signature**: `HStoreField(child=, allow_empty=True)` -- `child` - A field instance that is used for validating the values in the dictionary. The default child field accepts both empty strings and null values. -- `allow_empty` - Designates if empty dictionaries are allowed. +* `child` - A field instance that is used for validating the values in the dictionary. The default child field accepts both empty strings and null values. +* `allow_empty` - Designates if empty dictionaries are allowed. Note that the child field **must** be an instance of `CharField`, as the hstore extension stores values as strings. @@ -518,8 +514,8 @@ A field class that validates that the incoming data structure consists of valid **Signature**: `JSONField(binary, encoder)` -- `binary` - If set to `True` then the field will output and validate a JSON encoded string, rather than a primitive data structure. Defaults to `False`. -- `encoder` - Use this JSON encoder to serialize input object. Defaults to `None`. +* `binary` - If set to `True` then the field will output and validate a JSON encoded string, rather than a primitive data structure. Defaults to `False`. +* `encoder` - Use this JSON encoder to serialize input object. Defaults to `None`. --- @@ -570,7 +566,7 @@ This is a read-only field. It gets its value by calling a method on the serializ **Signature**: `SerializerMethodField(method_name=None)` -- `method_name` - The name of the method on the serializer to be called. If not included this defaults to `get_`. +* `method_name` - The name of the method on the serializer to be called. If not included this defaults to `get_`. The serializer method referred to by the `method_name` argument should accept a single argument (in addition to `self`), which is the object being serialized. It should return whatever you want to be included in the serialized representation of the object. For example: @@ -583,6 +579,7 @@ The serializer method referred to by the `method_name` argument should accept a class Meta: model = User + fields = '__all__' def get_days_since_joined(self, obj): return (now() - obj.date_joined).days @@ -775,7 +772,7 @@ Here the mapping between the target and source attribute pairs (`x` and `x_coordinate`, `y` and `y_coordinate`) is handled in the `IntegerField` declarations. It's our `NestedCoordinateSerializer` that takes `source='*'`. -Our new `DataPointSerializer` exhibits the same behaviour as the custom field +Our new `DataPointSerializer` exhibits the same behavior as the custom field approach. Serializing: @@ -835,7 +832,7 @@ the [djangorestframework-recursive][djangorestframework-recursive] package provi ## django-rest-framework-gis -The [django-rest-framework-gis][django-rest-framework-gis] package provides geographic addons for django rest framework like a `GeometryField` field and a GeoJSON serializer. +The [django-rest-framework-gis][django-rest-framework-gis] package provides geographic addons for django rest framework like a `GeometryField` field and a GeoJSON serializer. ## django-rest-framework-hstore @@ -854,3 +851,4 @@ The [django-rest-framework-hstore][django-rest-framework-hstore] package provide [django-hstore]: https://github.com/djangonauts/django-hstore [python-decimal-rounding-modes]: https://docs.python.org/3/library/decimal.html#rounding-modes [django-current-timezone]: https://docs.djangoproject.com/en/stable/topics/i18n/timezones/#default-time-zone-and-current-time-zone +[django-docs-select-related]: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index d305ede6b..be8d10e9c 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -75,7 +75,7 @@ We can override `.get_queryset()` to deal with URLs such as `http://example.com/ by filtering against a `username` query parameter in the URL. """ queryset = Purchase.objects.all() - username = self.request.query_params.get('username', None) + username = self.request.query_params.get('username') if username is not None: queryset = queryset.filter(purchaser__username=username) return queryset @@ -224,7 +224,7 @@ The search behavior may be restricted by prepending various characters to the `s * '^' Starts-with search. * '=' Exact matches. -* '@' Full-text search. (Currently only supported Django's [PostgreSQL backend](https://docs.djangoproject.com/en/dev/ref/contrib/postgres/search/).) +* '@' Full-text search. (Currently only supported Django's [PostgreSQL backend][postgres-search].) * '$' Regex search. For example: @@ -241,7 +241,7 @@ To dynamically change search fields based on request content, it's possible to s def get_search_fields(self, view, request): if request.query_params.get('title_only'): return ['title'] - return super(CustomSearchFilter, self).get_search_fields(view, request) + return super().get_search_fields(view, request) For more details, see the [Django documentation][search-django-admin]. @@ -335,15 +335,6 @@ Generic filters may also present an interface in the browsable API. To do so you The method should return a rendered HTML string. -## Pagination & schemas - -You can also make the filter controls available to the schema autogeneration -that REST framework provides, by implementing a `get_schema_fields()` method. This method should have the following signature: - -`get_schema_fields(self, view)` - -The method should return a list of `coreapi.Field` instances. - # Third party packages The following third party packages provide additional filter implementations. @@ -374,3 +365,4 @@ The [djangorestframework-word-filter][django-rest-framework-word-search-filter] [drf-url-filter]: https://github.com/manjitkumar/drf-url-filters [HStoreField]: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#hstorefield [JSONField]: https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#jsonfield +[postgres-search]: https://docs.djangoproject.com/en/stable/ref/contrib/postgres/search/ diff --git a/docs/api-guide/format-suffixes.md b/docs/api-guide/format-suffixes.md index dfdf24953..9b4e5b9da 100644 --- a/docs/api-guide/format-suffixes.md +++ b/docs/api-guide/format-suffixes.md @@ -23,8 +23,8 @@ Returns a URL pattern list which includes format suffix patterns appended to eac Arguments: * **urlpatterns**: Required. A URL pattern list. -* **suffix_required**: Optional. A boolean indicating if suffixes in the URLs should be optional or mandatory. Defaults to `False`, meaning that suffixes are optional by default. -* **allowed**: Optional. A list or tuple of valid format suffixes. If not provided, a wildcard format suffix pattern will be used. +* **suffix_required**: Optional. A boolean indicating if suffixes in the URLs should be optional or mandatory. Defaults to `False`, meaning that suffixes are optional by default. +* **allowed**: Optional. A list or tuple of valid format suffixes. If not provided, a wildcard format suffix pattern will be used. Example: @@ -62,7 +62,7 @@ Also note that `format_suffix_patterns` does not support descending into `includ If using the `i18n_patterns` function provided by Django, as well as `format_suffix_patterns` you should make sure that the `i18n_patterns` function is applied as the final, or outermost function. For example: - url patterns = [ + urlpatterns = [ … ] diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md index afc2cab56..410e3518d 100644 --- a/docs/api-guide/generic-views.md +++ b/docs/api-guide/generic-views.md @@ -65,7 +65,7 @@ The following attributes control the basic view behavior. * `queryset` - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the `get_queryset()` method. If you are overriding a view method, it is important that you call `get_queryset()` instead of accessing this property directly, as `queryset` will get evaluated once, and those results will be cached for all subsequent requests. * `serializer_class` - The serializer class that should be used for validating and deserializing input, and for serializing output. Typically, you must either set this attribute, or override the `get_serializer_class()` method. -* `lookup_field` - The model field that should be used to for performing object lookup of individual model instances. Defaults to `'pk'`. Note that when using hyperlinked APIs you'll need to ensure that *both* the API views *and* the serializer classes set the lookup fields if you need to use a custom value. +* `lookup_field` - The model field that should be used for performing object lookup of individual model instances. Defaults to `'pk'`. Note that when using hyperlinked APIs you'll need to ensure that *both* the API views *and* the serializer classes set the lookup fields if you need to use a custom value. * `lookup_url_kwarg` - The URL keyword argument that should be used for object lookup. The URL conf should include a keyword argument corresponding to this value. If unset this defaults to using the same value as `lookup_field`. **Pagination**: @@ -96,6 +96,12 @@ For example: user = self.request.user return user.accounts.all() +--- + +**Note:** If the `serializer_class` used in the generic view spans orm relations, leading to an n+1 problem, you could optimize your queryset in this method using `select_related` and `prefetch_related`. To get more information about n+1 problem and use cases of the mentioned methods refer to related section in [django documentation][django-docs-select-related]. + +--- + #### `get_object(self)` Returns an object instance that should be used for detail views. Defaults to using the `lookup_field` parameter to filter the base queryset. @@ -211,7 +217,7 @@ If the request data provided for creating the object was invalid, a `400 Bad Req Provides a `.retrieve(request, *args, **kwargs)` method, that implements returning an existing model instance in a response. -If an object can be retrieved this returns a `200 OK` response, with a serialized representation of the object as the body of the response. Otherwise it will return a `404 Not Found`. +If an object can be retrieved this returns a `200 OK` response, with a serialized representation of the object as the body of the response. Otherwise, it will return a `404 Not Found`. ## UpdateModelMixin @@ -329,7 +335,7 @@ For example, if you need to lookup objects based on multiple fields in the URL c queryset = self.filter_queryset(queryset) # Apply any filter backends filter = {} for field in self.lookup_fields: - if self.kwargs[field]: # Ignore empty fields. + if self.kwargs.get(field): # Ignore empty fields. filter[field] = self.kwargs[field] obj = get_object_or_404(queryset, **filter) # Lookup the object self.check_object_permissions(self.request, obj) @@ -389,3 +395,4 @@ The following third party packages provide additional generic view implementatio [UpdateModelMixin]: #updatemodelmixin [DestroyModelMixin]: #destroymodelmixin [django-rest-multiple-models]: https://github.com/MattBroach/DjangoRestMultipleModels +[django-docs-select-related]: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index 8d9eb2288..6754fd5c0 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -78,7 +78,7 @@ This pagination style accepts a single number page number in the request query p HTTP 200 OK { - "count": 1023 + "count": 1023, "next": "https://api.example.org/accounts/?page=5", "previous": "https://api.example.org/accounts/?page=3", "results": [ @@ -126,7 +126,7 @@ This pagination style mirrors the syntax used when looking up multiple database HTTP 200 OK { - "count": 1023 + "count": 1023, "next": "https://api.example.org/accounts/?limit=100&offset=500", "previous": "https://api.example.org/accounts/?limit=100&offset=300", "results": [ @@ -218,16 +218,16 @@ To set these attributes you should override the `CursorPagination` class, and th # Custom pagination styles -To create a custom pagination serializer class you should subclass `pagination.BasePagination` and override the `paginate_queryset(self, queryset, request, view=None)` and `get_paginated_response(self, data)` methods: +To create a custom pagination serializer class, you should inherit the subclass `pagination.BasePagination`, override the `paginate_queryset(self, queryset, request, view=None)`, and `get_paginated_response(self, data)` methods: -* The `paginate_queryset` method is passed the initial queryset and should return an iterable object that contains only the data in the requested page. -* The `get_paginated_response` method is passed the serialized page data and should return a `Response` instance. +* The `paginate_queryset` method is passed to the initial queryset and should return an iterable object. That object contains only the data in the requested page. +* The `get_paginated_response` method is passed to the serialized page data and should return a `Response` instance. Note that the `paginate_queryset` method may set state on the pagination instance, that may later be used by the `get_paginated_response` method. ## Example -Suppose we want to replace the default pagination output style with a modified format that includes the next and previous links under in a nested 'links' key. We could specify a custom pagination class like so: +Suppose we want to replace the default pagination output style with a modified format that includes the next and previous links under in a nested 'links' key. We could specify a custom pagination class like so: class CustomPagination(pagination.PageNumberPagination): def get_paginated_response(self, data): @@ -264,15 +264,6 @@ API responses for list endpoints will now include a `Link` header, instead of in *A custom pagination style, using the 'Link' header'* -## Pagination & schemas - -You can also make the pagination controls available to the schema autogeneration -that REST framework provides, by implementing a `get_schema_fields()` method. This method should have the following signature: - -`get_schema_fields(self, view)` - -The method should return a list of `coreapi.Field` instances. - --- # HTML pagination controls @@ -312,7 +303,7 @@ The [`drf-proxy-pagination` package][drf-proxy-pagination] includes a `ProxyPagi ## link-header-pagination -The [`django-rest-framework-link-header-pagination` package][drf-link-header-pagination] includes a `LinkHeaderPagination` class which provides pagination via an HTTP `Link` header as described in [Github's developer documentation](github-link-pagination). +The [`django-rest-framework-link-header-pagination` package][drf-link-header-pagination] includes a `LinkHeaderPagination` class which provides pagination via an HTTP `Link` header as described in [GitHub REST API documentation][github-traversing-with-pagination]. [cite]: https://docs.djangoproject.com/en/stable/topics/pagination/ [link-header]: ../img/link-header-pagination.png @@ -322,3 +313,4 @@ The [`django-rest-framework-link-header-pagination` package][drf-link-header-pag [drf-link-header-pagination]: https://github.com/tbeadle/django-rest-framework-link-header-pagination [disqus-cursor-api]: https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api [float_cursor_pagination_example]: https://gist.github.com/keturn/8bc88525a183fd41c73ffb729b8865be#file-fpcursorpagination-py +[github-traversing-with-pagination]: https://docs.github.com/en/rest/guides/traversing-with-pagination diff --git a/docs/api-guide/parsers.md b/docs/api-guide/parsers.md index e8f03de8b..0a85d474f 100644 --- a/docs/api-guide/parsers.md +++ b/docs/api-guide/parsers.md @@ -15,7 +15,7 @@ REST framework includes a number of built in Parser classes, that allow you to a ## How the parser is determined -The set of valid parsers for a view is always defined as a list of classes. When `request.data` is accessed, REST framework will examine the `Content-Type` header on the incoming request, and determine which parser to use to parse the request content. +The set of valid parsers for a view is always defined as a list of classes. When `request.data` is accessed, REST framework will examine the `Content-Type` header on the incoming request, and determine which parser to use to parse the request content. --- @@ -73,7 +73,7 @@ Or, if you're using the `@api_view` decorator with function based views. ## JSONParser -Parses `JSON` request content. +Parses `JSON` request content. `request.data` will be populated with a dictionary of data. **.media_type**: `application/json` @@ -87,7 +87,7 @@ You will typically want to use both `FormParser` and `MultiPartParser` together ## MultiPartParser -Parses multipart HTML form content, which supports file uploads. Both `request.data` will be populated with a `QueryDict`. +Parses multipart HTML form content, which supports file uploads. `request.data` and `request.FILES` will be populated with a `QueryDict` and `MultiValueDict` respectively. You will typically want to use both `FormParser` and `MultiPartParser` together in order to fully support HTML form data. diff --git a/docs/api-guide/permissions.md b/docs/api-guide/permissions.md index ade146257..d945e95c3 100644 --- a/docs/api-guide/permissions.md +++ b/docs/api-guide/permissions.md @@ -24,9 +24,9 @@ A slightly less strict style of permission would be to allow full access to auth Permissions in REST framework are always defined as a list of permission classes. Before running the main body of the view each permission in the list is checked. -If any permission check fails an `exceptions.PermissionDenied` or `exceptions.NotAuthenticated` exception will be raised, and the main body of the view will not run. +If any permission check fails, an `exceptions.PermissionDenied` or `exceptions.NotAuthenticated` exception will be raised, and the main body of the view will not run. -When the permissions checks fail either a "403 Forbidden" or a "401 Unauthorized" response will be returned, according to the following rules: +When the permission checks fail, either a "403 Forbidden" or a "401 Unauthorized" response will be returned, according to the following rules: * The request was successfully authenticated, but permission was denied. *— An HTTP 403 Forbidden response will be returned.* * The request was not successfully authenticated, and the highest priority authentication class *does not* use `WWW-Authenticate` headers. *— An HTTP 403 Forbidden response will be returned.* @@ -70,6 +70,8 @@ For performance reasons the generic views will not automatically apply object le Often when you're using object level permissions you'll also want to [filter the queryset][filtering] appropriately, to ensure that users only have visibility onto instances that they are permitted to view. +Because the `get_object()` method is not called, object level permissions from the `has_object_permission()` method **are not applied** when creating objects. In order to restrict object creation you need to implement the permission check either in your Serializer class or override the `perform_create()` method of your ViewSet class. + ## Setting the permission policy The default permission policy may be set globally, using the `DEFAULT_PERMISSION_CLASSES` setting. For example. @@ -116,7 +118,7 @@ Or, if you're using the `@api_view` decorator with function based views. } return Response(content) -__Note:__ when you set new permission classes through class attribute or decorators you're telling the view to ignore the default list set over the __settings.py__ file. +__Note:__ when you set new permission classes via the class attribute or decorators you're telling the view to ignore the default list set in the __settings.py__ file. Provided they inherit from `rest_framework.permissions.BasePermission`, permissions can be composed using standard Python bitwise operators. For example, `IsAuthenticatedOrReadOnly` could be written: @@ -169,22 +171,16 @@ This permission is suitable if you want to your API to allow read permissions to ## DjangoModelPermissions -This permission class ties into Django's standard `django.contrib.auth` [model permissions][contribauth]. This permission must only be applied to views that have a `.queryset` property set. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned. +This permission class ties into Django's standard `django.contrib.auth` [model permissions][contribauth]. This permission must only be applied to views that have a `.queryset` property or `get_queryset()` method. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned. The appropriate model is determined by checking `get_queryset().model` or `queryset.model`. * `POST` requests require the user to have the `add` permission on the model. * `PUT` and `PATCH` requests require the user to have the `change` permission on the model. * `DELETE` requests require the user to have the `delete` permission on the model. -The default behaviour can also be overridden to support custom model permissions. For example, you might want to include a `view` model permission for `GET` requests. +The default behavior can also be overridden to support custom model permissions. For example, you might want to include a `view` model permission for `GET` requests. To use custom model permissions, override `DjangoModelPermissions` and set the `.perms_map` property. Refer to the source code for details. -#### Using with views that do not include a `queryset` attribute. - -If you're using this permission with a view that uses an overridden `get_queryset()` method there may not be a `queryset` attribute on the view. In this case we suggest also marking the view with a sentinel queryset, so that this class can determine the required permissions. For example: - - queryset = User.objects.none() # Required for DjangoModelPermissions - ## DjangoModelPermissionsOrAnonReadOnly Similar to `DjangoModelPermissions`, but also allows unauthenticated users to have read-only access to the API. @@ -278,6 +274,30 @@ Note that the generic views will check the appropriate object level permissions, Also note that the generic views will only check the object-level permissions for views that retrieve a single model instance. If you require object-level filtering of list views, you'll need to filter the queryset separately. See the [filtering documentation][filtering] for more details. +# Overview of access restriction methods + +REST framework offers three different methods to customize access restrictions on a case-by-case basis. These apply in different scenarios and have different effects and limitations. + + * `queryset`/`get_queryset()`: Limits the general visibility of existing objects from the database. The queryset limits which objects will be listed and which objects can be modified or deleted. The `get_queryset()` method can apply different querysets based on the current action. + * `permission_classes`/`get_permissions()`: General permission checks based on the current action, request and targeted object. Object level permissions can only be applied to retrieve, modify and deletion actions. Permission checks for list and create will be applied to the entire object type. (In case of list: subject to restrictions in the queryset.) + * `serializer_class`/`get_serializer()`: Instance level restrictions that apply to all objects on input and output. The serializer may have access to the request context. The `get_serializer()` method can apply different serializers based on the current action. + +The following table lists the access restriction methods and the level of control they offer over which actions. + +| | `queryset` | `permission_classes` | `serializer_class` | +|------------------------------------|------------|----------------------|--------------------| +| Action: list | global | global | object-level* | +| Action: create | no | global | object-level | +| Action: retrieve | global | object-level | object-level | +| Action: update | global | object-level | object-level | +| Action: partial_update | global | object-level | object-level | +| Action: destroy | global | object-level | no | +| Can reference action in decision | no** | yes | no** | +| Can reference request in decision | no** | yes | yes | + + \* A Serializer class should not raise PermissionDenied in a list action, or the entire list would not be returned.
+ \** The `get_*()` methods have access to the current view and can return different Serializer or QuerySet instances based on the request or action. + --- # Third party packages @@ -304,6 +324,10 @@ The [DRY Rest Permissions][dry-rest-permissions] package provides the ability to The [Django Rest Framework Roles][django-rest-framework-roles] package makes it easier to parameterize your API over multiple types of users. +## Rest Framework Roles + +The [Rest Framework Roles][rest-framework-roles] makes it super easy to protect views based on roles. Most importantly allows you to decouple accessibility logic from models and views in a clean human-readable way. + ## Django REST Framework API Key The [Django REST Framework API Key][djangorestframework-api-key] package provides permissions classes, models and helpers to add API key authorization to your API. It can be used to authorize internal or third-party backends and services (i.e. _machines_) which do not have a user account. API keys are stored securely using Django's password hashing infrastructure, and they can be viewed, edited and revoked at anytime in the Django admin. @@ -329,6 +353,7 @@ The [Django Rest Framework PSQ][drf-psq] package is an extension that gives supp [rest-condition]: https://github.com/caxap/rest_condition [dry-rest-permissions]: https://github.com/FJNR-inc/dry-rest-permissions [django-rest-framework-roles]: https://github.com/computer-lab/django-rest-framework-roles +[rest-framework-roles]: https://github.com/Pithikos/rest-framework-roles [djangorestframework-api-key]: https://florimondmanca.github.io/djangorestframework-api-key/ [django-rest-framework-role-filters]: https://github.com/allisson/django-rest-framework-role-filters [django-rest-framework-guardian]: https://github.com/rpkilby/django-rest-framework-guardian diff --git a/docs/api-guide/relations.md b/docs/api-guide/relations.md index d3d8b30b8..56eb61e43 100644 --- a/docs/api-guide/relations.md +++ b/docs/api-guide/relations.md @@ -17,6 +17,37 @@ Relational fields are used to represent model relationships. They can be applie --- +--- + +**Note:** REST Framework does not attempt to automatically optimize querysets passed to serializers in terms of `select_related` and `prefetch_related` since it would be too much magic. A serializer with a field spanning an orm relation through its source attribute could require an additional database hit to fetch related objects from the database. It is the programmer's responsibility to optimize queries to avoid additional database hits which could occur while using such a serializer. + +For example, the following serializer would lead to a database hit each time evaluating the tracks field if it is not prefetched: + + class AlbumSerializer(serializers.ModelSerializer): + tracks = serializers.SlugRelatedField( + many=True, + read_only=True, + slug_field='title' + ) + + class Meta: + model = Album + fields = ['album_name', 'artist', 'tracks'] + + # For each album object, tracks should be fetched from database + qs = Album.objects.all() + print(AlbumSerializer(qs, many=True).data) + +If `AlbumSerializer` is used to serialize a fairly large queryset with `many=True` then it could be a serious performance problem. Optimizing the queryset passed to `AlbumSerializer` with: + + qs = Album.objects.prefetch_related('tracks') + # No additional database hits required + print(AlbumSerializer(qs, many=True).data) + +would solve the issue. + +--- + #### Inspecting relationships. When using the `ModelSerializer` class, serializer fields and relationships will be automatically generated for you. Inspecting these automatically generated fields can be a useful tool for determining how to customize the relationship style. @@ -215,7 +246,7 @@ When using `SlugRelatedField` as a read-write field, you will normally want to e ## HyperlinkedIdentityField -This field can be applied as an identity relationship, such as the `'url'` field on a HyperlinkedModelSerializer. It can also be used for an attribute on the object. For example, the following serializer: +This field can be applied as an identity relationship, such as the `'url'` field on a HyperlinkedModelSerializer. It can also be used for an attribute on the object. For example, the following serializer: class AlbumSerializer(serializers.HyperlinkedModelSerializer): track_listing = serializers.HyperlinkedIdentityField(view_name='track-list') @@ -247,7 +278,7 @@ This field is always read-only. As opposed to previously discussed _references_ to another entity, the referred entity can instead also be embedded or _nested_ in the representation of the object that refers to it. -Such nested relationships can be expressed by using serializers as fields. +Such nested relationships can be expressed by using serializers as fields. If the field is used to represent a to-many relationship, you should add the `many=True` flag to the serializer field. @@ -463,8 +494,8 @@ This behavior is intended to prevent a template from being unable to render in a There are two keyword arguments you can use to control this behavior: -- `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Set to `None` to disable any limiting. Defaults to `1000`. -- `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` +* `html_cutoff` - If set this will be the maximum number of choices that will be displayed by a HTML select drop down. Set to `None` to disable any limiting. Defaults to `1000`. +* `html_cutoff_text` - If set this will display a textual indicator if the maximum number of items have been cutoff in an HTML select drop down. Defaults to `"More than {count} items…"` You can also control these globally using the settings `HTML_SELECT_CUTOFF` and `HTML_SELECT_CUTOFF_TEXT`. @@ -603,6 +634,6 @@ The [rest-framework-generic-relations][drf-nested-relations] library provides re [generic-relations]: https://docs.djangoproject.com/en/stable/ref/contrib/contenttypes/#id1 [drf-nested-routers]: https://github.com/alanjds/drf-nested-routers [drf-nested-relations]: https://github.com/Ian-Foote/rest-framework-generic-relations -[django-intermediary-manytomany]: https://docs.djangoproject.com/en/2.2/topics/db/models/#intermediary-manytomany +[django-intermediary-manytomany]: https://docs.djangoproject.com/en/stable/topics/db/models/#intermediary-manytomany [dealing-with-nested-objects]: https://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects [to_internal_value]: https://www.django-rest-framework.org/api-guide/serializers/#to_internal_valueself-data diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index ca3a29b82..44f1b6021 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -103,6 +103,16 @@ Unlike other renderers, the data passed to the `Response` does not need to be se The TemplateHTMLRenderer will create a `RequestContext`, using the `response.data` as the context dict, and determine a template name to use to render the context. +--- + +**Note:** When used with a view that makes use of a serializer the `Response` sent for rendering may not be a dictionary and will need to be wrapped in a dict before returning to allow the `TemplateHTMLRenderer` to render it. For example: + +``` +response.data = {'results': response.data} +``` + +--- + The template name is determined by (in order of preference): 1. An explicit `template_name` argument passed to the response. @@ -182,7 +192,7 @@ By default the response content will be rendered with the highest priority rende def get_default_renderer(self, view): return JSONRenderer() -## AdminRenderer +## AdminRenderer Renders data into HTML for an admin-like display: @@ -247,7 +257,7 @@ This renderer is used for rendering HTML multipart form data. **It is not suita # Custom renderers -To implement a custom renderer, you should override `BaseRenderer`, set the `.media_type` and `.format` properties, and implement the `.render(self, data, media_type=None, renderer_context=None)` method. +To implement a custom renderer, you should override `BaseRenderer`, set the `.media_type` and `.format` properties, and implement the `.render(self, data, accepted_media_type=None, renderer_context=None)` method. The method should return a bytestring, which will be used as the body of the HTTP response. @@ -257,7 +267,7 @@ The arguments passed to the `.render()` method are: The request data, as set by the `Response()` instantiation. -### `media_type=None` +### `accepted_media_type=None` Optional. If provided, this is the accepted media type, as determined by the content negotiation stage. @@ -281,7 +291,7 @@ The following is an example plaintext renderer that will return a response with media_type = 'text/plain' format = 'txt' - def render(self, data, media_type=None, renderer_context=None): + def render(self, data, accepted_media_type=None, renderer_context=None): return smart_text(data, encoding=self.charset) ## Setting the character set @@ -293,7 +303,7 @@ By default renderer classes are assumed to be using the `UTF-8` encoding. To us format = 'txt' charset = 'iso-8859-1' - def render(self, data, media_type=None, renderer_context=None): + def render(self, data, accepted_media_type=None, renderer_context=None): return data.encode(self.charset) Note that if a renderer class returns a unicode string, then the response content will be coerced into a bytestring by the `Response` class, with the `charset` attribute set on the renderer used to determine the encoding. @@ -308,7 +318,7 @@ In some cases you may also want to set the `render_style` attribute to `'binary' charset = None render_style = 'binary' - def render(self, data, media_type=None, renderer_context=None): + def render(self, data, accepted_media_type=None, renderer_context=None): return data --- @@ -322,7 +332,7 @@ You can do some pretty flexible things using REST framework's renderers. Some e * Specify multiple types of HTML representation for API clients to use. * Underspecify a renderer's media type, such as using `media_type = 'image/*'`, and use the `Accept` header to vary the encoding of the response. -## Varying behaviour by media type +## Varying behavior by media type In some cases you might want your view to use different serialization styles depending on the accepted media type. If you need to do this you can access `request.accepted_renderer` to determine the negotiated renderer that will be used for the response. @@ -460,15 +470,15 @@ Modify your REST framework settings. [MessagePack][messagepack] is a fast, efficient binary serialization format. [Juan Riaza][juanriaza] maintains the [djangorestframework-msgpack][djangorestframework-msgpack] package which provides MessagePack renderer and parser support for REST framework. -## XLSX (Binary Spreadsheet Endpoints) +## Microsoft Excel: XLSX (Binary Spreadsheet Endpoints) -XLSX is the world's most popular binary spreadsheet format. [Tim Allen][flipperpa] of [The Wharton School][wharton] maintains [drf-renderer-xlsx][drf-renderer-xlsx], which renders an endpoint as an XLSX spreadsheet using OpenPyXL, and allows the client to download it. Spreadsheets can be styled on a per-view basis. +XLSX is the world's most popular binary spreadsheet format. [Tim Allen][flipperpa] of [The Wharton School][wharton] maintains [drf-excel][drf-excel], which renders an endpoint as an XLSX spreadsheet using OpenPyXL, and allows the client to download it. Spreadsheets can be styled on a per-view basis. #### Installation & configuration Install using pip. - $ pip install drf-renderer-xlsx + $ pip install drf-excel Modify your REST framework settings. @@ -478,15 +488,15 @@ Modify your REST framework settings. 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', - 'drf_renderer_xlsx.renderers.XLSXRenderer', + 'drf_excel.renderers.XLSXRenderer', ], } To avoid having a file streamed without a filename (which the browser will often default to the filename "download", with no extension), we need to use a mixin to override the `Content-Disposition` header. If no filename is provided, it will default to `export.xlsx`. For example: from rest_framework.viewsets import ReadOnlyModelViewSet - from drf_renderer_xlsx.mixins import XLSXFileMixin - from drf_renderer_xlsx.renderers import XLSXRenderer + from drf_excel.mixins import XLSXFileMixin + from drf_excel.renderers import XLSXRenderer from .models import MyExampleModel from .serializers import MyExampleSerializer @@ -518,7 +528,7 @@ Comma-separated values are a plain-text tabular data format, that can be easily [Rest Framework Latex] provides a renderer that outputs PDFs using Laulatex. It is maintained by [Pebble (S/F Software)][mypebble]. -[cite]: https://docs.djangoproject.com/en/stable/stable/template-response/#the-rendering-process +[cite]: https://docs.djangoproject.com/en/stable/ref/template-response/#the-rendering-process [conneg]: content-negotiation.md [html-and-forms]: ../topics/html-and-forms.md [browser-accept-headers]: http://www.gethifi.com/blog/browser-rest-http-accept-headers @@ -539,7 +549,7 @@ Comma-separated values are a plain-text tabular data format, that can be easily [mjumbewu]: https://github.com/mjumbewu [flipperpa]: https://github.com/flipperpa [wharton]: https://github.com/wharton -[drf-renderer-xlsx]: https://github.com/wharton/drf-renderer-xlsx +[drf-excel]: https://github.com/wharton/drf-excel [vbabiy]: https://github.com/vbabiy [rest-framework-yaml]: https://jpadilla.github.io/django-rest-framework-yaml/ [rest-framework-xml]: https://jpadilla.github.io/django-rest-framework-xml/ diff --git a/docs/api-guide/requests.md b/docs/api-guide/requests.md index 1c336953c..d072ac436 100644 --- a/docs/api-guide/requests.md +++ b/docs/api-guide/requests.md @@ -23,7 +23,7 @@ REST framework's Request objects provide flexible request parsing that allows yo * It includes all parsed content, including *file and non-file* inputs. * It supports parsing the content of HTTP methods other than `POST`, meaning that you can access the content of `PUT` and `PATCH` requests. -* It supports REST framework's flexible request parsing, rather than just supporting form data. For example you can handle incoming JSON data in the same way that you handle incoming form data. +* It supports REST framework's flexible request parsing, rather than just supporting form data. For example you can handle incoming [JSON data] similarly to how you handle incoming [form data]. For more details see the [parsers documentation]. @@ -49,7 +49,7 @@ If a client sends a request with a content-type that cannot be parsed then a `Un # Content negotiation -The request exposes some properties that allow you to determine the result of the content negotiation stage. This allows you to implement behaviour such as selecting a different serialization schemes for different media types. +The request exposes some properties that allow you to determine the result of the content negotiation stage. This allows you to implement behavior such as selecting a different serialization schemes for different media types. ## .accepted_renderer @@ -136,5 +136,7 @@ Note that due to implementation reasons the `Request` class does not inherit fro [cite]: https://groups.google.com/d/topic/django-developers/dxI4qVzrBY4/discussion [parsers documentation]: parsers.md +[JSON data]: parsers.md#jsonparser +[form data]: parsers.md#formparser [authentication documentation]: authentication.md [browser enhancements documentation]: ../topics/browser-enhancements.md diff --git a/docs/api-guide/reverse.md b/docs/api-guide/reverse.md index 70df42b8f..82dd16881 100644 --- a/docs/api-guide/reverse.md +++ b/docs/api-guide/reverse.md @@ -32,16 +32,16 @@ You should **include the request as a keyword argument** to the function, for ex from rest_framework.reverse import reverse from rest_framework.views import APIView - from django.utils.timezone import now + from django.utils.timezone import now - class APIRootView(APIView): - def get(self, request): - year = now().year - data = { - ... - 'year-summary-url': reverse('year-summary', args=[year], request=request) + class APIRootView(APIView): + def get(self, request): + year = now().year + data = { + ... + 'year-summary-url': reverse('year-summary', args=[year], request=request) } - return Response(data) + return Response(data) ## reverse_lazy diff --git a/docs/api-guide/routers.md b/docs/api-guide/routers.md index 8d8594eee..70c05fdde 100644 --- a/docs/api-guide/routers.md +++ b/docs/api-guide/routers.md @@ -338,5 +338,5 @@ The [`DRF-extensions` package][drf-extensions] provides [routers][drf-extensions [drf-extensions-nested-viewsets]: https://chibisov.github.io/drf-extensions/docs/#nested-routes [drf-extensions-collection-level-controllers]: https://chibisov.github.io/drf-extensions/docs/#collection-level-controllers [drf-extensions-customizable-endpoint-names]: https://chibisov.github.io/drf-extensions/docs/#controller-endpoint-name -[url-namespace-docs]: https://docs.djangoproject.com/en/1.11/topics/http/urls/#url-namespaces -[include-api-reference]: https://docs.djangoproject.com/en/2.0/ref/urls/#include +[url-namespace-docs]: https://docs.djangoproject.com/en/4.0/topics/http/urls/#url-namespaces +[include-api-reference]: https://docs.djangoproject.com/en/4.0/ref/urls/#include diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index b4832b369..3f0b15530 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -9,6 +9,23 @@ source: > > — Heroku, [JSON Schema for the Heroku Platform API][cite] +--- + +**Deprecation notice:** + +REST framework's built-in support for generating OpenAPI schemas is +**deprecated** in favor of 3rd party packages that can provide this +functionality instead. The built-in support will be moved into a separate +package and then subsequently retired over the next releases. + +As a full-fledged replacement, we recommend the [drf-spectacular] package. +It has extensive support for generating OpenAPI 3 schemas from +REST framework APIs, with both automatic and customisable options available. +For further information please refer to +[Documenting your API](../topics/documenting-your-api.md#drf-spectacular). + +--- + API schemas are a useful tool that allow for a range of use cases, including generating reference documentation, or driving dynamic client libraries that can interact with your API. @@ -122,6 +139,7 @@ The `get_schema_view()` helper takes the following keyword arguments: url='https://www.example.org/api/', patterns=schema_url_patterns, ) +* `public`: May be used to specify if schema should bypass views permissions. Default to False * `generator_class`: May be used to specify a `SchemaGenerator` subclass to be passed to the `SchemaView`. @@ -165,7 +183,7 @@ In order to customize the top-level schema, subclass as an argument to the `generateschema` command or `get_schema_view()` helper function. -### get_schema(self, request) +### get_schema(self, request=None, public=False) Returns a dictionary that represents the OpenAPI schema: @@ -292,7 +310,7 @@ class CustomView(APIView): This saves you having to create a custom subclass per-view for a commonly used option. -Not all `AutoSchema` methods expose related `__init__()` kwargs, but those for +Not all `AutoSchema` methods expose related `__init__()` kwargs, but those for the more commonly needed options do. ### `AutoSchema` methods @@ -300,7 +318,7 @@ the more commonly needed options do. #### `get_components()` Generates the OpenAPI components that describe request and response bodies, -deriving their properties from the serializer. +deriving their properties from the serializer. Returns a dictionary mapping the component name to the generated representation. By default this has just a single pair but you may override @@ -313,6 +331,11 @@ Computes the component's name from the serializer. You may see warnings if your API has duplicate component names. If so you can override `get_component_name()` or pass the `component_name` `__init__()` kwarg (see below) to provide different names. +#### `get_reference()` + +Returns a reference to the serializer component. This may be useful if you override `get_schema()`. + + #### `map_serializer()` Maps serializers to their OpenAPI representations. @@ -375,6 +398,20 @@ operationIds. In order to work around this, you can override `get_operation_id_base()` to provide a different base for name part of the ID. +#### `get_serializer()` + +If the view has implemented `get_serializer()`, returns the result. + +#### `get_request_serializer()` + +By default returns `get_serializer()` but can be overridden to +differentiate between request and response objects. + +#### `get_response_serializer()` + +By default returns `get_serializer()` but can be overridden to +differentiate between request and response objects. + ### `AutoSchema.__init__()` kwargs `AutoSchema` provides a number of `__init__()` kwargs that can be used for @@ -407,6 +444,7 @@ If your views have related customizations that are needed frequently, you can create a base `AutoSchema` subclass for your project that takes additional `__init__()` kwargs to save subclassing `AutoSchema` for each view. +[cite]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api [openapi]: https://github.com/OAI/OpenAPI-Specification [openapi-specification-extensions]: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#specification-extensions [openapi-operation]: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject @@ -417,3 +455,4 @@ create a base `AutoSchema` subclass for your project that takes additional [openapi-generator]: https://github.com/OpenAPITools/openapi-generator [swagger-codegen]: https://github.com/swagger-api/swagger-codegen [info-object]: https://swagger.io/specification/#infoObject +[drf-spectacular]: https://drf-spectacular.readthedocs.io/en/latest/readme.html diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index fd5dbb0e6..0d14cac46 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -116,7 +116,7 @@ Calling `.save()` will either create a new instance, or update an existing insta # .save() will update the existing `comment` instance. serializer = CommentSerializer(comment, data=data) -Both the `.create()` and `.update()` methods are optional. You can implement either neither, one, or both of them, depending on the use-case for your serializer class. +Both the `.create()` and `.update()` methods are optional. You can implement either none, one, or both of them, depending on the use-case for your serializer class. #### Passing additional attributes to `.save()` @@ -282,7 +282,7 @@ If a nested representation may optionally accept the `None` value you should pas content = serializers.CharField(max_length=200) created = serializers.DateTimeField() -Similarly if a nested representation should be a list of items, you should pass the `many=True` flag to the nested serialized. +Similarly if a nested representation should be a list of items, you should pass the `many=True` flag to the nested serializer. class CommentSerializer(serializers.Serializer): user = UserSerializer(required=False) @@ -524,6 +524,7 @@ You can add extra fields to a `ModelSerializer` or override the default fields b class Meta: model = Account + fields = ['url', 'groups'] Extra fields can correspond to any property or callable on the model. @@ -593,15 +594,15 @@ The ModelSerializer class also exposes an API that you can override in order to Normally if a `ModelSerializer` does not generate the fields you need by default then you should either add them to the class explicitly, or simply use a regular `Serializer` class instead. However in some cases you may want to create a new base class that defines how the serializer fields are created for any given model. -### `.serializer_field_mapping` +### `serializer_field_mapping` A mapping of Django model fields to REST framework serializer fields. You can override this mapping to alter the default serializer fields that should be used for each model field. -### `.serializer_related_field` +### `serializer_related_field` This property should be the serializer field class, that is used for relational fields by default. -For `ModelSerializer` this defaults to `PrimaryKeyRelatedField`. +For `ModelSerializer` this defaults to `serializers.PrimaryKeyRelatedField`. For `HyperlinkedModelSerializer` this defaults to `serializers.HyperlinkedRelatedField`. @@ -621,13 +622,13 @@ Defaults to `serializers.ChoiceField` The following methods are called to determine the class and keyword arguments for each field that should be automatically included on the serializer. Each of these methods should return a two tuple of `(field_class, field_kwargs)`. -### `.build_standard_field(self, field_name, model_field)` +### `build_standard_field(self, field_name, model_field)` Called to generate a serializer field that maps to a standard model field. The default implementation returns a serializer class based on the `serializer_field_mapping` attribute. -### `.build_relational_field(self, field_name, relation_info)` +### `build_relational_field(self, field_name, relation_info)` Called to generate a serializer field that maps to a relational model field. @@ -635,7 +636,7 @@ The default implementation returns a serializer class based on the `serializer_r The `relation_info` argument is a named tuple, that contains `model_field`, `related_model`, `to_many` and `has_through_model` properties. -### `.build_nested_field(self, field_name, relation_info, nested_depth)` +### `build_nested_field(self, field_name, relation_info, nested_depth)` Called to generate a serializer field that maps to a relational model field, when the `depth` option has been set. @@ -645,17 +646,17 @@ The `nested_depth` will be the value of the `depth` option, minus one. The `relation_info` argument is a named tuple, that contains `model_field`, `related_model`, `to_many` and `has_through_model` properties. -### `.build_property_field(self, field_name, model_class)` +### `build_property_field(self, field_name, model_class)` Called to generate a serializer field that maps to a property or zero-argument method on the model class. The default implementation returns a `ReadOnlyField` class. -### `.build_url_field(self, field_name, model_class)` +### `build_url_field(self, field_name, model_class)` Called to generate a serializer field for the serializer's own `url` field. The default implementation returns a `HyperlinkedIdentityField` class. -### `.build_unknown_field(self, field_name, model_class)` +### `build_unknown_field(self, field_name, model_class)` Called when the field name did not map to any model field or model property. The default implementation raises an error, although subclasses may customize this behavior. @@ -755,6 +756,14 @@ The following argument can also be passed to a `ListSerializer` field or a seria This is `True` by default, but can be set to `False` if you want to disallow empty lists as valid input. +### `max_length` + +This is `None` by default, but can be set to a positive integer if you want to validates that the list contains no more than this number of elements. + +### `min_length` + +This is `None` by default, but can be set to a positive integer if you want to validates that the list contains no fewer than this number of elements. + ### Customizing `ListSerializer` behavior There *are* a few use cases when you might want to customize the `ListSerializer` behavior. For example: @@ -877,7 +886,7 @@ Because this class provides the same interface as the `Serializer` class, you ca The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input. -##### Read-only `BaseSerializer` classes +#### Read-only `BaseSerializer` classes To implement a read-only serializer using the `BaseSerializer` class, we just need to override the `.to_representation()` method. Let's take a look at an example using a simple Django model: @@ -901,7 +910,7 @@ We can now use this class to serialize single `HighScore` instances: def high_score(request, pk): instance = HighScore.objects.get(pk=pk) serializer = HighScoreSerializer(instance) - return Response(serializer.data) + return Response(serializer.data) Or use it to serialize multiple instances: @@ -909,9 +918,9 @@ Or use it to serialize multiple instances: def all_high_scores(request): queryset = HighScore.objects.order_by('-score') serializer = HighScoreSerializer(queryset, many=True) - return Response(serializer.data) + return Response(serializer.data) -##### Read-write `BaseSerializer` classes +#### Read-write `BaseSerializer` classes To create a read-write serializer we first need to implement a `.to_internal_value()` method. This method returns the validated values that will be used to construct the object instance, and may raise a `serializers.ValidationError` if the supplied data is in an incorrect format. @@ -940,8 +949,8 @@ Here's a complete example of our previous `HighScoreSerializer`, that's been upd 'player_name': 'May not be more than 10 characters.' }) - # Return the validated values. This will be available as - # the `.validated_data` property. + # Return the validated values. This will be available as + # the `.validated_data` property. return { 'score': int(score), 'player_name': player_name @@ -960,7 +969,7 @@ Here's a complete example of our previous `HighScoreSerializer`, that's been upd The `BaseSerializer` class is also useful if you want to implement new generic serializer classes for dealing with particular serialization styles, or for integrating with alternative storage backends. -The following class is an example of a generic serializer that can handle coercing arbitrary objects into primitive representations. +The following class is an example of a generic serializer that can handle coercing arbitrary complex objects into primitive representations. class ObjectSerializer(serializers.BaseSerializer): """ @@ -1012,7 +1021,7 @@ Some reasons this might be useful include... The signatures for these methods are as follows: -#### `.to_representation(self, instance)` +#### `to_representation(self, instance)` Takes the object instance that requires serialization, and should return a primitive representation. Typically this means returning a structure of built-in Python datatypes. The exact types that can be handled will depend on the render classes you have configured for your API. @@ -1024,7 +1033,7 @@ May be overridden in order to modify the representation style. For example: ret['username'] = ret['username'].lower() return ret -#### ``.to_internal_value(self, data)`` +#### ``to_internal_value(self, data)`` Takes the unvalidated incoming data as input and should return the validated data that will be made available as `serializer.validated_data`. The return value will also be passed to the `.create()` or `.update()` methods if `.save()` is called on the serializer class. @@ -1087,7 +1096,7 @@ For example, if you wanted to be able to set which fields should be used by a se fields = kwargs.pop('fields', None) # Instantiate the superclass normally - super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if fields is not None: # Drop any fields that are not specified in the `fields` argument. @@ -1180,7 +1189,7 @@ The [drf-writable-nested][drf-writable-nested] package provides writable nested ## DRF Encrypt Content -The [drf-encrypt-content][drf-encrypt-content] package helps you encrypt your data, serialized through ModelSerializer. It also contains some helper functions. Which helps you to encrypt your data. +The [drf-encrypt-content][drf-encrypt-content] package helps you encrypt your data, serialized through ModelSerializer. It also contains some helper functions. Which helps you to encrypt your data. [cite]: https://groups.google.com/d/topic/django-users/sVFaOfQi4wY/discussion diff --git a/docs/api-guide/status-codes.md b/docs/api-guide/status-codes.md index a37ba15d4..fb2f9bf13 100644 --- a/docs/api-guide/status-codes.md +++ b/docs/api-guide/status-codes.md @@ -41,6 +41,8 @@ This class of status code indicates a provisional response. There are no 1xx st HTTP_100_CONTINUE HTTP_101_SWITCHING_PROTOCOLS + HTTP_102_PROCESSING + HTTP_103_EARLY_HINTS ## Successful - 2xx @@ -93,9 +95,11 @@ The 4xx class of status code is intended for cases in which the client seems to HTTP_415_UNSUPPORTED_MEDIA_TYPE HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE HTTP_417_EXPECTATION_FAILED + HTTP_421_MISDIRECTED_REQUEST HTTP_422_UNPROCESSABLE_ENTITY HTTP_423_LOCKED HTTP_424_FAILED_DEPENDENCY + HTTP_425_TOO_EARLY HTTP_426_UPGRADE_REQUIRED HTTP_428_PRECONDITION_REQUIRED HTTP_429_TOO_MANY_REQUESTS diff --git a/docs/api-guide/testing.md b/docs/api-guide/testing.md index 73de68a76..261df80f2 100644 --- a/docs/api-guide/testing.md +++ b/docs/api-guide/testing.md @@ -234,7 +234,7 @@ If you're using `SessionAuthentication` then you'll need to include a CSRF token for any `POST`, `PUT`, `PATCH` or `DELETE` requests. You can do so by following the same flow that a JavaScript based client would use. -First make a `GET` request in order to obtain a CRSF token, then present that +First, make a `GET` request in order to obtain a CSRF token, then present that token in the following request. For example... @@ -259,7 +259,7 @@ With careful usage both the `RequestsClient` and the `CoreAPIClient` provide the ability to write test cases that can run either in development, or be run directly against your staging server or production environment. -Using this style to create basic tests of a few core piece of functionality is +Using this style to create basic tests of a few core pieces of functionality is a powerful way to validate your live service. Doing so may require some careful attention to setup and teardown to ensure that the tests run in a way that they do not directly affect customer data. @@ -299,7 +299,7 @@ similar way as with `RequestsClient`. # API Test cases -REST framework includes the following test case classes, that mirror the existing Django test case classes, but use `APIClient` instead of Django's default `Client`. +REST framework includes the following test case classes, that mirror the existing [Django's test case classes][provided_test_case_classes], but use `APIClient` instead of Django's default `Client`. * `APISimpleTestCase` * `APITransactionTestCase` @@ -413,5 +413,6 @@ For example, to add support for using `format='html'` in test requests, you migh [client]: https://docs.djangoproject.com/en/stable/topics/testing/tools/#the-test-client [requestfactory]: https://docs.djangoproject.com/en/stable/topics/testing/advanced/#django.test.client.RequestFactory [configuration]: #configuration -[refresh_from_db_docs]: https://docs.djangoproject.com/en/1.11/ref/models/instances/#django.db.models.Model.refresh_from_db +[refresh_from_db_docs]: https://docs.djangoproject.com/en/stable/ref/models/instances/#django.db.models.Model.refresh_from_db [session_objects]: https://requests.readthedocs.io/en/master/user/advanced/#session-objects +[provided_test_case_classes]: https://docs.djangoproject.com/en/stable/topics/testing/tools/#provided-test-case-classes diff --git a/docs/api-guide/throttling.md b/docs/api-guide/throttling.md index 215c735bf..4c58fa713 100644 --- a/docs/api-guide/throttling.md +++ b/docs/api-guide/throttling.md @@ -19,6 +19,10 @@ Multiple throttles can also be used if you want to impose both burst throttling Throttles do not necessarily only refer to rate-limiting requests. For example a storage service might also need to throttle against bandwidth, and a paid data service might want to throttle against a certain number of a records being accessed. +**The application-level throttling that REST framework provides should not be considered a security measure or protection against brute forcing or denial-of-service attacks. Deliberately malicious actors will always be able to spoof IP origins. In addition to this, the built-in throttling implementations are implemented using Django's cache framework, and use non-atomic operations to determine the request rate, which may sometimes result in some fuzziness. + +The application-level throttling provided by REST framework is intended for implementing policies such as different business tiers and basic protections against service over-use.** + ## How throttling is determined As with permissions and authentication, throttling in REST framework is always defined as a list of classes. @@ -46,9 +50,9 @@ The rate descriptions used in `DEFAULT_THROTTLE_RATES` may include `second`, `mi You can also set the throttling policy on a per-view or per-viewset basis, using the `APIView` class-based views. - from rest_framework.response import Response + from rest_framework.response import Response from rest_framework.throttling import UserRateThrottle - from rest_framework.views import APIView + from rest_framework.views import APIView class ExampleView(APIView): throttle_classes = [UserRateThrottle] @@ -59,7 +63,7 @@ using the `APIView` class-based views. } return Response(content) -Or, if you're using the `@api_view` decorator with function based views. +If you're using the `@api_view` decorator with function based views you can use the following decorator. @api_view(['GET']) @throttle_classes([UserRateThrottle]) @@ -69,7 +73,17 @@ Or, if you're using the `@api_view` decorator with function based views. } return Response(content) -## How clients are identified +It's also possible to set throttle classes for routes that are created using the `@action` decorator. +Throttle classes set in this way will override any viewset level class settings. + + @action(detail=True, methods=["post"], throttle_classes=[UserRateThrottle]) + def example_adhoc_method(request, pk=None): + content = { + 'status': 'request was permitted' + } + return Response(content) + +## How clients are identified The `X-Forwarded-For` HTTP header and `REMOTE_ADDR` WSGI variable are used to uniquely identify client IP addresses for throttling. If the `X-Forwarded-For` header is present then it will be used, otherwise the value of the `REMOTE_ADDR` variable from the WSGI environment will be used. @@ -92,6 +106,12 @@ If you need to use a cache other than `'default'`, you can do so by creating a c You'll need to remember to also set your custom throttle class in the `'DEFAULT_THROTTLE_CLASSES'` settings key, or using the `throttle_classes` view attribute. +## A note on concurrency + +The built-in throttle implementations are open to [race conditions][race], so under high concurrency they may allow a few extra requests through. + +If your project relies on guaranteeing the number of requests during concurrent requests, you will need to implement your own throttle class. See [issue #5181][gh5181] for more details. + --- # API Reference @@ -200,3 +220,5 @@ The following is an example of a rate throttle, that will randomly throttle 1 in [identifying-clients]: http://oxpedia.org/wiki/index.php?title=AppSuite:Grizzly#Multiple_Proxies_in_front_of_the_cluster [cache-setting]: https://docs.djangoproject.com/en/stable/ref/settings/#caches [cache-docs]: https://docs.djangoproject.com/en/stable/topics/cache/#setting-up-the-cache +[gh5181]: https://github.com/encode/django-rest-framework/issues/5181 +[race]: https://en.wikipedia.org/wiki/Race_condition#Data_race diff --git a/docs/api-guide/validators.md b/docs/api-guide/validators.md index 4451489d4..bb8466a2c 100644 --- a/docs/api-guide/validators.md +++ b/docs/api-guide/validators.md @@ -20,7 +20,7 @@ Validation in Django REST framework serializers is handled a little differently With `ModelForm` the validation is performed partially on the form, and partially on the model instance. With REST framework the validation is performed entirely on the serializer class. This is advantageous for the following reasons: * It introduces a proper separation of concerns, making your code behavior more obvious. -* It is easy to switch between using shortcut `ModelSerializer` classes and using explicit `Serializer` classes. Any validation behavior being used for `ModelSerializer` is simple to replicate. +* It is easy to switch between using shortcut `ModelSerializer` classes and using explicit `Serializer` classes. Any validation behavior being used for `ModelSerializer` is simple to replicate. * Printing the `repr` of a serializer instance will show you exactly what validation rules it applies. There's no extra hidden validation behavior being called on the model instance. When you're using `ModelSerializer` all of this is handled automatically for you. If you want to drop down to using `Serializer` classes instead, then you need to define the validation rules explicitly. @@ -208,7 +208,7 @@ by specifying an empty list for the serializer `Meta.validators` attribute. By default "unique together" validation enforces that all fields be `required=True`. In some cases, you might want to explicit apply -`required=False` to one of the fields, in which case the desired behaviour +`required=False` to one of the fields, in which case the desired behavior of the validation is ambiguous. In this case you will typically need to exclude the validator from the @@ -238,7 +238,7 @@ In the case of update operations on *nested* serializers there's no way of applying this exclusion, because the instance is not available. Again, you'll probably want to explicitly remove the validator from the -serializer class, and write the code the for the validation constraint +serializer class, and write the code for the validation constraint explicitly, in a `.validate()` method, or in the view. ## Debugging complex cases diff --git a/docs/api-guide/views.md b/docs/api-guide/views.md index 2224c1f3a..b293de75a 100644 --- a/docs/api-guide/views.md +++ b/docs/api-guide/views.md @@ -145,6 +145,7 @@ REST framework also allows you to work with regular function based views. It pr The core of this functionality is the `api_view` decorator, which takes a list of HTTP methods that your view should respond to. For example, this is how you would write a very simple view that just manually returns some data: from rest_framework.decorators import api_view + from rest_framework.response import Response @api_view() def hello_world(request): @@ -152,7 +153,7 @@ The core of this functionality is the `api_view` decorator, which takes a list o This view will use the default renderers, parsers, authentication classes etc specified in the [settings]. -By default only `GET` methods will be accepted. Other methods will respond with "405 Method Not Allowed". To alter this behaviour, specify which methods the view allows, like so: +By default only `GET` methods will be accepted. Other methods will respond with "405 Method Not Allowed". To alter this behavior, specify which methods the view allows, like so: @api_view(['GET', 'POST']) def hello_world(request): diff --git a/docs/api-guide/viewsets.md b/docs/api-guide/viewsets.md index d7aa7ad3b..5d5491a83 100644 --- a/docs/api-guide/viewsets.md +++ b/docs/api-guide/viewsets.md @@ -116,7 +116,7 @@ During dispatch, the following attributes are available on the `ViewSet`. * `name` - the display name for the viewset. This argument is mutually exclusive to `suffix`. * `description` - the display description for the individual view of a viewset. -You may inspect these attributes to adjust behaviour based on the current action. For example, you could restrict permissions to everything except the `list` action similar to this: +You may inspect these attributes to adjust behavior based on the current action. For example, you could restrict permissions to everything except the `list` action similar to this: def get_permissions(self): """ @@ -125,7 +125,7 @@ You may inspect these attributes to adjust behaviour based on the current action if self.action == 'list': permission_classes = [IsAuthenticated] else: - permission_classes = [IsAdmin] + permission_classes = [IsAdminUser] return [permission() for permission in permission_classes] ## Marking extra actions for routing @@ -152,7 +152,7 @@ A more complete example of extra actions: user = self.get_object() serializer = PasswordSerializer(data=request.data) if serializer.is_valid(): - user.set_password(serializer.data['password']) + user.set_password(serializer.validated_data['password']) user.save() return Response({'status': 'password set'}) else: @@ -171,11 +171,6 @@ A more complete example of extra actions: serializer = self.get_serializer(recent_users, many=True) return Response(serializer.data) -The decorator can additionally take extra arguments that will be set for the routed view only. For example: - - @action(detail=True, methods=['post'], permission_classes=[IsAdminOrIsSelf]) - def set_password(self, request, pk=None): - ... The `action` decorator will route `GET` requests by default, but may also accept other HTTP methods by setting the `methods` argument. For example: @@ -183,7 +178,14 @@ The `action` decorator will route `GET` requests by default, but may also accept def unset_password(self, request, pk=None): ... -The two new actions will then be available at the urls `^users/{pk}/set_password/$` and `^users/{pk}/unset_password/$` + +The decorator allows you to override any viewset-level configuration such as `permission_classes`, `serializer_class`, `filter_backends`...: + + @action(detail=True, methods=['post'], permission_classes=[IsAdminOrIsSelf]) + def set_password(self, request, pk=None): + ... + +The two new actions will then be available at the urls `^users/{pk}/set_password/$` and `^users/{pk}/unset_password/$`. Use the `url_path` and `url_name` parameters to change the URL segment and the reverse URL name of the action. To view all extra actions, call the `.get_extra_actions()` method. @@ -245,7 +247,7 @@ In order to use a `GenericViewSet` class you'll override the class and either mi The `ModelViewSet` class inherits from `GenericAPIView` and includes implementations for various actions, by mixing in the behavior of the various mixin classes. -The actions provided by the `ModelViewSet` class are `.list()`, `.retrieve()`, `.create()`, `.update()`, `.partial_update()`, and `.destroy()`. +The actions provided by the `ModelViewSet` class are `.list()`, `.retrieve()`, `.create()`, `.update()`, `.partial_update()`, and `.destroy()`. #### Example diff --git a/docs/community/3.0-announcement.md b/docs/community/3.0-announcement.md index b9461defe..0cb79fc2e 100644 --- a/docs/community/3.0-announcement.md +++ b/docs/community/3.0-announcement.md @@ -24,7 +24,7 @@ Notable features of this new release include: * Support for overriding how validation errors are handled by your API. * A metadata API that allows you to customize how `OPTIONS` requests are handled by your API. * A more compact JSON output with unicode style encoding turned on by default. -* Templated based HTML form rendering for serializers. This will be finalized as public API in the upcoming 3.1 release. +* Templated based HTML form rendering for serializers. This will be finalized as public API in the upcoming 3.1 release. Significant new functionality continues to be planned for the 3.1 and 3.2 releases. These releases will correspond to the two [Kickstarter stretch goals](https://www.kickstarter.com/projects/tomchristie/django-rest-framework-3) - "Feature improvements" and "Admin interface". Further 3.x releases will present simple upgrades, without the same level of fundamental API changes necessary for the 3.0 release. @@ -632,7 +632,7 @@ The `MultipleChoiceField` class has been added. This field acts like `ChoiceFiel The `from_native(self, value)` and `to_native(self, data)` method names have been replaced with the more obviously named `to_internal_value(self, data)` and `to_representation(self, value)`. -The `field_from_native()` and `field_to_native()` methods are removed. Previously you could use these methods if you wanted to customise the behaviour in a way that did not simply lookup the field value from the object. For example... +The `field_from_native()` and `field_to_native()` methods are removed. Previously you could use these methods if you wanted to customise the behavior in a way that did not simply lookup the field value from the object. For example... def field_to_native(self, obj, field_name): """A custom read-only field that returns the class name.""" diff --git a/docs/community/3.10-announcement.md b/docs/community/3.10-announcement.md index 19748aa40..23b6330a7 100644 --- a/docs/community/3.10-announcement.md +++ b/docs/community/3.10-announcement.md @@ -142,6 +142,6 @@ continued development by **[signing up for a paid plan][funding]**. *Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), [ESG](https://software.esg-usa.com/), [Rollbar](https://rollbar.com/?utm_source=django&utm_medium=sponsorship&utm_campaign=freetrial), [Cadre](https://cadre.com), [Kloudless](https://hubs.ly/H0f30Lf0), and [Lights On Software](https://lightsonsoftware.com).* -[legacy-core-api-docs]:https://github.com/encode/django-rest-framework/blob/master/docs/coreapi/index.md +[legacy-core-api-docs]:https://github.com/encode/django-rest-framework/blob/3.14.0/docs/coreapi/index.md [sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors [funding]: funding.md diff --git a/docs/community/3.12-announcement.md b/docs/community/3.12-announcement.md index 9d2220933..4a589e39c 100644 --- a/docs/community/3.12-announcement.md +++ b/docs/community/3.12-announcement.md @@ -30,12 +30,12 @@ in the URL path. For example... -Method | Path | Tags +Method | Path | Tags --------------------------------|-----------------|------------- -`GET`, `PUT`, `PATCH`, `DELETE` | `/users/{id}/` | `['users']` -`GET`, `POST` | `/users/` | `['users']` -`GET`, `PUT`, `PATCH`, `DELETE` | `/orders/{id}/` | `['orders']` -`GET`, `POST` | `/orders/` | `['orders']` +`GET`, `PUT`, `PATCH`, `DELETE` | `/users/{id}/` | `['users']` +`GET`, `POST` | `/users/` | `['users']` +`GET`, `PUT`, `PATCH`, `DELETE` | `/orders/{id}/` | `['orders']` +`GET`, `POST` | `/orders/` | `['orders']` The tags used for a particular view may also be overridden... diff --git a/docs/community/3.13-announcement.md b/docs/community/3.13-announcement.md new file mode 100644 index 000000000..e2c1fefa6 --- /dev/null +++ b/docs/community/3.13-announcement.md @@ -0,0 +1,55 @@ + + +# Django REST framework 3.13 + +## Django 4.0 support + +The latest release now fully supports Django 4.0. + +Our requirements are now: + +* Python 3.6+ +* Django 4.0, 3.2, 3.1, 2.2 (LTS) + +## Fields arguments are now keyword-only + +When instantiating fields on serializers, you should always use keyword arguments, +such as `serializers.CharField(max_length=200)`. This has always been the case, +and all the examples that we have in the documentation use keyword arguments, +rather than positional arguments. + +From REST framework 3.13 onwards, this is now *explicitly enforced*. + +The most feasible cases where users might be accidentally omitting the keyword arguments +are likely in the composite fields, `ListField` and `DictField`. For instance... + +```python +aliases = serializers.ListField(serializers.CharField()) +``` + +They must now use the more explicit keyword argument style... + +```python +aliases = serializers.ListField(child=serializers.CharField()) +``` + +This change has been made because using positional arguments here *does not* result in the expected behaviour. + +See Pull Request [#7632](https://github.com/encode/django-rest-framework/pull/7632) for more details. diff --git a/docs/community/3.14-announcement.md b/docs/community/3.14-announcement.md new file mode 100644 index 000000000..0543d0d6d --- /dev/null +++ b/docs/community/3.14-announcement.md @@ -0,0 +1,62 @@ + + +# Django REST framework 3.14 + +## Django 4.1 support + +The latest release now fully supports Django 4.1, and drops support for Django 2.2. + +Our requirements are now: + +* Python 3.6+ +* Django 4.1, 4.0, 3.2, 3.1, 3.0 + +## `raise_exceptions` argument for `is_valid` is now keyword-only. + +Calling `serializer_instance.is_valid(True)` is no longer acceptable syntax. +If you'd like to use the `raise_exceptions` argument, you must use it as a +keyword argument. + +See Pull Request [#7952](https://github.com/encode/django-rest-framework/pull/7952) for more details. + +## `ManyRelatedField` supports returning the default when the source attribute doesn't exist. + +Previously, if you used a serializer field with `many=True` with a dot notated source field +that didn't exist, it would raise an `AttributeError`. Now it will return the default or be +skipped depending on the other arguments. + +See Pull Request [#7574](https://github.com/encode/django-rest-framework/pull/7574) for more details. + + +## Make Open API `get_reference` public. + +Returns a reference to the serializer component. This may be useful if you override `get_schema()`. + +## Change semantic of OR of two permission classes. + +When OR-ing two permissions, the request has to pass either class's `has_permission() and has_object_permission()`. + +Previously, both class's `has_permission()` was ignored when OR-ing two permissions together. + +See Pull Request [#7522](https://github.com/encode/django-rest-framework/pull/7522) for more details. + +## Minor fixes and improvements + +There are a number of minor fixes and improvements in this release. See the [release notes](release-notes.md) page for a complete listing. diff --git a/docs/community/3.2-announcement.md b/docs/community/3.2-announcement.md index a66ad5d29..eda4071b2 100644 --- a/docs/community/3.2-announcement.md +++ b/docs/community/3.2-announcement.md @@ -64,7 +64,7 @@ These are a little subtle and probably won't affect most users, but are worth un ### ManyToMany fields and blank=True -We've now added an `allow_empty` argument, which can be used with `ListSerializer`, or with `many=True` relationships. This is `True` by default, but can be set to `False` if you want to disallow empty lists as valid input. +We've now added an `allow_empty` argument, which can be used with `ListSerializer`, or with `many=True` relationships. This is `True` by default, but can be set to `False` if you want to disallow empty lists as valid input. As a follow-up to this we are now able to properly mirror the behavior of Django's `ModelForm` with respect to how many-to-many fields are validated. diff --git a/docs/community/3.3-announcement.md b/docs/community/3.3-announcement.md index 5dcbe3b3b..24f493dcd 100644 --- a/docs/community/3.3-announcement.md +++ b/docs/community/3.3-announcement.md @@ -38,7 +38,7 @@ The AJAX based support for the browsable API means that there are a number of in * To support form based `PUT` and `DELETE`, or to support form content types such as JSON, you should now use the [AJAX forms][ajax-form] javascript library. This replaces the previous 'method and content type overloading' that required significant internal complexity to the request class. * The `accept` query parameter is no longer supported by the default content negotiation class. If you require it then you'll need to [use a custom content negotiation class][accept-headers]. -* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware][method-override]. +* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware][method-override]. The following pagination view attributes and settings have been moved into attributes on the pagination class since 3.1. Their usage was formerly deprecated, and has now been removed entirely, in line with the deprecation policy. diff --git a/docs/community/3.4-announcement.md b/docs/community/3.4-announcement.md index 67192ecbb..2954b36b8 100644 --- a/docs/community/3.4-announcement.md +++ b/docs/community/3.4-announcement.md @@ -89,7 +89,7 @@ Name | Support | PyPI pa ---------------------------------|-------------------------------------|-------------------------------- [Core JSON][core-json] | Schema generation & client support. | Built-in support in `coreapi`. [Swagger / OpenAPI][swagger] | Schema generation & client support. | The `openapi-codec` package. -[JSON Hyper-Schema][hyperschema] | Currently client support only. | The `hyperschema-codec` package. +[JSON Hyper-Schema][hyperschema] | Currently client support only. | The `hyperschema-codec` package. [API Blueprint][api-blueprint] | Not yet available. | Not yet available. --- @@ -187,7 +187,7 @@ The full set of itemized release notes [are available here][release-notes]. [api-blueprint]: https://apiblueprint.org/ [tut-7]: ../tutorial/7-schemas-and-client-libraries/ [schema-generation]: ../api-guide/schemas/ -[api-clients]: ../topics/api-clients.md +[api-clients]: https://github.com/encode/django-rest-framework/blob/3.14.0/docs/topics/api-clients.md [milestone]: https://github.com/encode/django-rest-framework/milestone/35 [release-notes]: release-notes#34 [metadata]: ../api-guide/metadata/#custom-metadata-classes diff --git a/docs/community/3.6-announcement.md b/docs/community/3.6-announcement.md index 35704eb58..9e45473ee 100644 --- a/docs/community/3.6-announcement.md +++ b/docs/community/3.6-announcement.md @@ -195,5 +195,5 @@ on realtime support, for the 3.7 release. [sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors [funding]: funding.md [api-docs]: ../topics/documenting-your-api.md -[js-docs]: ../topics/api-clients.md#javascript-client-library -[py-docs]: ../topics/api-clients.md#python-client-library +[js-docs]: https://github.com/encode/django-rest-framework/blob/3.14.0/docs/topics/api-clients.md#javascript-client-library +[py-docs]: https://github.com/encode/django-rest-framework/blob/3.14.0/docs/topics/api-clients.md#python-client-library diff --git a/docs/community/3.8-announcement.md b/docs/community/3.8-announcement.md index 507299782..f33b220fd 100644 --- a/docs/community/3.8-announcement.md +++ b/docs/community/3.8-announcement.md @@ -89,7 +89,7 @@ for a complete listing. We're currently working towards moving to using [OpenAPI][openapi] as our default schema output. We'll also be revisiting our API documentation generation and client libraries. -We're doing some consolidation in order to make this happen. It's planned that 3.9 will drop the `coreapi` and `coreschema` libraries, and instead use `apistar` for the API documentation generation, schema generation, and API client libraries. +We're doing some consolidation in order to make this happen. It's planned that 3.9 will drop the `coreapi` and `coreschema` libraries, and instead use `apistar` for the API documentation generation, schema generation, and API client libraries. [funding]: funding.md [gh5886]: https://github.com/encode/django-rest-framework/issues/5886 diff --git a/docs/community/3.9-announcement.md b/docs/community/3.9-announcement.md index fee6e6909..d673fdd18 100644 --- a/docs/community/3.9-announcement.md +++ b/docs/community/3.9-announcement.md @@ -110,7 +110,7 @@ You can now compose permission classes using the and/or operators, `&` and `|`. For example... ```python -permission_classes = [IsAuthenticated & (ReadOnly | IsAdmin)] +permission_classes = [IsAuthenticated & (ReadOnly | IsAdminUser)] ``` If you're using custom permission classes then make sure that you are subclassing diff --git a/docs/community/contributing.md b/docs/community/contributing.md index cb67100d2..994226b97 100644 --- a/docs/community/contributing.md +++ b/docs/community/contributing.md @@ -6,6 +6,12 @@ There are many ways you can contribute to Django REST framework. We'd like it to be a community-led project, so please get involved and help shape the future of the project. +--- + +**Note**: At this point in it's lifespan we consider Django REST framework to be essentially feature-complete. We may accept pull requests that track the continued development of Django versions, but would prefer not to accept new features or code formatting changes. + +--- + ## Community The most important thing you can do to help push the REST framework project forward is to be actively involved wherever possible. Code contributions are often overvalued as being the primary way to get involved in a project, we don't believe that needs to be the case. @@ -26,14 +32,13 @@ The [Django code of conduct][code-of-conduct] gives a fuller set of guidelines f # Issues -It's really helpful if you can make sure to address issues on the correct channel. Usage questions should be directed to the [discussion group][google-group]. Feature requests, bug reports and other issues should be raised on the GitHub [issue tracker][issues]. +Our contribution process is that the [GitHub discussions page](https://github.com/encode/django-rest-framework/discussions) should generally be your starting point. Please only raise an issue or pull request if you've been recommended to do so after discussion. -Some tips on good issue reporting: +Some tips on good potential issue reporting: * When describing issues try to phrase your ticket in terms of the *behavior* you think needs changing rather than the *code* you think need changing. -* Search the issue list first for related items, and make sure you're running the latest version of REST framework before reporting an issue. -* If reporting a bug, then try to include a pull request with a failing test case. This will help us quickly identify if there is a valid issue, and make sure that it gets fixed more quickly if there is one. -* Feature requests will often be closed with a recommendation that they be implemented outside of the core REST framework library. Keeping new feature requests implemented as third party libraries allows us to keep down the maintenance overhead of REST framework, so that the focus can be on continued stability, bugfixes, and great documentation. +* Search the GitHub project page for related items, and make sure you're running the latest version of REST framework before reporting an issue. +* Feature requests will often be closed with a recommendation that they be implemented outside of the core REST framework library. Keeping new feature requests implemented as third party libraries allows us to keep down the maintenance overhead of REST framework, so that the focus can be on continued stability, bugfixes, and great documentation. At this point in it's lifespan we consider Django REST framework to be essentially feature-complete. * Closing an issue doesn't necessarily mean the end of a discussion. If you believe your issue has been closed incorrectly, explain why and we'll consider if it needs to be reopened. ## Triaging issues @@ -54,11 +59,19 @@ To start developing on Django REST framework, first create a Fork from the Then clone your fork. The clone command will look like this, with your GitHub username instead of YOUR-USERNAME: - git clone https://github.com/YOUR-USERNAME/Spoon-Knife + git clone https://github.com/YOUR-USERNAME/django-rest-framework See GitHub's [_Fork a Repo_][how-to-fork] Guide for more help. Changes should broadly follow the [PEP 8][pep-8] style conventions, and we recommend you set up your editor to automatically indicate non-conforming styles. +You can check your contributions against these conventions each time you commit using the [pre-commit](https://pre-commit.com/) hooks, which we also run on CI. +To set them up, first ensure you have the pre-commit tool installed, for example: + + python -m pip install pre-commit + +Then run: + + pre-commit install ## Testing @@ -67,7 +80,7 @@ To run the tests, clone the repository, and then: # Setup the virtual environment python3 -m venv env source env/bin/activate - pip install django + pip install -e . pip install -r requirements.txt # Run the tests @@ -79,18 +92,6 @@ Run using a more concise output style. ./runtests.py -q -Run the tests using a more concise output style, no coverage, no flake8. - - ./runtests.py --fast - -Don't run the flake8 code linting. - - ./runtests.py --nolint - -Only run the flake8 code linting, don't run the tests. - - ./runtests.py --lintonly - Run the tests for a given test case. ./runtests.py MyTestCase @@ -123,11 +124,11 @@ GitHub's documentation for working on pull requests is [available here][pull-req Always run the tests before submitting pull requests, and ideally run `tox` in order to check that your modifications are compatible on all supported versions of Python and Django. -Once you've made a pull request take a look at the Travis build status in the GitHub interface and make sure the tests are running as you'd expect. +Once you've made a pull request take a look at the build status in the GitHub interface and make sure the tests are running as you'd expect. -![Travis status][travis-status] +![Build status][build-status] -*Above: Travis build notifications* +*Above: build notifications* ## Managing compatibility issues @@ -210,7 +211,7 @@ If you want to draw attention to a note or warning, use a pair of enclosing line [so-filter]: https://stackexchange.com/filters/66475/rest-framework [issues]: https://github.com/encode/django-rest-framework/issues?state=open [pep-8]: https://www.python.org/dev/peps/pep-0008/ -[travis-status]: ../img/travis-status.png +[build-status]: ../img/build-status.png [pull-requests]: https://help.github.com/articles/using-pull-requests [tox]: https://tox.readthedocs.io/en/latest/ [markdown]: https://daringfireball.net/projects/markdown/basics diff --git a/docs/community/funding.md b/docs/community/funding.md index 662e3d5d9..951833682 100644 --- a/docs/community/funding.md +++ b/docs/community/funding.md @@ -124,7 +124,7 @@ REST framework continues to be open-source and permissively licensed, but we fir ## What funding has enabled so far * The [3.4](https://www.django-rest-framework.org/community/3.4-announcement/) and [3.5](https://www.django-rest-framework.org/community/3.5-announcement/) releases, including schema generation for both Swagger and RAML, a Python client library, a Command Line client, and addressing of a large number of outstanding issues. -* The [3.6](https://www.django-rest-framework.org/community/3.6-announcement/) release, including JavaScript client library, and API documentation, complete with auto-generated code samples. +* The [3.6](https://www.django-rest-framework.org/community/3.6-announcement/) release, including JavaScript client library, and API documentation, complete with auto-generated code samples. * The [3.7 release](https://www.django-rest-framework.org/community/3.7-announcement/), made possible due to our collaborative funding model, focuses on improvements to schema generation and the interactive API documentation. * The recent [3.8 release](https://www.django-rest-framework.org/community/3.8-announcement/). * Tom Christie, the creator of Django REST framework, working on the project full-time. @@ -137,7 +137,7 @@ REST framework continues to be open-source and permissively licensed, but we fir ## What future funding will enable * Realtime API support, using WebSockets. This will consist of documentation and support for using REST framework together with Django Channels, plus integrating WebSocket support into the client libraries. -* Better authentication defaults, possibly bringing JWT & CORs support into the core package. +* Better authentication defaults, possibly bringing JWT & CORS support into the core package. * Securing the community & operations manager position long-term. * Opening up and securing a part-time position to focus on ticket triage and resolution. * Paying for development time on building API client libraries in a range of programming languages. These would be integrated directly into the upcoming API documentation. @@ -154,13 +154,13 @@ Sign up for a paid plan today, and help ensure that REST framework becomes a sus   -> The number one feature of the Python programming language is its community. Such a community is only possible because of the Open Source nature of the language and all the culture that comes from it. Building great Open Source projects require great minds. Given that, we at Vinta are not only proud to sponsor the team behind DRF but we also recognize the ROI that comes from it. +> The number one feature of the Python programming language is its community. Such a community is only possible because of the Open Source nature of the language and all the culture that comes from it. Building great Open Source projects require great minds. Given that, we at Vinta are not only proud to sponsor the team behind DRF but we also recognize the ROI that comes from it. > > — Filipe Ximenes, Vinta Software   -> It's really awesome that this project continues to endure. The code base is top notch and the maintainers are committed to the highest level of quality. +> It's really awesome that this project continues to endure. The code base is top notch and the maintainers are committed to the highest level of quality. DRF is one of the core reasons why Django is top choice among web frameworks today. In my opinion, it sets the standard for rest frameworks for the development community at large. > > — Andrew Conti, Django REST framework user diff --git a/docs/community/jobs.md b/docs/community/jobs.md index 5f3d60b55..aa1c5d4b4 100644 --- a/docs/community/jobs.md +++ b/docs/community/jobs.md @@ -11,11 +11,12 @@ Looking for a new Django REST Framework related role? On this site we provide a * [https://djangojobs.net/jobs/][django-jobs-net] * [https://findwork.dev/django-rest-framework-jobs][findwork-dev] * [https://www.indeed.com/q-Django-jobs.html][indeed-com] -* [https://stackoverflow.com/jobs/developer-jobs-using-django][stackoverflow-com] +* [https://stackoverflow.com/jobs/companies?tl=django][stackoverflow-com] * [https://www.upwork.com/o/jobs/browse/skill/django-framework/][upwork-com] * [https://www.technojobs.co.uk/django-jobs][technobjobs-co-uk] -* [https://remoteok.io/remote-django-jobs][remoteok-io] +* [https://remoteok.com/remote-django-jobs][remoteok-com] * [https://www.remotepython.com/jobs/][remotepython-com] +* [https://www.pyjobs.com/][pyjobs-com] Know of any other great resources for Django REST Framework jobs that are missing in our list? Please [submit a pull request][submit-pr] or [email us][anna-email]. @@ -29,11 +30,12 @@ Wonder how else you can help? One of the best ways you can help Django REST Fram [django-jobs-net]: https://djangojobs.net/jobs/ [findwork-dev]: https://findwork.dev/django-rest-framework-jobs [indeed-com]: https://www.indeed.com/q-Django-jobs.html -[stackoverflow-com]: https://stackoverflow.com/jobs/developer-jobs-using-django +[stackoverflow-com]: https://stackoverflow.com/jobs/companies?tl=django [upwork-com]: https://www.upwork.com/o/jobs/browse/skill/django-framework/ [technobjobs-co-uk]: https://www.technojobs.co.uk/django-jobs -[remoteok-io]: https://remoteok.io/remote-django-jobs +[remoteok-com]: https://remoteok.com/remote-django-jobs [remotepython-com]: https://www.remotepython.com/jobs/ +[pyjobs-com]: https://www.pyjobs.com/ [drf-funding]: https://fund.django-rest-framework.org/topics/funding/ [submit-pr]: https://github.com/encode/django-rest-framework [anna-email]: mailto:anna@django-rest-framework.org diff --git a/docs/community/release-notes.md b/docs/community/release-notes.md index a48888719..887cae3b4 100644 --- a/docs/community/release-notes.md +++ b/docs/community/release-notes.md @@ -34,8 +34,79 @@ You can determine your currently installed version using `pip show`: --- +## 3.14.x series + +### 3.14.0 + +Date: 22nd September 2022 + +* Django 2.2 is no longer supported. [[#8662](https://github.com/encode/django-rest-framework/pull/8662)] +* Django 4.1 compatibility. [[#8591](https://github.com/encode/django-rest-framework/pull/8591)] +* Add `--api-version` CLI option to `generateschema` management command. [[#8663](https://github.com/encode/django-rest-framework/pull/8663)] +* Enforce `is_valid(raise_exception=False)` as a keyword-only argument. [[#7952](https://github.com/encode/django-rest-framework/pull/7952)] +* Stop calling `set_context` on Validators. [[#8589](https://github.com/encode/django-rest-framework/pull/8589)] +* Return `NotImplemented` from `ErrorDetails.__ne__`. [[#8538](https://github.com/encode/django-rest-framework/pull/8538)] +* Don't evaluate `DateTimeField.default_timezone` when a custom timezone is set. [[#8531](https://github.com/encode/django-rest-framework/pull/8531)] +* Make relative URLs clickable in Browseable API. [[#8464](https://github.com/encode/django-rest-framework/pull/8464)] +* Support `ManyRelatedField` falling back to the default value when the attribute specified by dot notation doesn't exist. Matches `ManyRelatedField.get_attribute` to `Field.get_attribute`. [[#7574](https://github.com/encode/django-rest-framework/pull/7574)] +* Make `schemas.openapi.get_reference` public. [[#7515](https://github.com/encode/django-rest-framework/pull/7515)] +* Make `ReturnDict` support `dict` union operators on Python 3.9 and later. [[#8302](https://github.com/encode/django-rest-framework/pull/8302)] +* Update throttling to check if `request.user` is set before checking if the user is authenticated. [[#8370](https://github.com/encode/django-rest-framework/pull/8370)] + +## 3.13.x series + +### 3.13.1 + +Date: 15th December 2021 + +* Revert schema naming changes with function based `@api_view`. [#8297] + +### 3.13.0 + +Date: 13th December 2021 + +* Django 4.0 compatability. [#8178] +* Add `max_length` and `min_length` options to `ListSerializer`. [#8165] +* Add `get_request_serializer` and `get_response_serializer` hooks to `AutoSchema`. [#7424] +* Fix OpenAPI representation of null-able read only fields. [#8116] +* Respect `UNICODE_JSON` setting in API schema outputs. [#7991] +* Fix for `RemoteUserAuthentication`. [#7158] +* Make Field constructors keyword-only. [#7632] + +--- + ## 3.12.x series +### 3.12.4 + +Date: 26th March 2021 + +* Revert use of `deque` instead of `list` for tracking throttling `.history`. (Due to incompatibility with DjangoRedis cache backend. See #7870) [#7872] + +### 3.12.3 + +Date: 25th March 2021 + +* Properly handle ATOMIC_REQUESTS when multiple database configurations are used. [#7739] +* Bypass `COUNT` query when `LimitOffsetPagination` is configured but pagination params are not included on the request. [#6098] +* Respect `allow_null=True` on `DecimalField`. [#7718] +* Allow title cased `"Yes"`/`"No"` values with `BooleanField`. [#7739] +* Add `PageNumberPagination.get_page_number()` method for overriding behavior. [#7652] +* Fixed rendering of timedelta values in OpenAPI schemas, when present as default, min, or max fields. [#7641] +* Render JSONFields with indentation in browsable API forms. [#6243] +* Remove unnecessary database query in admin Token views. [#7852] +* Raise validation errors when bools are passed to `PrimaryKeyRelatedField` fields, instead of casting to ints. [#7597] +* Don't include model properties as automatically generated ordering fields with `OrderingFilter`. [#7609] +* Use `deque` instead of `list` for tracking throttling `.history`. [#7849] + +### 3.12.2 + +Date: 13th October 2020 + +* Fix issue if `rest_framework.authtoken.models` is imported, but `rest_framework.authtoken` is not in INSTALLED_APPS. [#7571] +* Ignore subclasses of BrowsableAPIRenderer in OpenAPI schema. [#7497] +* Narrower exception catching in serilizer fields, to ensure that any errors in broken `get_queryset()` methods are not masked. [#7480] + ### 3.12.1 Date: 28th September 2020 @@ -169,6 +240,8 @@ Date: 28th September 2020 * Don't strict disallow redundant `SerializerMethodField` field name arguments. * Don't render extra actions in browable API if not authenticated. * Strip null characters from search parameters. +* Deprecate the `detail_route` decorator in favor of `action`, which accepts a `detail` bool. Use `@action(detail=True)` instead. [gh6687] +* Deprecate the `list_route` decorator in favor of `action`, which accepts a `detail` bool. Use `@action(detail=False)` instead. [gh6687] ## 3.9.x series @@ -2262,6 +2335,7 @@ For older release notes, [please see the version 2.x documentation][old-release- [gh6680]: https://github.com/encode/django-rest-framework/issues/6680 [gh6317]: https://github.com/encode/django-rest-framework/issues/6317 +[gh6687]: https://github.com/encode/django-rest-framework/issues/6687 [gh6892]: https://github.com/encode/django-rest-framework/issues/6892 diff --git a/docs/community/third-party-packages.md b/docs/community/third-party-packages.md index d4359890d..1a40539da 100644 --- a/docs/community/third-party-packages.md +++ b/docs/community/third-party-packages.md @@ -14,142 +14,9 @@ We aim to make creating third party packages as easy as possible, whilst keeping If you have an idea for a new feature please consider how it may be packaged as a Third Party Package. We're always happy to discuss ideas on the [Mailing List][discussion-group]. -## How to create a Third Party Package +## Creating a Third Party Package -### Creating your package - -You can use [this cookiecutter template][cookiecutter] for creating reusable Django REST Framework packages quickly. Cookiecutter creates projects from project templates. While optional, this cookiecutter template includes best practices from Django REST framework and other packages, as well as a Travis CI configuration, Tox configuration, and a sane setup.py for easy PyPI registration/distribution. - -Note: Let us know if you have an alternate cookiecutter package so we can also link to it. - -#### Running the initial cookiecutter command - -To run the initial cookiecutter command, you'll first need to install the Python `cookiecutter` package. - - $ pip install cookiecutter - -Once `cookiecutter` is installed just run the following to create a new project. - - $ cookiecutter gh:jpadilla/cookiecutter-django-rest-framework - -You'll be prompted for some questions, answer them, then it'll create your Python package in the current working directory based on those values. - - full_name (default is "Your full name here")? Johnny Appleseed - email (default is "you@example.com")? jappleseed@example.com - github_username (default is "yourname")? jappleseed - pypi_project_name (default is "dj-package")? djangorestframework-custom-auth - repo_name (default is "dj-package")? django-rest-framework-custom-auth - app_name (default is "djpackage")? custom_auth - project_short_description (default is "Your project description goes here")? - year (default is "2014")? - version (default is "0.1.0")? - -#### Getting it onto GitHub - -To put your project up on GitHub, you'll need a repository for it to live in. You can create a new repository [here][new-repo]. If you need help, check out the [Create A Repo][create-a-repo] article on GitHub. - - -#### Adding to Travis CI - -We recommend using [Travis CI][travis-ci], a hosted continuous integration service which integrates well with GitHub and is free for public repositories. - -To get started with Travis CI, [sign in][travis-ci] with your GitHub account. Once you're signed in, go to your [profile page][travis-profile] and enable the service hook for the repository you want. - -If you use the cookiecutter template, your project will already contain a `.travis.yml` file which Travis CI will use to build your project and run tests. By default, builds are triggered every time you push to your repository or create Pull Request. - -#### Uploading to PyPI - -Once you've got at least a prototype working and tests running, you should publish it on PyPI to allow others to install it via `pip`. - -You must [register][pypi-register] an account before publishing to PyPI. - -To register your package on PyPI run the following command. - - $ python setup.py register - -If this is the first time publishing to PyPI, you'll be prompted to login. - -Note: Before publishing you'll need to make sure you have the latest pip that supports `wheel` as well as install the `wheel` package. - - $ pip install --upgrade pip - $ pip install wheel - -After this, every time you want to release a new version on PyPI just run the following command. - - $ python setup.py publish - You probably want to also tag the version now: - git tag -a {0} -m 'version 0.1.0' - git push --tags - -After releasing a new version to PyPI, it's always a good idea to tag the version and make available as a GitHub Release. - -We recommend to follow [Semantic Versioning][semver] for your package's versions. - -### Development - -#### Version requirements - -The cookiecutter template assumes a set of supported versions will be provided for Python and Django. Make sure you correctly update your requirements, docs, `tox.ini`, `.travis.yml`, and `setup.py` to match the set of versions you wish to support. - -#### Tests - -The cookiecutter template includes a `runtests.py` which uses the `pytest` package as a test runner. - -Before running, you'll need to install a couple test requirements. - - $ pip install -r requirements.txt - -Once requirements installed, you can run `runtests.py`. - - $ ./runtests.py - -Run using a more concise output style. - - $ ./runtests.py -q - -Run the tests using a more concise output style, no coverage, no flake8. - - $ ./runtests.py --fast - -Don't run the flake8 code linting. - - $ ./runtests.py --nolint - -Only run the flake8 code linting, don't run the tests. - - $ ./runtests.py --lintonly - -Run the tests for a given test case. - - $ ./runtests.py MyTestCase - -Run the tests for a given test method. - - $ ./runtests.py MyTestCase.test_this_method - -Shorter form to run the tests for a given test method. - - $ ./runtests.py test_this_method - -To run your tests against multiple versions of Python as different versions of requirements such as Django we recommend using `tox`. [Tox][tox-docs] is a generic virtualenv management and test command line tool. - -First, install `tox` globally. - - $ pip install tox - -To run `tox`, just simply run: - - $ tox - -To run a particular `tox` environment: - - $ tox -e envlist - -`envlist` is a comma-separated value to that specifies the environments to run tests against. To view a list of all possible test environments, run: - - $ tox -l - -#### Version compatibility +### Version compatibility Sometimes, in order to ensure your code works on various different versions of Django, Python or third party libraries, you'll need to run slightly different code depending on the environment. Any code that branches in this way should be isolated into a `compat.py` module, and should provide a single common interface that the rest of the codebase can use. @@ -187,9 +54,10 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque * [hawkrest][hawkrest] - Provides Hawk HTTP Authorization. * [djangorestframework-httpsignature][djangorestframework-httpsignature] - Provides an easy to use HTTP Signature Authentication mechanism. * [djoser][djoser] - Provides a set of views to handle basic actions such as registration, login, logout, password reset and account activation. -* [django-rest-auth][django-rest-auth] - Provides a set of REST API endpoints for registration, authentication (including social media authentication), password reset, retrieve and update user details, etc. +* [dj-rest-auth][dj-rest-auth] - Provides a set of REST API endpoints for registration, authentication (including social media authentication), password reset, retrieve and update user details, etc. * [drf-oidc-auth][drf-oidc-auth] - Implements OpenID Connect token authentication for DRF. * [drfpasswordless][drfpasswordless] - Adds (Medium, Square Cash inspired) passwordless logins and signups via email and mobile numbers. +* [django-rest-authemail][django-rest-authemail] - Provides a RESTful API for user signup and authentication using email addresses. ### Permissions @@ -214,17 +82,19 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque * [drf-action-serializer][drf-action-serializer] - Serializer providing per-action fields config for use with ViewSets to prevent having to write multiple serializers. * [djangorestframework-dataclasses][djangorestframework-dataclasses] - Serializer providing automatic field generation for Python dataclasses, like the built-in ModelSerializer does for models. * [django-restql][django-restql] - Turn your REST API into a GraphQL like API(It allows clients to control which fields will be sent in a response, uses GraphQL like syntax, supports read and write on both flat and nested fields). +* [graphwrap][graphwrap] - Transform your REST API into a fully compliant GraphQL API with just two lines of code. Leverages [Graphene-Django](https://docs.graphene-python.org/projects/django/en/latest/) to dynamically build, at runtime, a GraphQL ObjectType for each view in your API. ### Serializer fields * [drf-compound-fields][drf-compound-fields] - Provides "compound" serializer fields, such as lists of simple values. -* [django-extra-fields][django-extra-fields] - Provides extra serializer fields. +* [drf-extra-fields][drf-extra-fields] - Provides extra serializer fields. * [django-versatileimagefield][django-versatileimagefield] - Provides a drop-in replacement for Django's stock `ImageField` that makes it easy to serve images in multiple sizes/renditions from a single field. For DRF-specific implementation docs, [click here][django-versatileimagefield-drf-docs]. ### Views * [django-rest-multiple-models][django-rest-multiple-models] - Provides a generic view (and mixin) for sending multiple serialized models and/or querysets via a single API request. * [drf-typed-views][drf-typed-views] - Use Python type annotations to validate/deserialize request parameters. Inspired by API Star, Hug and FastAPI. +* [rest-framework-actions][rest-framework-actions] - Provides control over each action in ViewSets. Serializers per action, method. ### Routers @@ -236,6 +106,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque * [djangorestframework-msgpack][djangorestframework-msgpack] - Provides MessagePack renderer and parser support. * [djangorestframework-jsonapi][djangorestframework-jsonapi] - Provides a parser, renderer, serializers, and other tools to help build an API that is compliant with the jsonapi.org spec. * [djangorestframework-camel-case][djangorestframework-camel-case] - Provides camel case JSON renderers and parsers. +* [nested-multipart-parser][nested-multipart-parser] - Provides nested parser for http multipart request ### Renderers @@ -276,13 +147,14 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque * [djangorestframework-features][djangorestframework-features] - Advanced schema generation and more based on named features. * [django-elasticsearch-dsl-drf][django-elasticsearch-dsl-drf] - Integrate Elasticsearch DSL with Django REST framework. Package provides views, serializers, filter backends, pagination and other handy add-ons. * [django-api-client][django-api-client] - DRF client that groups the Endpoint response, for use in CBVs and FBV as if you were working with Django's Native Models.. +* [fast-drf] - A model based library for making API development faster and easier. +* [django-requestlogs] - Providing middleware and other helpers for audit logging for REST framework. +* [drf-standardized-errors][drf-standardized-errors] - DRF exception handler to standardize error responses for all API endpoints. [cite]: http://www.software-ecosystems.com/Software_Ecosystems/Ecosystems.html [cookiecutter]: https://github.com/jpadilla/cookiecutter-django-rest-framework [new-repo]: https://github.com/new [create-a-repo]: https://help.github.com/articles/create-a-repo/ -[travis-ci]: https://travis-ci.org -[travis-profile]: https://travis-ci.org/profile [pypi-register]: https://pypi.org/account/register/ [semver]: https://semver.org/ [tox-docs]: https://tox.readthedocs.io/en/latest/ @@ -308,12 +180,13 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque [djangorestframework-gis]: https://github.com/djangonauts/django-rest-framework-gis [djangorestframework-hstore]: https://github.com/djangonauts/django-rest-framework-hstore [drf-compound-fields]: https://github.com/estebistec/drf-compound-fields -[django-extra-fields]: https://github.com/Hipo/drf-extra-fields +[drf-extra-fields]: https://github.com/Hipo/drf-extra-fields [django-rest-multiple-models]: https://github.com/MattBroach/DjangoRestMultipleModels [drf-nested-routers]: https://github.com/alanjds/drf-nested-routers [wq.db.rest]: https://wq.io/docs/about-rest [djangorestframework-msgpack]: https://github.com/juanriaza/django-rest-framework-msgpack [djangorestframework-camel-case]: https://github.com/vbabiy/djangorestframework-camel-case +[nested-multipart-parser]: https://github.com/remigermain/nested-multipart-parser [djangorestframework-csv]: https://github.com/mjumbewu/django-rest-framework-csv [drf_ujson2]: https://github.com/Amertz08/drf_ujson2 [rest-pandas]: https://github.com/wq/django-rest-pandas @@ -324,7 +197,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque [gaiarestframework]: https://github.com/AppsFuel/gaiarestframework [drf-extensions]: https://github.com/chibisov/drf-extensions [ember-django-adapter]: https://github.com/dustinfarris/ember-django-adapter -[django-rest-auth]: https://github.com/Tivix/django-rest-auth/ +[dj-rest-auth]: https://github.com/iMerica/dj-rest-auth [django-versatileimagefield]: https://github.com/WGBH/django-versatileimagefield [django-versatileimagefield-drf-docs]:https://django-versatileimagefield.readthedocs.io/en/latest/drf_integration.html [drf-tracking]: https://github.com/aschn/drf-tracking @@ -332,7 +205,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque [dry-rest-permissions]: https://github.com/FJNR-inc/dry-rest-permissions [django-url-filter]: https://github.com/miki725/django-url-filter [drf-url-filter]: https://github.com/manjitkumar/drf-url-filters -[cookiecutter-django-rest]: https://github.com/agconti/cookiecutter-django-rest +[cookiecutter-django-rest]: https://github.com/agconti/cookiecutter-django-rest [drf-haystack]: https://drf-haystack.readthedocs.io/en/latest/ [django-rest-framework-version-transforms]: https://github.com/mrhwick/django-rest-framework-version-transforms [djangorestframework-jsonapi]: https://github.com/django-json-api/django-rest-framework-json-api @@ -362,3 +235,9 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque [django-elasticsearch-dsl-drf]: https://github.com/barseghyanartur/django-elasticsearch-dsl-drf [django-api-client]: https://github.com/rhenter/django-api-client [drf-psq]: https://github.com/drf-psq/drf-psq +[django-rest-authemail]: https://github.com/celiao/django-rest-authemail +[graphwrap]: https://github.com/PaulGilmartin/graph_wrap +[rest-framework-actions]: https://github.com/AlexisMunera98/rest-framework-actions +[fast-drf]: https://github.com/iashraful/fast-drf +[django-requestlogs]: https://github.com/Raekkeri/django-requestlogs +[drf-standardized-errors]: https://github.com/ghazi-git/drf-standardized-errors diff --git a/docs/community/tutorials-and-resources.md b/docs/community/tutorials-and-resources.md index cfd3ba852..23faf7912 100644 --- a/docs/community/tutorials-and-resources.md +++ b/docs/community/tutorials-and-resources.md @@ -76,6 +76,7 @@ There are a wide range of resources available for learning and using Django REST * [Chatbot Using Django REST Framework + api.ai + Slack — Part 1/3][chatbot-using-drf-part1] * [New Django Admin with DRF and EmberJS... What are the News?][new-django-admin-with-drf-and-emberjs] * [Blog posts about Django REST Framework][medium-django-rest-framework] +* [Implementing Rest APIs With Embedded Privacy][doordash-implementing-rest-apis] ### Documentations * [Classy Django REST Framework][cdrf.co] @@ -95,7 +96,7 @@ Want your Django REST Framework talk/tutorial/article to be added to our website [ember-and-django-part 1-video]: http://www.neckbeardrepublic.com/screencasts/ember-and-django-part-1 [django-rest-framework-part-1-video]: http://www.neckbeardrepublic.com/screencasts/django-rest-framework-part-1 [web-api-performance-profiling-django-rest-framework]: https://www.dabapps.com/blog/api-performance-profiling-django-rest-framework/ -[api-development-with-django-and-django-rest-framework]: https://bnotions.com/api-development-with-django-and-django-rest-framework/ +[api-development-with-django-and-django-rest-framework]: https://bnotions.com/news-and-insights/api-development-with-django-and-django-rest-framework/ [cdrf.co]:http://www.cdrf.co [medium-django-rest-framework]: https://medium.com/django-rest-framework [django-rest-framework-course]: https://teamtreehouse.com/library/django-rest-framework @@ -128,3 +129,4 @@ Want your Django REST Framework talk/tutorial/article to be added to our website [anna-email]: mailto:anna@django-rest-framework.org [pycon-us-2017]: https://www.youtube.com/watch?v=Rk6MHZdust4 [django-rest-react-valentinog]: https://www.valentinog.com/blog/tutorial-api-django-rest-react/ +[doordash-implementing-rest-apis]: https://doordash.engineering/2013/10/07/implementing-rest-apis-with-embedded-privacy/ diff --git a/docs/coreapi/7-schemas-and-client-libraries.md b/docs/coreapi/7-schemas-and-client-libraries.md deleted file mode 100644 index 203d81ea5..000000000 --- a/docs/coreapi/7-schemas-and-client-libraries.md +++ /dev/null @@ -1,231 +0,0 @@ -# Tutorial 7: Schemas & client libraries - -A schema is a machine-readable document that describes the available API -endpoints, their URLS, and what operations they support. - -Schemas can be a useful tool for auto-generated documentation, and can also -be used to drive dynamic client libraries that can interact with the API. - -## Core API - -In order to provide schema support REST framework uses [Core API][coreapi]. - -Core API is a document specification for describing APIs. It is used to provide -an internal representation format of the available endpoints and possible -interactions that an API exposes. It can either be used server-side, or -client-side. - -When used server-side, Core API allows an API to support rendering to a wide -range of schema or hypermedia formats. - -When used client-side, Core API allows for dynamically driven client libraries -that can interact with any API that exposes a supported schema or hypermedia -format. - -## Adding a schema - -REST framework supports either explicitly defined schema views, or -automatically generated schemas. Since we're using viewsets and routers, -we can simply use the automatic schema generation. - -You'll need to install the `coreapi` python package in order to include an -API schema, and `pyyaml` to render the schema into the commonly used -YAML-based OpenAPI format. - - $ pip install coreapi pyyaml - -We can now include a schema for our API, by including an autogenerated schema -view in our URL configuration. - -```python -from rest_framework.schemas import get_schema_view - -schema_view = get_schema_view(title='Pastebin API') - -urlpatterns = [ -    path('schema/', schema_view), - ... -] -``` - -If you visit the `/schema/` endpoint in a browser you should now see `corejson` -representation become available as an option. - -![Schema format](../img/corejson-format.png) - -We can also request the schema from the command line, by specifying the desired -content type in the `Accept` header. - - $ http http://127.0.0.1:8000/schema/ Accept:application/coreapi+json - HTTP/1.0 200 OK - Allow: GET, HEAD, OPTIONS - Content-Type: application/coreapi+json - - { - "_meta": { - "title": "Pastebin API" - }, - "_type": "document", - ... - -The default output style is to use the [Core JSON][corejson] encoding. - -Other schema formats, such as [Open API][openapi] (formerly Swagger) are -also supported. - -## Using a command line client - -Now that our API is exposing a schema endpoint, we can use a dynamic client -library to interact with the API. To demonstrate this, let's use the -Core API command line client. - -The command line client is available as the `coreapi-cli` package: - - $ pip install coreapi-cli - -Now check that it is available on the command line... - - $ coreapi - Usage: coreapi [OPTIONS] COMMAND [ARGS]... - - Command line client for interacting with CoreAPI services. - - Visit https://www.coreapi.org/ for more information. - - Options: - --version Display the package version number. - --help Show this message and exit. - - Commands: - ... - -First we'll load the API schema using the command line client. - - $ coreapi get http://127.0.0.1:8000/schema/ - - snippets: { - highlight(id) - list() - read(id) - } - users: { - list() - read(id) - } - -We haven't authenticated yet, so right now we're only able to see the read only -endpoints, in line with how we've set up the permissions on the API. - -Let's try listing the existing snippets, using the command line client: - - $ coreapi action snippets list - [ - { - "url": "http://127.0.0.1:8000/snippets/1/", - "id": 1, - "highlight": "http://127.0.0.1:8000/snippets/1/highlight/", - "owner": "lucy", - "title": "Example", - "code": "print('hello, world!')", - "linenos": true, - "language": "python", - "style": "friendly" - }, - ... - -Some of the API endpoints require named parameters. For example, to get back -the highlight HTML for a particular snippet we need to provide an id. - - $ coreapi action snippets highlight --param id=1 - - - - - Example - ... - -## Authenticating our client - -If we want to be able to create, edit and delete snippets, we'll need to -authenticate as a valid user. In this case we'll just use basic auth. - -Make sure to replace the `` and `` below with your -actual username and password. - - $ coreapi credentials add 127.0.0.1 : --auth basic - Added credentials - 127.0.0.1 "Basic <...>" - -Now if we fetch the schema again, we should be able to see the full -set of available interactions. - - $ coreapi reload - Pastebin API "http://127.0.0.1:8000/schema/"> - snippets: { - create(code, [title], [linenos], [language], [style]) - delete(id) - highlight(id) - list() - partial_update(id, [title], [code], [linenos], [language], [style]) - read(id) - update(id, code, [title], [linenos], [language], [style]) - } - users: { - list() - read(id) - } - -We're now able to interact with these endpoints. For example, to create a new -snippet: - - $ coreapi action snippets create --param title="Example" --param code="print('hello, world')" - { - "url": "http://127.0.0.1:8000/snippets/7/", - "id": 7, - "highlight": "http://127.0.0.1:8000/snippets/7/highlight/", - "owner": "lucy", - "title": "Example", - "code": "print('hello, world')", - "linenos": false, - "language": "python", - "style": "friendly" - } - -And to delete a snippet: - - $ coreapi action snippets delete --param id=7 - -As well as the command line client, developers can also interact with your -API using client libraries. The Python client library is the first of these -to be available, and a Javascript client library is planned to be released -soon. - -For more details on customizing schema generation and using Core API -client libraries you'll need to refer to the full documentation. - -## Reviewing our work - -With an incredibly small amount of code, we've now got a complete pastebin Web API, which is fully web browsable, includes a schema-driven client library, and comes complete with authentication, per-object permissions, and multiple renderer formats. - -We've walked through each step of the design process, and seen how if we need to customize anything we can gradually work our way down to simply using regular Django views. - -You can review the final [tutorial code][repo] on GitHub, or try out a live example in [the sandbox][sandbox]. - -## Onwards and upwards - -We've reached the end of our tutorial. If you want to get more involved in the REST framework project, here are a few places you can start: - -* Contribute on [GitHub][github] by reviewing and submitting issues, and making pull requests. -* Join the [REST framework discussion group][group], and help build the community. -* Follow [the author][twitter] on Twitter and say hi. - -**Now go build awesome things.** - -[coreapi]: https://www.coreapi.org/ -[corejson]: https://www.coreapi.org/specification/encoding/#core-json-encoding -[openapi]: https://openapis.org/ -[repo]: https://github.com/encode/rest-framework-tutorial -[sandbox]: https://restframework.herokuapp.com/ -[github]: https://github.com/encode/django-rest-framework -[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework -[twitter]: https://twitter.com/_tomchristie diff --git a/docs/coreapi/from-documenting-your-api.md b/docs/coreapi/from-documenting-your-api.md deleted file mode 100644 index 604dfa668..000000000 --- a/docs/coreapi/from-documenting-your-api.md +++ /dev/null @@ -1,171 +0,0 @@ - -## Built-in API documentation - -The built-in API documentation includes: - -* Documentation of API endpoints. -* Automatically generated code samples for each of the available API client libraries. -* Support for API interaction. - -### Installation - -The `coreapi` library is required as a dependency for the API docs. Make sure -to install the latest version. The `Pygments` and `Markdown` libraries -are optional but recommended. - -To install the API documentation, you'll need to include it in your project's URLconf: - - from rest_framework.documentation import include_docs_urls - - urlpatterns = [ - ... - path('docs/', include_docs_urls(title='My API title')) - ] - -This will include two different views: - - * `/docs/` - The documentation page itself. - * `/docs/schema.js` - A JavaScript resource that exposes the API schema. - ---- - -**Note**: By default `include_docs_urls` configures the underlying `SchemaView` to generate _public_ schemas. -This means that views will not be instantiated with a `request` instance. i.e. Inside the view `self.request` will be `None`. - -To be compatible with this behaviour, methods (such as `get_serializer` or `get_serializer_class` etc.) which inspect `self.request` or, particularly, `self.request.user` may need to be adjusted to handle this case. - -You may ensure views are given a `request` instance by calling `include_docs_urls` with `public=False`: - - from rest_framework.documentation import include_docs_urls - - urlpatterns = [ - ... - # Generate schema with valid `request` instance: - path('docs/', include_docs_urls(title='My API title', public=False)) - ] - - ---- - - -### Documenting your views - -You can document your views by including docstrings that describe each of the available actions. -For example: - - class UserList(generics.ListAPIView): - """ - Return a list of all the existing users. - """ - -If a view supports multiple methods, you should split your documentation using `method:` style delimiters. - - class UserList(generics.ListCreateAPIView): - """ - get: - Return a list of all the existing users. - - post: - Create a new user instance. - """ - -When using viewsets, you should use the relevant action names as delimiters. - - class UserViewSet(viewsets.ModelViewSet): - """ - retrieve: - Return the given user. - - list: - Return a list of all the existing users. - - create: - Create a new user instance. - """ - -Custom actions on viewsets can also be documented in a similar way using the method names -as delimiters or by attaching the documentation to action mapping methods. - - class UserViewSet(viewsets.ModelViewset): - ... - - @action(detail=False, methods=['get', 'post']) - def some_action(self, request, *args, **kwargs): - """ - get: - A description of the get method on the custom action. - - post: - A description of the post method on the custom action. - """ - - @some_action.mapping.put - def put_some_action(): - """ - A description of the put method on the custom action. - """ - - -### `documentation` API Reference - -The `rest_framework.documentation` module provides three helper functions to help configure the interactive API documentation, `include_docs_urls` (usage shown above), `get_docs_view` and `get_schemajs_view`. - - `include_docs_urls` employs `get_docs_view` and `get_schemajs_view` to generate the url patterns for the documentation page and JavaScript resource that exposes the API schema respectively. They expose the following options for customisation. (`get_docs_view` and `get_schemajs_view` ultimately call `rest_frameworks.schemas.get_schema_view()`, see the Schemas docs for more options there.) - -#### `include_docs_urls` - -* `title`: Default `None`. May be used to provide a descriptive title for the schema definition. -* `description`: Default `None`. May be used to provide a description for the schema definition. -* `schema_url`: Default `None`. May be used to pass a canonical base URL for the schema. -* `public`: Default `True`. Should the schema be considered _public_? If `True` schema is generated without a `request` instance being passed to views. -* `patterns`: Default `None`. A list of URLs to inspect when generating the schema. If `None` project's URL conf will be used. -* `generator_class`: Default `rest_framework.schemas.SchemaGenerator`. May be used to specify a `SchemaGenerator` subclass to be passed to the `SchemaView`. -* `authentication_classes`: Default `api_settings.DEFAULT_AUTHENTICATION_CLASSES`. May be used to pass custom authentication classes to the `SchemaView`. -* `permission_classes`: Default `api_settings.DEFAULT_PERMISSION_CLASSES` May be used to pass custom permission classes to the `SchemaView`. -* `renderer_classes`: Default `None`. May be used to pass custom renderer classes to the `SchemaView`. - -#### `get_docs_view` - -* `title`: Default `None`. May be used to provide a descriptive title for the schema definition. -* `description`: Default `None`. May be used to provide a description for the schema definition. -* `schema_url`: Default `None`. May be used to pass a canonical base URL for the schema. -* `public`: Default `True`. If `True` schema is generated without a `request` instance being passed to views. -* `patterns`: Default `None`. A list of URLs to inspect when generating the schema. If `None` project's URL conf will be used. -* `generator_class`: Default `rest_framework.schemas.SchemaGenerator`. May be used to specify a `SchemaGenerator` subclass to be passed to the `SchemaView`. -* `authentication_classes`: Default `api_settings.DEFAULT_AUTHENTICATION_CLASSES`. May be used to pass custom authentication classes to the `SchemaView`. -* `permission_classes`: Default `api_settings.DEFAULT_PERMISSION_CLASSES`. May be used to pass custom permission classes to the `SchemaView`. -* `renderer_classes`: Default `None`. May be used to pass custom renderer classes to the `SchemaView`. If `None` the `SchemaView` will be configured with `DocumentationRenderer` and `CoreJSONRenderer` renderers, corresponding to the (default) `html` and `corejson` formats. - -#### `get_schemajs_view` - -* `title`: Default `None`. May be used to provide a descriptive title for the schema definition. -* `description`: Default `None`. May be used to provide a description for the schema definition. -* `schema_url`: Default `None`. May be used to pass a canonical base URL for the schema. -* `public`: Default `True`. If `True` schema is generated without a `request` instance being passed to views. -* `patterns`: Default `None`. A list of URLs to inspect when generating the schema. If `None` project's URL conf will be used. -* `generator_class`: Default `rest_framework.schemas.SchemaGenerator`. May be used to specify a `SchemaGenerator` subclass to be passed to the `SchemaView`. -* `authentication_classes`: Default `api_settings.DEFAULT_AUTHENTICATION_CLASSES`. May be used to pass custom authentication classes to the `SchemaView`. -* `permission_classes`: Default `api_settings.DEFAULT_PERMISSION_CLASSES` May be used to pass custom permission classes to the `SchemaView`. - - -### Customising code samples - -The built-in API documentation includes automatically generated code samples for -each of the available API client libraries. - -You may customise these samples by subclassing `DocumentationRenderer`, setting -`languages` to the list of languages you wish to support: - - from rest_framework.renderers import DocumentationRenderer - - - class CustomRenderer(DocumentationRenderer): - languages = ['ruby', 'go'] - -For each language you need to provide an `intro` template, detailing installation instructions and such, -plus a generic template for making API requests, that can be filled with individual request details. -See the [templates for the bundled languages][client-library-templates] for examples. - ---- - -[client-library-templates]: https://github.com/encode/django-rest-framework/tree/master/rest_framework/templates/rest_framework/docs/langs \ No newline at end of file diff --git a/docs/coreapi/index.md b/docs/coreapi/index.md deleted file mode 100644 index 9195eb33e..000000000 --- a/docs/coreapi/index.md +++ /dev/null @@ -1,29 +0,0 @@ -# Legacy CoreAPI Schemas Docs - -Use of CoreAPI-based schemas were deprecated with the introduction of native OpenAPI-based schema generation in Django REST Framework v3.10. - -See the [Version 3.10 Release Announcement](/community/3.10-announcement.md) for more details. - ----- - -You can continue to use CoreAPI schemas by setting the appropriate default schema class: - -```python -# In settings.py -REST_FRAMEWORK = { - 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', -} -``` - -Under-the-hood, any subclass of `coreapi.AutoSchema` here will trigger use of the old CoreAPI schemas. -**Otherwise** you will automatically be opted-in to the new OpenAPI schemas. - -All CoreAPI related code will be removed in Django REST Framework v3.12. Switch to OpenAPI schemas by then. - ----- - -For reference this folder contains the old CoreAPI related documentation: - -* [Tutorial 7: Schemas & client libraries](https://github.com/encode/django-rest-framework/blob/master/docs/coreapi//7-schemas-and-client-libraries.md). -* [Excerpts from _Documenting your API_ topic page](https://github.com/encode/django-rest-framework/blob/master/docs/coreapi//from-documenting-your-api.md). -* [`rest_framework.schemas` API Reference](https://github.com/encode/django-rest-framework/blob/master/docs/coreapi//schemas.md). diff --git a/docs/coreapi/schemas.md b/docs/coreapi/schemas.md deleted file mode 100644 index 653105a7a..000000000 --- a/docs/coreapi/schemas.md +++ /dev/null @@ -1,846 +0,0 @@ -source: schemas.py - -# Schemas - -> A machine-readable [schema] describes what resources are available via the API, what their URLs are, how they are represented and what operations they support. -> -> — Heroku, [JSON Schema for the Heroku Platform API][cite] - -API schemas are a useful tool that allow for a range of use cases, including -generating reference documentation, or driving dynamic client libraries that -can interact with your API. - -## Install Core API & PyYAML - -You'll need to install the `coreapi` package in order to add schema support -for REST framework. You probably also want to install `pyyaml`, so that you -can render the schema into the commonly used YAML-based OpenAPI format. - - pip install coreapi pyyaml - -## Quickstart - -There are two different ways you can serve a schema description for your API. - -### Generating a schema with the `generateschema` management command - -To generate a static API schema, use the `generateschema` management command. - -```shell -$ python manage.py generateschema > schema.yml -``` - -Once you've generated a schema in this way you can annotate it with any -additional information that cannot be automatically inferred by the schema -generator. - -You might want to check your API schema into version control and update it -with each new release, or serve the API schema from your site's static media. - -### Adding a view with `get_schema_view` - -To add a dynamically generated schema view to your API, use `get_schema_view`. - -```python -from rest_framework.schemas import get_schema_view -from django.urls import path - -schema_view = get_schema_view(title="Example API") - -urlpatterns = [ - path('schema', schema_view), - ... -] -``` - -See below [for more details](#the-get_schema_view-shortcut) on customizing a -dynamically generated schema view. - -## Internal schema representation - -REST framework uses [Core API][coreapi] in order to model schema information in -a format-independent representation. This information can then be rendered -into various different schema formats, or used to generate API documentation. - -When using Core API, a schema is represented as a `Document` which is the -top-level container object for information about the API. Available API -interactions are represented using `Link` objects. Each link includes a URL, -HTTP method, and may include a list of `Field` instances, which describe any -parameters that may be accepted by the API endpoint. The `Link` and `Field` -instances may also include descriptions, that allow an API schema to be -rendered into user documentation. - -Here's an example of an API description that includes a single `search` -endpoint: - - coreapi.Document( - title='Flight Search API', - url='https://api.example.org/', - content={ - 'search': coreapi.Link( - url='/search/', - action='get', - fields=[ - coreapi.Field( - name='from', - required=True, - location='query', - description='City name or airport code.' - ), - coreapi.Field( - name='to', - required=True, - location='query', - description='City name or airport code.' - ), - coreapi.Field( - name='date', - required=True, - location='query', - description='Flight date in "YYYY-MM-DD" format.' - ) - ], - description='Return flight availability and prices.' - ) - } - ) - -## Schema output formats - -In order to be presented in an HTTP response, the internal representation -has to be rendered into the actual bytes that are used in the response. - -REST framework includes a few different renderers that you can use for -encoding the API schema. - -* `renderers.OpenAPIRenderer` - Renders into YAML-based [OpenAPI][open-api], the most widely used API schema format. -* `renderers.JSONOpenAPIRenderer` - Renders into JSON-based [OpenAPI][open-api]. -* `renderers.CoreJSONRenderer` - Renders into [Core JSON][corejson], a format designed for -use with the `coreapi` client library. - - -[Core JSON][corejson] is designed as a canonical format for use with Core API. -REST framework includes a renderer class for handling this media type, which -is available as `renderers.CoreJSONRenderer`. - - -## Schemas vs Hypermedia - -It's worth pointing out here that Core API can also be used to model hypermedia -responses, which present an alternative interaction style to API schemas. - -With an API schema, the entire available interface is presented up-front -as a single endpoint. Responses to individual API endpoints are then typically -presented as plain data, without any further interactions contained in each -response. - -With Hypermedia, the client is instead presented with a document containing -both data and available interactions. Each interaction results in a new -document, detailing both the current state and the available interactions. - -Further information and support on building Hypermedia APIs with REST framework -is planned for a future version. - - ---- - -# Creating a schema - -REST framework includes functionality for auto-generating a schema, -or allows you to specify one explicitly. - -## Manual Schema Specification - -To manually specify a schema you create a Core API `Document`, similar to the -example above. - - schema = coreapi.Document( - title='Flight Search API', - content={ - ... - } - ) - - -## Automatic Schema Generation - -Automatic schema generation is provided by the `SchemaGenerator` class. - -`SchemaGenerator` processes a list of routed URL patterns and compiles the -appropriately structured Core API Document. - -Basic usage is just to provide the title for your schema and call -`get_schema()`: - - generator = schemas.SchemaGenerator(title='Flight Search API') - schema = generator.get_schema() - -## Per-View Schema Customisation - -By default, view introspection is performed by an `AutoSchema` instance -accessible via the `schema` attribute on `APIView`. This provides the -appropriate Core API `Link` object for the view, request method and path: - - auto_schema = view.schema - coreapi_link = auto_schema.get_link(...) - -(In compiling the schema, `SchemaGenerator` calls `view.schema.get_link()` for -each view, allowed method and path.) - ---- - -**Note**: For basic `APIView` subclasses, default introspection is essentially -limited to the URL kwarg path parameters. For `GenericAPIView` -subclasses, which includes all the provided class based views, `AutoSchema` will -attempt to introspect serializer, pagination and filter fields, as well as -provide richer path field descriptions. (The key hooks here are the relevant -`GenericAPIView` attributes and methods: `get_serializer`, `pagination_class`, -`filter_backends` and so on.) - ---- - -To customise the `Link` generation you may: - -* Instantiate `AutoSchema` on your view with the `manual_fields` kwarg: - - from rest_framework.views import APIView - from rest_framework.schemas import AutoSchema - - class CustomView(APIView): - ... - schema = AutoSchema( - manual_fields=[ - coreapi.Field("extra_field", ...), - ] - ) - - This allows extension for the most common case without subclassing. - -* Provide an `AutoSchema` subclass with more complex customisation: - - from rest_framework.views import APIView - from rest_framework.schemas import AutoSchema - - class CustomSchema(AutoSchema): - def get_link(...): - # Implement custom introspection here (or in other sub-methods) - - class CustomView(APIView): - ... - schema = CustomSchema() - - This provides complete control over view introspection. - -* Instantiate `ManualSchema` on your view, providing the Core API `Fields` for - the view explicitly: - - from rest_framework.views import APIView - from rest_framework.schemas import ManualSchema - - class CustomView(APIView): - ... - schema = ManualSchema(fields=[ - coreapi.Field( - "first_field", - required=True, - location="path", - schema=coreschema.String() - ), - coreapi.Field( - "second_field", - required=True, - location="path", - schema=coreschema.String() - ), - ]) - - This allows manually specifying the schema for some views whilst maintaining - automatic generation elsewhere. - -You may disable schema generation for a view by setting `schema` to `None`: - - class CustomView(APIView): - ... - schema = None # Will not appear in schema - -This also applies to extra actions for `ViewSet`s: - - class CustomViewSet(viewsets.ModelViewSet): - - @action(detail=True, schema=None) - def extra_action(self, request, pk=None): - ... - ---- - -**Note**: For full details on `SchemaGenerator` plus the `AutoSchema` and -`ManualSchema` descriptors see the [API Reference below](#api-reference). - ---- - -# Adding a schema view - -There are a few different ways to add a schema view to your API, depending on -exactly what you need. - -## The get_schema_view shortcut - -The simplest way to include a schema in your project is to use the -`get_schema_view()` function. - - from rest_framework.schemas import get_schema_view - - schema_view = get_schema_view(title="Server Monitoring API") - - urlpatterns = [ - path('', schema_view), - ... - ] - -Once the view has been added, you'll be able to make API requests to retrieve -the auto-generated schema definition. - - $ http http://127.0.0.1:8000/ Accept:application/coreapi+json - HTTP/1.0 200 OK - Allow: GET, HEAD, OPTIONS - Content-Type: application/vnd.coreapi+json - - { - "_meta": { - "title": "Server Monitoring API" - }, - "_type": "document", - ... - } - -The arguments to `get_schema_view()` are: - -#### `title` - -May be used to provide a descriptive title for the schema definition. - -#### `url` - -May be used to pass a canonical URL for the schema. - - schema_view = get_schema_view( - title='Server Monitoring API', - url='https://www.example.org/api/' - ) - -#### `urlconf` - -A string representing the import path to the URL conf that you want -to generate an API schema for. This defaults to the value of Django's -ROOT_URLCONF setting. - - schema_view = get_schema_view( - title='Server Monitoring API', - url='https://www.example.org/api/', - urlconf='myproject.urls' - ) - -#### `renderer_classes` - -May be used to pass the set of renderer classes that can be used to render the API root endpoint. - - from rest_framework.schemas import get_schema_view - from rest_framework.renderers import JSONOpenAPIRenderer - - schema_view = get_schema_view( - title='Server Monitoring API', - url='https://www.example.org/api/', - renderer_classes=[JSONOpenAPIRenderer] - ) - -#### `patterns` - -List of url patterns to limit the schema introspection to. If you only want the `myproject.api` urls -to be exposed in the schema: - - schema_url_patterns = [ - path('api/', include('myproject.api.urls')), - ] - - schema_view = get_schema_view( - title='Server Monitoring API', - url='https://www.example.org/api/', - patterns=schema_url_patterns, - ) - -#### `generator_class` - -May be used to specify a `SchemaGenerator` subclass to be passed to the -`SchemaView`. - -#### `authentication_classes` - -May be used to specify the list of authentication classes that will apply to the schema endpoint. -Defaults to `settings.DEFAULT_AUTHENTICATION_CLASSES` - -#### `permission_classes` - -May be used to specify the list of permission classes that will apply to the schema endpoint. -Defaults to `settings.DEFAULT_PERMISSION_CLASSES` - -## Using an explicit schema view - -If you need a little more control than the `get_schema_view()` shortcut gives you, -then you can use the `SchemaGenerator` class directly to auto-generate the -`Document` instance, and to return that from a view. - -This option gives you the flexibility of setting up the schema endpoint -with whatever behaviour you want. For example, you can apply different -permission, throttling, or authentication policies to the schema endpoint. - -Here's an example of using `SchemaGenerator` together with a view to -return the schema. - -**views.py:** - - from rest_framework.decorators import api_view, renderer_classes - from rest_framework import renderers, response, schemas - - generator = schemas.SchemaGenerator(title='Bookings API') - - @api_view() - @renderer_classes([renderers.OpenAPIRenderer]) - def schema_view(request): - schema = generator.get_schema(request) - return response.Response(schema) - -**urls.py:** - - urlpatterns = [ - path('', schema_view), - ... - ] - -You can also serve different schemas to different users, depending on the -permissions they have available. This approach can be used to ensure that -unauthenticated requests are presented with a different schema to -authenticated requests, or to ensure that different parts of the API are -made visible to different users depending on their role. - -In order to present a schema with endpoints filtered by user permissions, -you need to pass the `request` argument to the `get_schema()` method, like so: - - @api_view() - @renderer_classes([renderers.OpenAPIRenderer]) - def schema_view(request): - generator = schemas.SchemaGenerator(title='Bookings API') - return response.Response(generator.get_schema(request=request)) - -## Explicit schema definition - -An alternative to the auto-generated approach is to specify the API schema -explicitly, by declaring a `Document` object in your codebase. Doing so is a -little more work, but ensures that you have full control over the schema -representation. - - import coreapi - from rest_framework.decorators import api_view, renderer_classes - from rest_framework import renderers, response - - schema = coreapi.Document( - title='Bookings API', - content={ - ... - } - ) - - @api_view() - @renderer_classes([renderers.OpenAPIRenderer]) - def schema_view(request): - return response.Response(schema) - ---- - -# Schemas as documentation - -One common usage of API schemas is to use them to build documentation pages. - -The schema generation in REST framework uses docstrings to automatically -populate descriptions in the schema document. - -These descriptions will be based on: - -* The corresponding method docstring if one exists. -* A named section within the class docstring, which can be either single line or multi-line. -* The class docstring. - -## Examples - -An `APIView`, with an explicit method docstring. - - class ListUsernames(APIView): - def get(self, request): - """ - Return a list of all user names in the system. - """ - usernames = [user.username for user in User.objects.all()] - return Response(usernames) - -A `ViewSet`, with an explicit action docstring. - - class ListUsernames(ViewSet): - def list(self, request): - """ - Return a list of all user names in the system. - """ - usernames = [user.username for user in User.objects.all()] - return Response(usernames) - -A generic view with sections in the class docstring, using single-line style. - - class UserList(generics.ListCreateAPIView): - """ - get: List all the users. - post: Create a new user. - """ - queryset = User.objects.all() - serializer_class = UserSerializer - permission_classes = [IsAdminUser] - -A generic viewset with sections in the class docstring, using multi-line style. - - class UserViewSet(viewsets.ModelViewSet): - """ - API endpoint that allows users to be viewed or edited. - - retrieve: - Return a user instance. - - list: - Return all users, ordered by most recently joined. - """ - queryset = User.objects.all().order_by('-date_joined') - serializer_class = UserSerializer - ---- - -# API Reference - -## SchemaGenerator - -A class that walks a list of routed URL patterns, requests the schema for each view, -and collates the resulting CoreAPI Document. - -Typically you'll instantiate `SchemaGenerator` with a single argument, like so: - - generator = SchemaGenerator(title='Stock Prices API') - -Arguments: - -* `title` **required** - The name of the API. -* `url` - The root URL of the API schema. This option is not required unless the schema is included under path prefix. -* `patterns` - A list of URLs to inspect when generating the schema. Defaults to the project's URL conf. -* `urlconf` - A URL conf module name to use when generating the schema. Defaults to `settings.ROOT_URLCONF`. - -### get_schema(self, request) - -Returns a `coreapi.Document` instance that represents the API schema. - - @api_view - @renderer_classes([renderers.OpenAPIRenderer]) - def schema_view(request): - generator = schemas.SchemaGenerator(title='Bookings API') - return Response(generator.get_schema()) - -The `request` argument is optional, and may be used if you want to apply per-user -permissions to the resulting schema generation. - -### get_links(self, request) - -Return a nested dictionary containing all the links that should be included in the API schema. - -This is a good point to override if you want to modify the resulting structure of the generated schema, -as you can build a new dictionary with a different layout. - - -## AutoSchema - -A class that deals with introspection of individual views for schema generation. - -`AutoSchema` is attached to `APIView` via the `schema` attribute. - -The `AutoSchema` constructor takes a single keyword argument `manual_fields`. - -**`manual_fields`**: a `list` of `coreapi.Field` instances that will be added to -the generated fields. Generated fields with a matching `name` will be overwritten. - - class CustomView(APIView): - schema = AutoSchema(manual_fields=[ - coreapi.Field( - "my_extra_field", - required=True, - location="path", - schema=coreschema.String() - ), - ]) - -For more advanced customisation subclass `AutoSchema` to customise schema generation. - - class CustomViewSchema(AutoSchema): - """ - Overrides `get_link()` to provide Custom Behavior X - """ - - def get_link(self, path, method, base_url): - link = super().get_link(path, method, base_url) - # Do something to customize link here... - return link - - class MyView(APIView): - schema = CustomViewSchema() - -The following methods are available to override. - -### get_link(self, path, method, base_url) - -Returns a `coreapi.Link` instance corresponding to the given view. - -This is the main entry point. -You can override this if you need to provide custom behaviors for particular views. - -### get_description(self, path, method) - -Returns a string to use as the link description. By default this is based on the -view docstring as described in the "Schemas as Documentation" section above. - -### get_encoding(self, path, method) - -Returns a string to indicate the encoding for any request body, when interacting -with the given view. Eg. `'application/json'`. May return a blank string for views -that do not expect a request body. - -### get_path_fields(self, path, method): - -Return a list of `coreapi.Field()` instances. One for each path parameter in the URL. - -### get_serializer_fields(self, path, method) - -Return a list of `coreapi.Field()` instances. One for each field in the serializer class used by the view. - -### get_pagination_fields(self, path, method) - -Return a list of `coreapi.Field()` instances, as returned by the `get_schema_fields()` method on any pagination class used by the view. - -### get_filter_fields(self, path, method) - -Return a list of `coreapi.Field()` instances, as returned by the `get_schema_fields()` method of any filter classes used by the view. - -### get_manual_fields(self, path, method) - -Return a list of `coreapi.Field()` instances to be added to or replace generated fields. Defaults to (optional) `manual_fields` passed to `AutoSchema` constructor. - -May be overridden to customise manual fields by `path` or `method`. For example, a per-method adjustment may look like this: - -```python -def get_manual_fields(self, path, method): - """Example adding per-method fields.""" - - extra_fields = [] - if method=='GET': - extra_fields = # ... list of extra fields for GET ... - if method=='POST': - extra_fields = # ... list of extra fields for POST ... - - manual_fields = super().get_manual_fields(path, method) - return manual_fields + extra_fields -``` - -### update_fields(fields, update_with) - -Utility `staticmethod`. Encapsulates logic to add or replace fields from a list -by `Field.name`. May be overridden to adjust replacement criteria. - - -## ManualSchema - -Allows manually providing a list of `coreapi.Field` instances for the schema, -plus an optional description. - - class MyView(APIView): - schema = ManualSchema(fields=[ - coreapi.Field( - "first_field", - required=True, - location="path", - schema=coreschema.String() - ), - coreapi.Field( - "second_field", - required=True, - location="path", - schema=coreschema.String() - ), - ] - ) - -The `ManualSchema` constructor takes two arguments: - -**`fields`**: A list of `coreapi.Field` instances. Required. - -**`description`**: A string description. Optional. - -**`encoding`**: Default `None`. A string encoding, e.g `application/json`. Optional. - ---- - -## Core API - -This documentation gives a brief overview of the components within the `coreapi` -package that are used to represent an API schema. - -Note that these classes are imported from the `coreapi` package, rather than -from the `rest_framework` package. - -### Document - -Represents a container for the API schema. - -#### `title` - -A name for the API. - -#### `url` - -A canonical URL for the API. - -#### `content` - -A dictionary, containing the `Link` objects that the schema contains. - -In order to provide more structure to the schema, the `content` dictionary -may be nested, typically to a second level. For example: - - content={ - "bookings": { - "list": Link(...), - "create": Link(...), - ... - }, - "venues": { - "list": Link(...), - ... - }, - ... - } - -### Link - -Represents an individual API endpoint. - -#### `url` - -The URL of the endpoint. May be a URI template, such as `/users/{username}/`. - -#### `action` - -The HTTP method associated with the endpoint. Note that URLs that support -more than one HTTP method, should correspond to a single `Link` for each. - -#### `fields` - -A list of `Field` instances, describing the available parameters on the input. - -#### `description` - -A short description of the meaning and intended usage of the endpoint. - -### Field - -Represents a single input parameter on a given API endpoint. - -#### `name` - -A descriptive name for the input. - -#### `required` - -A boolean, indicated if the client is required to included a value, or if -the parameter can be omitted. - -#### `location` - -Determines how the information is encoded into the request. Should be one of -the following strings: - -**"path"** - -Included in a templated URI. For example a `url` value of `/products/{product_code}/` could be used together with a `"path"` field, to handle API inputs in a URL path such as `/products/slim-fit-jeans/`. - -These fields will normally correspond with [named arguments in the project URL conf][named-arguments]. - -**"query"** - -Included as a URL query parameter. For example `?search=sale`. Typically for `GET` requests. - -These fields will normally correspond with pagination and filtering controls on a view. - -**"form"** - -Included in the request body, as a single item of a JSON object or HTML form. For example `{"colour": "blue", ...}`. Typically for `POST`, `PUT` and `PATCH` requests. Multiple `"form"` fields may be included on a single link. - -These fields will normally correspond with serializer fields on a view. - -**"body"** - -Included as the complete request body. Typically for `POST`, `PUT` and `PATCH` requests. No more than one `"body"` field may exist on a link. May not be used together with `"form"` fields. - -These fields will normally correspond with views that use `ListSerializer` to validate the request input, or with file upload views. - -#### `encoding` - -**"application/json"** - -JSON encoded request content. Corresponds to views using `JSONParser`. -Valid only if either one or more `location="form"` fields, or a single -`location="body"` field is included on the `Link`. - -**"multipart/form-data"** - -Multipart encoded request content. Corresponds to views using `MultiPartParser`. -Valid only if one or more `location="form"` fields is included on the `Link`. - -**"application/x-www-form-urlencoded"** - -URL encoded request content. Corresponds to views using `FormParser`. Valid -only if one or more `location="form"` fields is included on the `Link`. - -**"application/octet-stream"** - -Binary upload request content. Corresponds to views using `FileUploadParser`. -Valid only if a `location="body"` field is included on the `Link`. - -#### `description` - -A short description of the meaning and intended usage of the input field. - - ---- - -# Third party packages - -## drf-yasg - Yet Another Swagger Generator - -[drf-yasg][drf-yasg] generates [OpenAPI][open-api] documents suitable for code generation - nested schemas, -named models, response bodies, enum/pattern/min/max validators, form parameters, etc. - - -## drf-spectacular - Sane and flexible OpenAPI 3.0 schema generation for Django REST framework - -[drf-spectacular][drf-spectacular] is a [OpenAPI 3][open-api] schema generation tool with explicit focus on extensibility, -customizability and client generation. It's usage patterns are very similar to [drf-yasg][drf-yasg]. - -[cite]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api -[coreapi]: https://www.coreapi.org/ -[corejson]: https://www.coreapi.org/specification/encoding/#core-json-encoding -[drf-yasg]: https://github.com/axnsan12/drf-yasg/ -[drf-spectacular]: https://github.com/tfranzel/drf-spectacular/ -[open-api]: https://openapis.org/ -[json-hyperschema]: https://json-schema.org/latest/json-schema-hypermedia.html -[api-blueprint]: https://apiblueprint.org/ -[static-files]: https://docs.djangoproject.com/en/stable/howto/static-files/ -[named-arguments]: https://docs.djangoproject.com/en/stable/topics/http/urls/#named-groups diff --git a/docs/img/build-status.png b/docs/img/build-status.png new file mode 100644 index 000000000..bb043cb9e Binary files /dev/null and b/docs/img/build-status.png differ diff --git a/docs/img/premium/bitio-readme.png b/docs/img/premium/bitio-readme.png index c47118cc6..d5d6259e6 100644 Binary files a/docs/img/premium/bitio-readme.png and b/docs/img/premium/bitio-readme.png differ diff --git a/docs/img/premium/cryptapi-readme.png b/docs/img/premium/cryptapi-readme.png new file mode 100644 index 000000000..10839b13b Binary files /dev/null and b/docs/img/premium/cryptapi-readme.png differ diff --git a/docs/img/premium/fezto-readme.png b/docs/img/premium/fezto-readme.png new file mode 100644 index 000000000..7cc3be6e6 Binary files /dev/null and b/docs/img/premium/fezto-readme.png differ diff --git a/docs/img/premium/posthog-readme.png b/docs/img/premium/posthog-readme.png new file mode 100644 index 000000000..0fc09f0b8 Binary files /dev/null and b/docs/img/premium/posthog-readme.png differ diff --git a/docs/img/premium/retool-readme.png b/docs/img/premium/retool-readme.png index 56adba04d..971563427 100644 Binary files a/docs/img/premium/retool-readme.png and b/docs/img/premium/retool-readme.png differ diff --git a/docs/img/premium/sentry-readme.png b/docs/img/premium/sentry-readme.png index 420e8ee87..3c8858aca 100644 Binary files a/docs/img/premium/sentry-readme.png and b/docs/img/premium/sentry-readme.png differ diff --git a/docs/img/premium/spacinov-readme.png b/docs/img/premium/spacinov-readme.png new file mode 100644 index 000000000..20e925211 Binary files /dev/null and b/docs/img/premium/spacinov-readme.png differ diff --git a/docs/img/premium/stream-readme.png b/docs/img/premium/stream-readme.png index 15da6ba71..a6a7317b7 100644 Binary files a/docs/img/premium/stream-readme.png and b/docs/img/premium/stream-readme.png differ diff --git a/docs/img/quickstart.png b/docs/img/quickstart.png index 5006d60fe..e3581f308 100644 Binary files a/docs/img/quickstart.png and b/docs/img/quickstart.png differ diff --git a/docs/img/travis-status.png b/docs/img/travis-status.png deleted file mode 100644 index fec98cf9b..000000000 Binary files a/docs/img/travis-status.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md index 0273da9f1..cab5511ac 100644 --- a/docs/index.md +++ b/docs/index.md @@ -20,8 +20,8 @@

- - + + @@ -67,15 +67,17 @@ continued development by **[signing up for a paid plan][funding]**.

-*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), [ESG](https://software.esg-usa.com/), [Rollbar](https://rollbar.com/?utm_source=django&utm_medium=sponsorship&utm_campaign=freetrial), [Cadre](https://cadre.com), [Kloudless](https://hubs.ly/H0f30Lf0), [Lights On Software](https://lightsonsoftware.com), [Retool](https://retool.com/?utm_source=djangorest&utm_medium=sponsorship), and [bit.io](https://bit.io/jobs?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship).* +*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=DjangoRESTFramework&utm_medium=Webpage_Logo_Ad&utm_content=Developer&utm_campaign=DjangoRESTFramework_Jan2022_HomePage), [Spacinov](https://www.spacinov.com/), [Retool](https://retool.com/?utm_source=djangorest&utm_medium=sponsorship), [bit.io](https://bit.io/jobs?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship), [PostHog](https://posthog.com?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship), [CryptAPI](https://cryptapi.io), and [FEZTO](https://www.fezto.xyz/?utm_source=DjangoRESTFramework).* --- @@ -83,8 +85,8 @@ continued development by **[signing up for a paid plan][funding]**. REST framework requires the following: -* Python (3.5, 3.6, 3.7, 3.8, 3.9) -* Django (2.2, 3.0, 3.1) +* Python (3.6, 3.7, 3.8, 3.9, 3.10, 3.11) +* Django (2.2, 3.0, 3.1, 3.2, 4.0, 4.1) We **highly recommend** and only officially support the latest patch release of each Python and Django series. @@ -186,20 +188,17 @@ Framework. ## Support -For support please see the [REST framework discussion group][group], try the `#restframework` channel on `irc.freenode.net`, search [the IRC archives][botbot], or raise a question on [Stack Overflow][stack-overflow], making sure to include the ['django-rest-framework'][django-rest-framework-tag] tag. +For support please see the [REST framework discussion group][group], try the `#restframework` channel on `irc.libera.chat`, or raise a question on [Stack Overflow][stack-overflow], making sure to include the ['django-rest-framework'][django-rest-framework-tag] tag. For priority support please sign up for a [professional or premium sponsorship plan](https://fund.django-rest-framework.org/topics/funding/). -For updates on REST framework development, you may also want to follow [the author][twitter] on Twitter. - - - - ## Security -If you believe you’ve found something in Django REST framework which has security implications, please **do not raise the issue in a public forum**. +Security issues are handled under the supervision of the [Django security team](https://www.djangoproject.com/foundation/teams/#security-team). -Send a description of the issue via email to [rest-framework-security@googlegroups.com][security-mail]. The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure. +**Please report security issues by emailing security@djangoproject.com**. + +The project maintainers will then work with you to resolve any issues where required, prior to any public disclosure. ## License @@ -262,7 +261,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [funding]: community/funding.md [group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework -[botbot]: https://botbot.me/freenode/restframework/ [stack-overflow]: https://stackoverflow.com/ [django-rest-framework-tag]: https://stackoverflow.com/questions/tagged/django-rest-framework [security-mail]: mailto:rest-framework-security@googlegroups.com diff --git a/docs/topics/ajax-csrf-cors.md b/docs/topics/ajax-csrf-cors.md index 646f3f563..094ecc4a4 100644 --- a/docs/topics/ajax-csrf-cors.md +++ b/docs/topics/ajax-csrf-cors.md @@ -2,7 +2,7 @@ > "Take a close look at possible CSRF / XSRF vulnerabilities on your own websites. They're the worst kind of vulnerability — very easy to exploit by attackers, yet not so intuitively easy to understand for software developers, at least until you've been bitten by one." > -> — [Jeff Atwood][cite] +> — [Jeff Atwood][cite] ## Javascript clients @@ -31,11 +31,11 @@ In order to make AJAX requests, you need to include CSRF token in the HTTP heade The best way to deal with CORS in REST framework is to add the required response headers in middleware. This ensures that CORS is supported transparently, without having to change any behavior in your views. -[Otto Yiu][ottoyiu] maintains the [django-cors-headers] package, which is known to work correctly with REST framework APIs. +[Adam Johnson][adamchainz] maintains the [django-cors-headers] package, which is known to work correctly with REST framework APIs. [cite]: https://blog.codinghorror.com/preventing-csrf-and-xsrf-attacks/ [csrf]: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) [csrf-ajax]: https://docs.djangoproject.com/en/stable/ref/csrf/#ajax [cors]: https://www.w3.org/TR/cors/ -[ottoyiu]: https://github.com/ottoyiu/ -[django-cors-headers]: https://github.com/ottoyiu/django-cors-headers/ +[adamchainz]: https://github.com/adamchainz +[django-cors-headers]: https://github.com/adamchainz/django-cors-headers diff --git a/docs/topics/api-clients.md b/docs/topics/api-clients.md deleted file mode 100644 index 9b61eaf42..000000000 --- a/docs/topics/api-clients.md +++ /dev/null @@ -1,527 +0,0 @@ -# API Clients - -An API client handles the underlying details of how network requests are made -and how responses are decoded. They present the developer with an application -interface to work against, rather than working directly with the network interface. - -The API clients documented here are not restricted to APIs built with Django REST framework. - They can be used with any API that exposes a supported schema format. - -For example, [the Heroku platform API][heroku-api] exposes a schema in the JSON -Hyperschema format. As a result, the Core API command line client and Python -client library can be [used to interact with the Heroku API][heroku-example]. - -## Client-side Core API - -[Core API][core-api] is a document specification that can be used to describe APIs. It can -be used either server-side, as is done with REST framework's [schema generation][schema-generation], -or used client-side, as described here. - -When used client-side, Core API allows for *dynamically driven client libraries* -that can interact with any API that exposes a supported schema or hypermedia -format. - -Using a dynamically driven client has a number of advantages over interacting -with an API by building HTTP requests directly. - -#### More meaningful interaction - -API interactions are presented in a more meaningful way. You're working at -the application interface layer, rather than the network interface layer. - -#### Resilience & evolvability - -The client determines what endpoints are available, what parameters exist -against each particular endpoint, and how HTTP requests are formed. - -This also allows for a degree of API evolvability. URLs can be modified -without breaking existing clients, or more efficient encodings can be used -on-the-wire, with clients transparently upgrading. - -#### Self-descriptive APIs - -A dynamically driven client is able to present documentation on the API to the -end user. This documentation allows the user to discover the available endpoints -and parameters, and better understand the API they are working with. - -Because this documentation is driven by the API schema it will always be fully -up to date with the most recently deployed version of the service. - ---- - -# Command line client - -The command line client allows you to inspect and interact with any API that -exposes a supported schema format. - -## Getting started - -To install the Core API command line client, use `pip`. - -Note that the command-line client is a separate package to the -python client library. Make sure to install `coreapi-cli`. - - $ pip install coreapi-cli - -To start inspecting and interacting with an API the schema must first be loaded -from the network. - - $ coreapi get http://api.example.org/ - - snippets: { - create(code, [title], [linenos], [language], [style]) - destroy(pk) - highlight(pk) - list([page]) - partial_update(pk, [title], [code], [linenos], [language], [style]) - retrieve(pk) - update(pk, code, [title], [linenos], [language], [style]) - } - users: { - list([page]) - retrieve(pk) - } - -This will then load the schema, displaying the resulting `Document`. This -`Document` includes all the available interactions that may be made against the API. - -To interact with the API, use the `action` command. This command requires a list -of keys that are used to index into the link. - - $ coreapi action users list - [ - { - "url": "http://127.0.0.1:8000/users/2/", - "id": 2, - "username": "aziz", - "snippets": [] - }, - ... - ] - -To inspect the underlying HTTP request and response, use the `--debug` flag. - - $ coreapi action users list --debug - > GET /users/ HTTP/1.1 - > Accept: application/vnd.coreapi+json, */* - > Authorization: Basic bWF4Om1heA== - > Host: 127.0.0.1 - > User-Agent: coreapi - < 200 OK - < Allow: GET, HEAD, OPTIONS - < Content-Type: application/json - < Date: Thu, 30 Jun 2016 10:51:46 GMT - < Server: WSGIServer/0.1 Python/2.7.10 - < Vary: Accept, Cookie - < - < [{"url":"http://127.0.0.1/users/2/","id":2,"username":"aziz","snippets":[]},{"url":"http://127.0.0.1/users/3/","id":3,"username":"amy","snippets":["http://127.0.0.1/snippets/3/"]},{"url":"http://127.0.0.1/users/4/","id":4,"username":"max","snippets":["http://127.0.0.1/snippets/4/","http://127.0.0.1/snippets/5/","http://127.0.0.1/snippets/6/","http://127.0.0.1/snippets/7/"]},{"url":"http://127.0.0.1/users/5/","id":5,"username":"jose","snippets":[]},{"url":"http://127.0.0.1/users/6/","id":6,"username":"admin","snippets":["http://127.0.0.1/snippets/1/","http://127.0.0.1/snippets/2/"]}] - - [ - ... - ] - -Some actions may include optional or required parameters. - - $ coreapi action users create --param username=example - -When using `--param`, the type of the input will be determined automatically. - -If you want to be more explicit about the parameter type then use `--data` for -any null, numeric, boolean, list, or object inputs, and use `--string` for string inputs. - - $ coreapi action users edit --string username=tomchristie --data is_admin=true - -## Authentication & headers - -The `credentials` command is used to manage the request `Authentication:` header. -Any credentials added are always linked to a particular domain, so as to ensure -that credentials are not leaked across differing APIs. - -The format for adding a new credential is: - - $ coreapi credentials add - -For instance: - - $ coreapi credentials add api.example.org "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b" - -The optional `--auth` flag also allows you to add specific types of authentication, -handling the encoding for you. Currently only `"basic"` is supported as an option here. -For example: - - $ coreapi credentials add api.example.org tomchristie:foobar --auth basic - -You can also add specific request headers, using the `headers` command: - - $ coreapi headers add api.example.org x-api-version 2 - -For more information and a listing of the available subcommands use `coreapi -credentials --help` or `coreapi headers --help`. - -## Codecs - -By default the command line client only includes support for reading Core JSON -schemas, however it includes a plugin system for installing additional codecs. - - $ pip install openapi-codec jsonhyperschema-codec hal-codec - $ coreapi codecs show - Codecs - corejson application/vnd.coreapi+json encoding, decoding - hal application/hal+json encoding, decoding - openapi application/openapi+json encoding, decoding - jsonhyperschema application/schema+json decoding - json application/json data - text text/* data - -## Utilities - -The command line client includes functionality for bookmarking API URLs -under a memorable name. For example, you can add a bookmark for the -existing API, like so... - - $ coreapi bookmarks add accountmanagement - -There is also functionality for navigating forward or backward through the -history of which API URLs have been accessed. - - $ coreapi history show - $ coreapi history back - -For more information and a listing of the available subcommands use -`coreapi bookmarks --help` or `coreapi history --help`. - -## Other commands - -To display the current `Document`: - - $ coreapi show - -To reload the current `Document` from the network: - - $ coreapi reload - -To load a schema file from disk: - - $ coreapi load my-api-schema.json --format corejson - -To dump the current document to console in a given format: - - $ coreapi dump --format openapi - -To remove the current document, along with all currently saved history, -credentials, headers and bookmarks: - - $ coreapi clear - ---- - -# Python client library - -The `coreapi` Python package allows you to programmatically interact with any -API that exposes a supported schema format. - -## Getting started - -You'll need to install the `coreapi` package using `pip` before you can get -started. - - $ pip install coreapi - -In order to start working with an API, we first need a `Client` instance. The -client holds any configuration around which codecs and transports are supported -when interacting with an API, which allows you to provide for more advanced -kinds of behaviour. - - import coreapi - client = coreapi.Client() - -Once we have a `Client` instance, we can fetch an API schema from the network. - - schema = client.get('https://api.example.org/') - -The object returned from this call will be a `Document` instance, which is -a representation of the API schema. - -## Authentication - -Typically you'll also want to provide some authentication credentials when -instantiating the client. - -#### Token authentication - -The `TokenAuthentication` class can be used to support REST framework's built-in -`TokenAuthentication`, as well as OAuth and JWT schemes. - - auth = coreapi.auth.TokenAuthentication( - scheme='JWT', - token='' - ) - client = coreapi.Client(auth=auth) - -When using TokenAuthentication you'll probably need to implement a login flow -using the CoreAPI client. - -A suggested pattern for this would be to initially make an unauthenticated client -request to an "obtain token" endpoint - -For example, using the "Django REST framework JWT" package - - client = coreapi.Client() - schema = client.get('https://api.example.org/') - - action = ['api-token-auth', 'create'] - params = {"username": "example", "password": "secret"} - result = client.action(schema, action, params) - - auth = coreapi.auth.TokenAuthentication( - scheme='JWT', - token=result['token'] - ) - client = coreapi.Client(auth=auth) - -#### Basic authentication - -The `BasicAuthentication` class can be used to support HTTP Basic Authentication. - - auth = coreapi.auth.BasicAuthentication( - username='', - password='' - ) - client = coreapi.Client(auth=auth) - -## Interacting with the API - -Now that we have a client and have fetched our schema `Document`, we can now -start to interact with the API: - - users = client.action(schema, ['users', 'list']) - -Some endpoints may include named parameters, which might be either optional or required: - - new_user = client.action(schema, ['users', 'create'], params={"username": "max"}) - -## Codecs - -Codecs are responsible for encoding or decoding Documents. - -The decoding process is used by a client to take a bytestring of an API schema -definition, and returning the Core API `Document` that represents that interface. - -A codec should be associated with a particular media type, such as `'application/coreapi+json'`. - -This media type is used by the server in the response `Content-Type` header, -in order to indicate what kind of data is being returned in the response. - -#### Configuring codecs - -The codecs that are available can be configured when instantiating a client. -The keyword argument used here is `decoders`, because in the context of a -client the codecs are only for *decoding* responses. - -In the following example we'll configure a client to only accept `Core JSON` -and `JSON` responses. This will allow us to receive and decode a Core JSON schema, -and subsequently to receive JSON responses made against the API. - - from coreapi import codecs, Client - - decoders = [codecs.CoreJSONCodec(), codecs.JSONCodec()] - client = Client(decoders=decoders) - -#### Loading and saving schemas - -You can use a codec directly, in order to load an existing schema definition, -and return the resulting `Document`. - - input_file = open('my-api-schema.json', 'rb') - schema_definition = input_file.read() - codec = codecs.CoreJSONCodec() - schema = codec.load(schema_definition) - -You can also use a codec directly to generate a schema definition given a `Document` instance: - - schema_definition = codec.dump(schema) - output_file = open('my-api-schema.json', 'rb') - output_file.write(schema_definition) - -## Transports - -Transports are responsible for making network requests. The set of transports -that a client has installed determines which network protocols it is able to -support. - -Currently the `coreapi` library only includes an HTTP/HTTPS transport, but -other protocols can also be supported. - -#### Configuring transports - -The behavior of the network layer can be customized by configuring the -transports that the client is instantiated with. - - import requests - from coreapi import transports, Client - - credentials = {'api.example.org': 'Token 3bd44a009d16ff'} - transports = transports.HTTPTransport(credentials=credentials) - client = Client(transports=transports) - -More complex customizations can also be achieved, for example modifying the -underlying `requests.Session` instance to [attach transport adaptors][transport-adaptors] -that modify the outgoing requests. - ---- - -# JavaScript Client Library - -The JavaScript client library allows you to interact with your API either from a browser, or using node. - -## Installing the JavaScript client - -There are two separate JavaScript resources that you need to include in your HTML pages in order to use the JavaScript client library. These are a static `coreapi.js` file, which contains the code for the dynamic client library, and a templated `schema.js` resource, which exposes your API schema. - -First, install the API documentation views. These will include the schema resource that'll allow you to load the schema directly from an HTML page, without having to make an asynchronous AJAX call. - - from rest_framework.documentation import include_docs_urls - - urlpatterns = [ - ... - path('docs/', include_docs_urls(title='My API service'), name='api-docs'), - ] - -Once the API documentation URLs are installed, you'll be able to include both the required JavaScript resources. Note that the ordering of these two lines is important, as the schema loading requires CoreAPI to already be installed. - - - {% load static %} - - - -The `coreapi` library, and the `schema` object will now both be available on the `window` instance. - - const coreapi = window.coreapi; - const schema = window.schema; - -## Instantiating a client - -In order to interact with the API you'll need a client instance. - - var client = new coreapi.Client(); - -Typically you'll also want to provide some authentication credentials when -instantiating the client. - -#### Session authentication - -The `SessionAuthentication` class allows session cookies to provide the user -authentication. You'll want to provide a standard HTML login flow, to allow -the user to login, and then instantiate a client using session authentication: - - let auth = new coreapi.auth.SessionAuthentication({ - csrfCookieName: 'csrftoken', - csrfHeaderName: 'X-CSRFToken', - }); - let client = new coreapi.Client({auth: auth}); - -The authentication scheme will handle including a CSRF header in any outgoing -requests for unsafe HTTP methods. - -#### Token authentication - -The `TokenAuthentication` class can be used to support REST framework's built-in -`TokenAuthentication`, as well as OAuth and JWT schemes. - - let auth = new coreapi.auth.TokenAuthentication({ - scheme: 'JWT', - token: '', - }); - let client = new coreapi.Client({auth: auth}); - -When using TokenAuthentication you'll probably need to implement a login flow -using the CoreAPI client. - -A suggested pattern for this would be to initially make an unauthenticated client -request to an "obtain token" endpoint - -For example, using the "Django REST framework JWT" package - - // Setup some globally accessible state - window.client = new coreapi.Client(); - window.loggedIn = false; - - function loginUser(username, password) { - let action = ["api-token-auth", "obtain-token"]; - let params = {username: "example", email: "example@example.com"}; - client.action(schema, action, params).then(function(result) { - // On success, instantiate an authenticated client. - let auth = window.coreapi.auth.TokenAuthentication({ - scheme: 'JWT', - token: result['token'], - }) - window.client = coreapi.Client({auth: auth}); - window.loggedIn = true; - }).catch(function (error) { - // Handle error case where eg. user provides incorrect credentials. - }) - } - -#### Basic authentication - -The `BasicAuthentication` class can be used to support HTTP Basic Authentication. - - let auth = new coreapi.auth.BasicAuthentication({ - username: '', - password: '', - }) - let client = new coreapi.Client({auth: auth}); - -## Using the client - -Making requests: - - let action = ["users", "list"]; - client.action(schema, action).then(function(result) { - // Return value is in 'result' - }) - -Including parameters: - - let action = ["users", "create"]; - let params = {username: "example", email: "example@example.com"}; - client.action(schema, action, params).then(function(result) { - // Return value is in 'result' - }) - -Handling errors: - - client.action(schema, action, params).then(function(result) { - // Return value is in 'result' - }).catch(function (error) { - // Error value is in 'error' - }) - -## Installation with node - -The coreapi package is available on NPM. - - $ npm install coreapi - $ node - const coreapi = require('coreapi') - -You'll either want to include the API schema in your codebase directly, by copying it from the `schema.js` resource, or else load the schema asynchronously. For example: - - let client = new coreapi.Client(); - let schema = null; - client.get("https://api.example.org/").then(function(data) { - // Load a CoreJSON API schema. - schema = data; - console.log('schema loaded'); - }) - -[heroku-api]: https://devcenter.heroku.com/categories/platform-api -[heroku-example]: https://www.coreapi.org/tools-and-resources/example-services/#heroku-json-hyper-schema -[core-api]: https://www.coreapi.org/ -[schema-generation]: ../api-guide/schemas.md -[transport-adaptors]: http://docs.python-requests.org/en/master/user/advanced/#transport-adapters diff --git a/docs/topics/browsable-api.md b/docs/topics/browsable-api.md index ed70c4901..2cdf2a884 100644 --- a/docs/topics/browsable-api.md +++ b/docs/topics/browsable-api.md @@ -17,7 +17,7 @@ By default, the API will return the format specified by the headers, which in th ## Customizing -The browsable API is built with [Twitter's Bootstrap][bootstrap] (v 3.3.5), making it easy to customize the look-and-feel. +The browsable API is built with [Twitter's Bootstrap][bootstrap] (v 3.4.1), making it easy to customize the look-and-feel. To customize the default style, create a template called `rest_framework/api.html` that extends from `rest_framework/base.html`. For example: @@ -35,7 +35,7 @@ To replace the default theme, add a `bootstrap_theme` block to your `api.html` a {% endblock %} -Suitable pre-made replacement themes are available at [Bootswatch][bswatch]. To use any of the Bootswatch themes, simply download the theme's `bootstrap.min.css` file, add it to your project, and replace the default one as described above. +Suitable pre-made replacement themes are available at [Bootswatch][bswatch]. To use any of the Bootswatch themes, simply download the theme's `bootstrap.min.css` file, add it to your project, and replace the default one as described above. Make sure that the Bootstrap version of the new theme matches that of the default theme. You can also change the navbar variant, which by default is `navbar-inverse`, using the `bootstrap_navbar_variant` block. The empty `{% block bootstrap_navbar_variant %}{% endblock %}` will use the original Bootstrap navbar style. @@ -44,7 +44,7 @@ Full example: {% extends "rest_framework/base.html" %} {% block bootstrap_theme %} - + {% endblock %} {% block bootstrap_navbar_variant %}{% endblock %} diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index cd7e5098f..b85d6310a 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -4,12 +4,42 @@ > > — Roy Fielding, [REST APIs must be hypertext driven][cite] -REST framework provides built-in support for generating OpenAPI schemas, which -can be used with tools that allow you to build API documentation. +REST framework provides a range of different choices for documenting your API. The following +is a non-exhaustive list of the most popular ones. -There are also a number of great third-party documentation packages available. +## Third party packages for OpenAPI support -## Generating documentation from OpenAPI schemas +### drf-spectacular + +[drf-spectacular][drf-spectacular] is an [OpenAPI 3][open-api] schema generation library with explicit +focus on extensibility, customizability and client generation. It is the recommended way for +generating and presenting OpenAPI schemas. + +The library aims to extract as much schema information as possible, while providing decorators and extensions for easy +customization. There is explicit support for [swagger-codegen][swagger], [SwaggerUI][swagger-ui] and [Redoc][redoc], +i18n, versioning, authentication, polymorphism (dynamic requests and responses), query/path/header parameters, +documentation and more. Several popular plugins for DRF are supported out-of-the-box as well. + +### drf-yasg + +[drf-yasg][drf-yasg] is a [Swagger / OpenAPI 2][swagger] generation tool implemented without using the schema generation provided +by Django Rest Framework. + +It aims to implement as much of the [OpenAPI 2][open-api] specification as possible - nested schemas, named models, +response bodies, enum/pattern/min/max validators, form parameters, etc. - and to generate documents usable with code +generation tools like `swagger-codegen`. + +This also translates into a very useful interactive documentation viewer in the form of `swagger-ui`: + +![Screenshot - drf-yasg][image-drf-yasg] + +--- + +## Built-in OpenAPI schema generation (deprecated) + +**Deprecation notice: REST framework's built-in support for generating OpenAPI schemas is +deprecated in favor of 3rd party packages that can provide this functionality instead. +As replacement, we recommend using the [drf-spectacular](#drf-spectacular) package.** There are a number of packages available that allow you to generate HTML documentation pages from OpenAPI schemas. @@ -124,35 +154,6 @@ urlpatterns = [ See the [ReDoc documentation][redoc] for advanced usage. -## Third party packages - -There are a number of mature third-party packages for providing API documentation. - -#### drf-yasg - Yet Another Swagger Generator - -[drf-yasg][drf-yasg] is a [Swagger][swagger] generation tool implemented without using the schema generation provided -by Django Rest Framework. - -It aims to implement as much of the [OpenAPI][open-api] specification as possible - nested schemas, named models, -response bodies, enum/pattern/min/max validators, form parameters, etc. - and to generate documents usable with code -generation tools like `swagger-codegen`. - -This also translates into a very useful interactive documentation viewer in the form of `swagger-ui`: - - -![Screenshot - drf-yasg][image-drf-yasg] - -#### drf-spectacular - Sane and flexible OpenAPI 3.0 schema generation for Django REST framework - -[drf-spectacular][drf-spectacular] is a [OpenAPI 3][open-api] schema generation tool with explicit focus on extensibility, -customizability and client generation. Usage patterns are very similar to [drf-yasg][drf-yasg]. - -It aims to extract as much schema information as possible, while providing decorators and extensions for easy -customization. There is explicit support for [swagger-codegen][swagger], [SwaggerUI][swagger-ui] and [Redoc][redoc], -i18n, versioning, authentication, polymorphism (dynamic requests and responses), query/path/header parameters, -documentation and more. Several popular plugins for DRF are supported out-of-the-box as well. - ---- ## Self describing APIs @@ -202,7 +203,7 @@ You can modify the response behavior to `OPTIONS` requests by overriding the `op meta = self.metadata_class() data = meta.determine_metadata(request, self) data.pop('description') - return data + return Response(data=data, status=status.HTTP_200_OK) See [the Metadata docs][metadata-docs] for more details. diff --git a/docs/topics/html-and-forms.md b/docs/topics/html-and-forms.md index 18774926b..17c9e3314 100644 --- a/docs/topics/html-and-forms.md +++ b/docs/topics/html-and-forms.md @@ -207,14 +207,14 @@ Field templates can also use additional style properties, depending on their typ The complete list of `base_template` options and their associated style options is listed below. -base_template | Valid field types | Additional style options -----|----|---- -input.html | Any string, numeric or date/time field | input_type, placeholder, hide_label, autofocus -textarea.html | `CharField` | rows, placeholder, hide_label -select.html | `ChoiceField` or relational field types | hide_label -radio.html | `ChoiceField` or relational field types | inline, hide_label -select_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | hide_label +base_template | Valid field types | Additional style options +-----------------------|-------------------------------------------------------------|----------------------------------------------- +input.html | Any string, numeric or date/time field | input_type, placeholder, hide_label, autofocus +textarea.html | `CharField` | rows, placeholder, hide_label +select.html | `ChoiceField` or relational field types | hide_label +radio.html | `ChoiceField` or relational field types | inline, hide_label +select_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | hide_label checkbox_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | inline, hide_label -checkbox.html | `BooleanField` | hide_label -fieldset.html | Nested serializer | hide_label -list_fieldset.html | `ListField` or nested serializer with `many=True` | hide_label +checkbox.html | `BooleanField` | hide_label +fieldset.html | Nested serializer | hide_label +list_fieldset.html | `ListField` or nested serializer with `many=True` | hide_label diff --git a/docs/topics/internationalization.md b/docs/topics/internationalization.md index 7cfc6e247..267ccdb37 100644 --- a/docs/topics/internationalization.md +++ b/docs/topics/internationalization.md @@ -17,9 +17,9 @@ You can change the default language by using the standard Django `LANGUAGE_CODE` LANGUAGE_CODE = "es-es" -You can turn on per-request language requests by adding `LocalMiddleware` to your `MIDDLEWARE_CLASSES` setting: +You can turn on per-request language requests by adding `LocalMiddleware` to your `MIDDLEWARE` setting: - MIDDLEWARE_CLASSES = [ + MIDDLEWARE = [ ... 'django.middleware.locale.LocaleMiddleware' ] @@ -90,7 +90,7 @@ If you're only translating custom error messages that exist inside your project ## How the language is determined -If you want to allow per-request language preferences you'll need to include `django.middleware.locale.LocaleMiddleware` in your `MIDDLEWARE_CLASSES` setting. +If you want to allow per-request language preferences you'll need to include `django.middleware.locale.LocaleMiddleware` in your `MIDDLEWARE` setting. You can find more information on how the language preference is determined in the [Django documentation][django-language-preference]. For reference, the method is: @@ -103,10 +103,10 @@ You can find more information on how the language preference is determined in th For API clients the most appropriate of these will typically be to use the `Accept-Language` header; Sessions and cookies will not be available unless using session authentication, and generally better practice to prefer an `Accept-Language` header for API clients rather than using language URL prefixes. [cite]: https://youtu.be/Wa0VfS2q94Y -[django-translation]: https://docs.djangoproject.com/en/1.7/topics/i18n/translation +[django-translation]: https://docs.djangoproject.com/en/stable/topics/i18n/translation [custom-exception-handler]: ../api-guide/exceptions.md#custom-exception-handling [transifex-project]: https://www.transifex.com/projects/p/django-rest-framework/ [django-po-source]: https://raw.githubusercontent.com/encode/django-rest-framework/master/rest_framework/locale/en_US/LC_MESSAGES/django.po -[django-language-preference]: https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#how-django-discovers-language-preference -[django-locale-paths]: https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-LOCALE_PATHS -[django-locale-name]: https://docs.djangoproject.com/en/1.7/topics/i18n/#term-locale-name +[django-language-preference]: https://docs.djangoproject.com/en/stable/topics/i18n/translation/#how-django-discovers-language-preference +[django-locale-paths]: https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-LOCALE_PATHS +[django-locale-name]: https://docs.djangoproject.com/en/stable/topics/i18n/#term-locale-name diff --git a/docs/topics/rest-hypermedia-hateoas.md b/docs/topics/rest-hypermedia-hateoas.md index a11bd6cc7..3498bddd1 100644 --- a/docs/topics/rest-hypermedia-hateoas.md +++ b/docs/topics/rest-hypermedia-hateoas.md @@ -4,7 +4,7 @@ > > — Mike Amundsen, [REST fest 2012 keynote][cite]. -First off, the disclaimer. The name "Django REST framework" was decided back in early 2011 and was chosen simply to sure the project would be easily found by developers. Throughout the documentation we try to use the more simple and technically correct terminology of "Web APIs". +First off, the disclaimer. The name "Django REST framework" was decided back in early 2011 and was chosen simply to ensure the project would be easily found by developers. Throughout the documentation we try to use the more simple and technically correct terminology of "Web APIs". If you are serious about designing a Hypermedia API, you should look to resources outside of this documentation to help inform your design choices. diff --git a/docs/tutorial/1-serialization.md b/docs/tutorial/1-serialization.md index 85d8676b1..6db3ea282 100644 --- a/docs/tutorial/1-serialization.md +++ b/docs/tutorial/1-serialization.md @@ -45,7 +45,7 @@ We'll need to add our new `snippets` app and the `rest_framework` app to `INSTAL INSTALLED_APPS = [ ... 'rest_framework', - 'snippets.apps.SnippetsConfig', + 'snippets', ] Okay, we're ready to roll. @@ -77,7 +77,7 @@ For the purposes of this tutorial we're going to start by creating a simple `Sni We'll also need to create an initial migration for our snippet model, and sync the database for the first time. python manage.py makemigrations snippets - python manage.py migrate + python manage.py migrate snippets ## Creating a Serializer class @@ -179,7 +179,7 @@ We can also serialize querysets instead of model instances. To do so we simply ## Using ModelSerializers -Our `SnippetSerializer` class is replicating a lot of information that's also contained in the `Snippet` model. It would be nice if we could keep our code a bit more concise. +Our `SnippetSerializer` class is replicating a lot of information that's also contained in the `Snippet` model. It would be nice if we could keep our code a bit more concise. In the same way that Django provides both `Form` classes and `ModelForm` classes, REST framework includes both `Serializer` classes, and `ModelSerializer` classes. @@ -307,8 +307,8 @@ Quit out of the shell... Validating models... 0 errors found - Django version 1.11, using settings 'tutorial.settings' - Development server is running at http://127.0.0.1:8000/ + Django version 4.0, using settings 'tutorial.settings' + Starting Development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. In another terminal window, we can test the server. @@ -374,5 +374,5 @@ We'll see how we can start to improve things in [part 2 of the tutorial][tut-2]. [sandbox]: https://restframework.herokuapp.com/ [venv]: https://docs.python.org/3/library/venv.html [tut-2]: 2-requests-and-responses.md -[httpie]: https://github.com/jakubroztocil/httpie#installation +[httpie]: https://github.com/httpie/httpie#installation [curl]: https://curl.haxx.se/ diff --git a/docs/tutorial/2-requests-and-responses.md b/docs/tutorial/2-requests-and-responses.md index f2b369615..47c7facfc 100644 --- a/docs/tutorial/2-requests-and-responses.md +++ b/docs/tutorial/2-requests-and-responses.md @@ -29,7 +29,7 @@ REST framework provides two wrappers you can use to write API views. These wrappers provide a few bits of functionality such as making sure you receive `Request` instances in your view, and adding context to `Response` objects so that content negotiation can be performed. -The wrappers also provide behaviour such as returning `405 Method Not Allowed` responses when appropriate, and handling any `ParseError` exceptions that occur when accessing `request.data` with malformed input. +The wrappers also provide behavior such as returning `405 Method Not Allowed` responses when appropriate, and handling any `ParseError` exceptions that occur when accessing `request.data` with malformed input. ## Pulling it all together @@ -112,7 +112,7 @@ Now update the `snippets/urls.py` file slightly, to append a set of `format_suff urlpatterns = [ path('snippets/', views.snippet_list), - path('snippets/', views.snippet_detail), + path('snippets//', views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/docs/tutorial/3-class-based-views.md b/docs/tutorial/3-class-based-views.md index e02feaa5e..ccfcd095d 100644 --- a/docs/tutorial/3-class-based-views.md +++ b/docs/tutorial/3-class-based-views.md @@ -79,9 +79,9 @@ Okay, we're done. If you run the development server everything should be workin ## Using mixins -One of the big wins of using class-based views is that it allows us to easily compose reusable bits of behaviour. +One of the big wins of using class-based views is that it allows us to easily compose reusable bits of behavior. -The create/retrieve/update/delete operations that we've been using so far are going to be pretty similar for any model-backed API views we create. Those bits of common behaviour are implemented in REST framework's mixin classes. +The create/retrieve/update/delete operations that we've been using so far are going to be pretty similar for any model-backed API views we create. Those bits of common behavior are implemented in REST framework's mixin classes. Let's take a look at how we can compose the views by using the mixin classes. Here's our `views.py` module again. diff --git a/docs/tutorial/4-authentication-and-permissions.md b/docs/tutorial/4-authentication-and-permissions.md index 79ce355c9..cb0321ea2 100644 --- a/docs/tutorial/4-authentication-and-permissions.md +++ b/docs/tutorial/4-authentication-and-permissions.md @@ -38,7 +38,7 @@ And now we can add a `.save()` method to our model class: formatter = HtmlFormatter(style=self.style, linenos=linenos, full=True, **options) self.highlighted = highlight(self.code, lexer, formatter) - super(Snippet, self).save(*args, **kwargs) + super().save(*args, **kwargs) When that's all done we'll need to update our database tables. Normally we'd create a database migration in order to do that, but for the purposes of this tutorial, let's just delete the database and start again. diff --git a/docs/tutorial/5-relationships-and-hyperlinked-apis.md b/docs/tutorial/5-relationships-and-hyperlinked-apis.md index 4cd4e9bbd..f999fdf50 100644 --- a/docs/tutorial/5-relationships-and-hyperlinked-apis.md +++ b/docs/tutorial/5-relationships-and-hyperlinked-apis.md @@ -31,7 +31,6 @@ The other thing we need to consider when creating the code highlight view is tha Instead of using a concrete generic view, we'll use the base class for representing instances, and create our own `.get()` method. In your `snippets/views.py` add: from rest_framework import renderers - from rest_framework.response import Response class SnippetHighlight(generics.GenericAPIView): queryset = Snippet.objects.all() @@ -143,7 +142,7 @@ We can change the default list style to use pagination, by modifying our `tutori Note that settings in REST framework are all namespaced into a single dictionary setting, named `REST_FRAMEWORK`, which helps keep them well separated from your other project settings. -We could also customize the pagination style if we needed too, but in this case we'll just stick with the default. +We could also customize the pagination style if we needed to, but in this case we'll just stick with the default. ## Browsing the API diff --git a/docs/tutorial/6-viewsets-and-routers.md b/docs/tutorial/6-viewsets-and-routers.md index f012677d3..74789e337 100644 --- a/docs/tutorial/6-viewsets-and-routers.md +++ b/docs/tutorial/6-viewsets-and-routers.md @@ -10,10 +10,11 @@ A `ViewSet` class is only bound to a set of method handlers at the last moment, Let's take our current set of views, and refactor them into view sets. -First of all let's refactor our `UserList` and `UserDetail` views into a single `UserViewSet`. We can remove the two views, and replace them with a single class: +First of all let's refactor our `UserList` and `UserDetail` classes into a single `UserViewSet` class. We can remove the two view classes, and replace them with a single ViewSet class: from rest_framework import viewsets + class UserViewSet(viewsets.ReadOnlyModelViewSet): """ This viewset automatically provides `list` and `retrieve` actions. @@ -25,13 +26,14 @@ Here we've used the `ReadOnlyModelViewSet` class to automatically provide the de Next we're going to replace the `SnippetList`, `SnippetDetail` and `SnippetHighlight` view classes. We can remove the three views, and again replace them with a single class. + from rest_framework import permissions from rest_framework.decorators import action from rest_framework.response import Response - from rest_framework import permissions + class SnippetViewSet(viewsets.ModelViewSet): """ - This viewset automatically provides `list`, `create`, `retrieve`, + This ViewSet automatically provides `list`, `create`, `retrieve`, `update` and `destroy` actions. Additionally we also provide an extra `highlight` action. @@ -64,9 +66,10 @@ To see what's going on under the hood let's first explicitly create a set of vie In the `snippets/urls.py` file we bind our `ViewSet` classes into a set of concrete views. - from snippets.views import SnippetViewSet, UserViewSet, api_root from rest_framework import renderers + from snippets.views import api_root, SnippetViewSet, UserViewSet + snippet_list = SnippetViewSet.as_view({ 'get': 'list', 'post': 'create' @@ -87,7 +90,7 @@ In the `snippets/urls.py` file we bind our `ViewSet` classes into a set of concr 'get': 'retrieve' }) -Notice how we're creating multiple views from each `ViewSet` class, by binding the http methods to the required action for each view. +Notice how we're creating multiple views from each `ViewSet` class, by binding the HTTP methods to the required action for each view. Now that we've bound our resources into concrete views, we can register the views with the URL conf as usual. @@ -108,24 +111,25 @@ Here's our re-wired `snippets/urls.py` file. from django.urls import path, include from rest_framework.routers import DefaultRouter + from snippets import views - # Create a router and register our viewsets with it. + # Create a router and register our ViewSets with it. router = DefaultRouter() - router.register(r'snippets', views.SnippetViewSet) - router.register(r'users', views.UserViewSet) + router.register(r'snippets', views.SnippetViewSet, basename='snippet') + router.register(r'users', views.UserViewSet, basename='user') # The API URLs are now determined automatically by the router. urlpatterns = [ path('', include(router.urls)), ] -Registering the viewsets with the router is similar to providing a urlpattern. We include two arguments - the URL prefix for the views, and the viewset itself. +Registering the ViewSets with the router is similar to providing a urlpattern. We include two arguments - the URL prefix for the views, and the view set itself. -The `DefaultRouter` class we're using also automatically creates the API root view for us, so we can now delete the `api_root` method from our `views` module. +The `DefaultRouter` class we're using also automatically creates the API root view for us, so we can now delete the `api_root` function from our `views` module. -## Trade-offs between views vs viewsets +## Trade-offs between views vs ViewSets -Using viewsets can be a really useful abstraction. It helps ensure that URL conventions will be consistent across your API, minimizes the amount of code you need to write, and allows you to concentrate on the interactions and representations your API provides rather than the specifics of the URL conf. +Using ViewSets can be a really useful abstraction. It helps ensure that URL conventions will be consistent across your API, minimizes the amount of code you need to write, and allows you to concentrate on the interactions and representations your API provides rather than the specifics of the URL conf. -That doesn't mean it's always the right approach to take. There's a similar set of trade-offs to consider as when using class-based views instead of function based views. Using viewsets is less explicit than building your views individually. +That doesn't mean it's always the right approach to take. There's a similar set of trade-offs to consider as when using class-based views instead of function-based views. Using ViewSets is less explicit than building your API views individually. diff --git a/docs/tutorial/quickstart.md b/docs/tutorial/quickstart.md index ee839790f..09f249f6e 100644 --- a/docs/tutorial/quickstart.md +++ b/docs/tutorial/quickstart.md @@ -30,21 +30,24 @@ The project layout should look like: /tutorial $ find . . - ./manage.py ./tutorial + ./tutorial/asgi.py ./tutorial/__init__.py ./tutorial/quickstart - ./tutorial/quickstart/__init__.py - ./tutorial/quickstart/admin.py - ./tutorial/quickstart/apps.py ./tutorial/quickstart/migrations ./tutorial/quickstart/migrations/__init__.py ./tutorial/quickstart/models.py + ./tutorial/quickstart/__init__.py + ./tutorial/quickstart/apps.py + ./tutorial/quickstart/admin.py ./tutorial/quickstart/tests.py ./tutorial/quickstart/views.py ./tutorial/settings.py ./tutorial/urls.py ./tutorial/wsgi.py + ./env + ./env/... + ./manage.py It may look unusual that the application has been created within the project directory. Using the project's namespace avoids name clashes with external modules (a topic that goes outside the scope of the quickstart). @@ -52,9 +55,9 @@ Now sync your database for the first time: python manage.py migrate -We'll also create an initial user named `admin` with a password of `password123`. We'll authenticate as that user later in our example. +We'll also create an initial user named `admin` with a password. We'll authenticate as that user later in our example. - python manage.py createsuperuser --email admin@example.com --username admin + python manage.py createsuperuser --username admin --email admin@example.com Once you've set up a database and the initial user is created and ready to go, open up the app's directory and we'll get coding... @@ -62,7 +65,7 @@ Once you've set up a database and the initial user is created and ready to go, o First up we're going to define some serializers. Let's create a new module named `tutorial/quickstart/serializers.py` that we'll use for our data representations. - from django.contrib.auth.models import User, Group + from django.contrib.auth.models import Group, User from rest_framework import serializers @@ -83,10 +86,10 @@ Notice that we're using hyperlinked relations in this case with `HyperlinkedMode Right, we'd better write some views then. Open `tutorial/quickstart/views.py` and get typing. - from django.contrib.auth.models import User, Group - from rest_framework import viewsets - from rest_framework import permissions - from tutorial.quickstart.serializers import UserSerializer, GroupSerializer + from django.contrib.auth.models import Group, User + from rest_framework import permissions, viewsets + + from tutorial.quickstart.serializers import GroupSerializer, UserSerializer class UserViewSet(viewsets.ModelViewSet): @@ -116,6 +119,7 @@ Okay, now let's wire up the API URLs. On to `tutorial/urls.py`... from django.urls import include, path from rest_framework import routers + from tutorial.quickstart import views router = routers.DefaultRouter() @@ -128,6 +132,8 @@ Okay, now let's wire up the API URLs. On to `tutorial/urls.py`... path('', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ] + + urlpatterns += router.urls Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class. @@ -164,9 +170,30 @@ We're now ready to test the API we've built. Let's fire up the server from the We can now access our API, both from the command-line, using tools like `curl`... - bash: curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/ + bash: curl -u admin -H 'Accept: application/json; indent=4' http://127.0.0.1:8000/users/ + Enter host password for user 'admin': { - "count": 2, + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "url": "http://127.0.0.1:8000/users/1/", + "username": "admin", + "email": "admin@example.com", + "groups": [] + } + ] + } + +Or using the [httpie][httpie], command line tool... + + bash: http -a admin http://127.0.0.1:8000/users/ + http: password for admin@127.0.0.1:8000:: + $HTTP/1.1 200 OK + ... + { + "count": 1, "next": null, "previous": null, "results": [ @@ -175,38 +202,6 @@ We can now access our API, both from the command-line, using tools like `curl`.. "groups": [], "url": "http://127.0.0.1:8000/users/1/", "username": "admin" - }, - { - "email": "tom@example.com", - "groups": [], - "url": "http://127.0.0.1:8000/users/2/", - "username": "tom" - } - ] - } - -Or using the [httpie][httpie], command line tool... - - bash: http -a admin:password123 http://127.0.0.1:8000/users/ - - HTTP/1.1 200 OK - ... - { - "count": 2, - "next": null, - "previous": null, - "results": [ - { - "email": "admin@example.com", - "groups": [], - "url": "http://localhost:8000/users/1/", - "username": "paul" - }, - { - "email": "tom@example.com", - "groups": [], - "url": "http://127.0.0.1:8000/users/2/", - "username": "tom" } ] } @@ -225,4 +220,4 @@ If you want to get a more in depth understanding of how REST framework fits toge [image]: ../img/quickstart.png [tutorial]: 1-serialization.md [guide]: ../api-guide/requests.md -[httpie]: https://github.com/jakubroztocil/httpie#installation +[httpie]: https://httpie.io/docs#installation diff --git a/docs_theme/css/default.css b/docs_theme/css/default.css index 992bc60a4..7006f2a66 100644 --- a/docs_theme/css/default.css +++ b/docs_theme/css/default.css @@ -37,7 +37,7 @@ body.index-page #main-content iframe.github-star-button { margin-right: -15px; } -/* Travis CI and PyPI badge */ +/* CI and PyPI badge */ body.index-page #main-content img.status-badge { float: right; margin-right: 8px; diff --git a/mkdocs.yml b/mkdocs.yml index 573898bca..dcef68987 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -53,7 +53,6 @@ nav: - 'Settings': 'api-guide/settings.md' - Topics: - 'Documenting your API': 'topics/documenting-your-api.md' - - 'API Clients': 'topics/api-clients.md' - 'Internationalization': 'topics/internationalization.md' - 'AJAX, CSRF & CORS': 'topics/ajax-csrf-cors.md' - 'HTML & Forms': 'topics/html-and-forms.md' @@ -66,6 +65,8 @@ nav: - 'Contributing to REST framework': 'community/contributing.md' - 'Project management': 'community/project-management.md' - 'Release Notes': 'community/release-notes.md' + - '3.14 Announcement': 'community/3.14-announcement.md' + - '3.13 Announcement': 'community/3.13-announcement.md' - '3.12 Announcement': 'community/3.12-announcement.md' - '3.11 Announcement': 'community/3.11-announcement.md' - '3.10 Announcement': 'community/3.10-announcement.md' diff --git a/requirements.txt b/requirements.txt index b4e5ff579..c3a1f1187 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ # The base set of requirements for REST framework is actually -# just Django, but for the purposes of development and testing -# there are a number of packages that are useful to install. +# just Django and pytz, but for the purposes of development +# and testing there are a number of packages that are useful +# to install. # Laying these out as separate requirements files, allows us to # only included the relevant sets when running tox, and ensures @@ -9,5 +10,4 @@ -r requirements/requirements-optionals.txt -r requirements/requirements-testing.txt -r requirements/requirements-documentation.txt --r requirements/requirements-codestyle.txt -r requirements/requirements-packaging.txt diff --git a/requirements/requirements-codestyle.txt b/requirements/requirements-codestyle.txt deleted file mode 100644 index 4f54d6e77..000000000 --- a/requirements/requirements-codestyle.txt +++ /dev/null @@ -1,7 +0,0 @@ -# PEP8 code linting, which we run on all commits. -flake8==3.8.3 -flake8-tidy-imports==4.1.0 -pycodestyle==2.6.0 - -# Sort and lint imports -isort==5.4.2 diff --git a/requirements/requirements-documentation.txt b/requirements/requirements-documentation.txt index e969ff471..cf2dc26e8 100644 --- a/requirements/requirements-documentation.txt +++ b/requirements/requirements-documentation.txt @@ -1,2 +1,3 @@ # MkDocs to build our documentation. -mkdocs==1.1 +mkdocs>=1.1.2,<1.2 +jinja2>=2.10,<3.1.0 # contextfilter has been renamed diff --git a/requirements/requirements-optionals.txt b/requirements/requirements-optionals.txt index 2b7a18a13..3fffcd529 100644 --- a/requirements/requirements-optionals.txt +++ b/requirements/requirements-optionals.txt @@ -1,9 +1,10 @@ # Optional packages which may be used with REST framework. -psycopg2-binary>=2.8.5, <2.9 -markdown==3.1.1 -pygments==2.4.2 -django-guardian==2.2.0 -django-filter>=2.2.0, <2.3 coreapi==2.3.1 coreschema==0.0.4 -pyyaml>=5.1 +django-filter>=2.4.0,<3.0 +django-guardian>=2.4.0,<2.5 +inflection==0.5.1 +markdown==3.3 +psycopg2-binary>=2.9.5,<2.10 +pygments==2.12 +pyyaml>=5.3.1,<5.4 diff --git a/requirements/requirements-packaging.txt b/requirements/requirements-packaging.txt index 091622fbe..fae03baab 100644 --- a/requirements/requirements-packaging.txt +++ b/requirements/requirements-packaging.txt @@ -1,8 +1,8 @@ # Wheel for PyPI installs. -wheel==0.34.2 +wheel>=0.35.1,<0.36 # Twine for secured PyPI uploads. -twine==3.1.1 +twine>=3.2.0,<3.3 # Transifex client for managing translation resources. -transifex-client==0.13.9 +transifex-client>=0.13.12,<0.14 diff --git a/requirements/requirements-testing.txt b/requirements/requirements-testing.txt index ad246e857..fb6dbf05f 100644 --- a/requirements/requirements-testing.txt +++ b/requirements/requirements-testing.txt @@ -1,4 +1,5 @@ # Pytest for running the tests. -pytest>=5.4.1,<5.5 -pytest-django>=3.9.0,<3.10 -pytest-cov>=2.7.1 +pytest>=6.2.0,<8.0 +pytest-cov>=4.0.0,<5.0 +pytest-django>=4.5.2,<5.0 +importlib-metadata<5.0 diff --git a/rest_framework/__init__.py b/rest_framework/__init__.py index ec44350eb..870782d75 100644 --- a/rest_framework/__init__.py +++ b/rest_framework/__init__.py @@ -10,7 +10,7 @@ ______ _____ _____ _____ __ import django __title__ = 'Django REST framework' -__version__ = '3.12.1' +__version__ = '3.14.0' __author__ = 'Tom Christie' __license__ = 'BSD 3-Clause' __copyright__ = 'Copyright 2011-2019 Encode OSS Ltd' @@ -29,11 +29,7 @@ if django.VERSION < (3, 2): default_app_config = 'rest_framework.apps.RestFrameworkConfig' -class RemovedInDRF313Warning(DeprecationWarning): - pass - - -class RemovedInDRF314Warning(PendingDeprecationWarning): +class RemovedInDRF315Warning(DeprecationWarning): pass diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py index 9111007c0..382abf158 100644 --- a/rest_framework/authentication.py +++ b/rest_framework/authentication.py @@ -227,6 +227,6 @@ class RemoteUserAuthentication(BaseAuthentication): header = "REMOTE_USER" def authenticate(self, request): - user = authenticate(remote_user=request.META.get(self.header)) + user = authenticate(request=request, remote_user=request.META.get(self.header)) if user and user.is_active: return (user, None) diff --git a/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py b/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py new file mode 100644 index 000000000..0ca9f5d79 --- /dev/null +++ b/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.3 on 2022-11-24 21:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('authtoken', '0003_tokenproxy'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tokenproxy', + options={'verbose_name': 'Token', 'verbose_name_plural': 'Tokens'}, + ), + ] diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py index 540049295..6a17c2452 100644 --- a/rest_framework/authtoken/models.py +++ b/rest_framework/authtoken/models.py @@ -46,9 +46,10 @@ class TokenProxy(Token): """ @property def pk(self): - return self.user.pk + return self.user_id class Meta: proxy = 'rest_framework.authtoken' in settings.INSTALLED_APPS abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS - verbose_name = "token" + verbose_name = _("Token") + verbose_name_plural = _("Tokens") diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 4bae7729f..ac5cbc572 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -2,6 +2,7 @@ The `compat` module provides support for backwards compatibility with older versions of Django/Python, and compatibility wrappers around optional packages. """ +import django from django.conf import settings from django.views.generic import View @@ -152,6 +153,30 @@ else: return False +if django.VERSION >= (4, 2): + # Django 4.2+: use the stock parse_header_parameters function + # Note: Django 4.1 also has an implementation of parse_header_parameters + # which is slightly different from the one in 4.2, it needs + # the compatibility shim as well. + from django.utils.http import parse_header_parameters +else: + # Django <= 4.1: create a compatibility shim for parse_header_parameters + from django.http.multipartparser import parse_header + + def parse_header_parameters(line): + # parse_header works with bytes, but parse_header_parameters + # works with strings. Call encode to convert the line to bytes. + main_value_pair, params = parse_header(line.encode()) + return main_value_pair, { + # parse_header will convert *some* values to string. + # parse_header_parameters converts *all* values to string. + # Make sure all values are converted by calling decode on + # any remaining non-string values. + k: v if isinstance(v, str) else v.decode() + for k, v in params.items() + } + + # `separators` argument to `json.dumps()` differs between 2.x and 3.x # See: https://bugs.python.org/issue22767 SHORT_SEPARATORS = (',', ':') diff --git a/rest_framework/decorators.py b/rest_framework/decorators.py index 30b9d84d4..3b572c09e 100644 --- a/rest_framework/decorators.py +++ b/rest_framework/decorators.py @@ -142,7 +142,7 @@ def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs): how the `@renderer_classes` etc. decorators work for function- based API views. """ - methods = ['get'] if (methods is None) else methods + methods = ['get'] if methods is None else methods methods = [method.lower() for method in methods] assert detail is not None, ( diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py index 943dcc88c..09f111102 100644 --- a/rest_framework/exceptions.py +++ b/rest_framework/exceptions.py @@ -1,7 +1,7 @@ """ Handled exceptions raised by REST framework. -In addition Django's built in 403 and 404 exceptions are handled. +In addition, Django's built in 403 and 404 exceptions are handled. (`django.http.Http404` and `django.core.exceptions.PermissionDenied`) """ import math @@ -20,7 +20,7 @@ def _get_error_details(data, default_code=None): Descend into a nested data structure, forcing any lazy translation strings or strings into `ErrorDetail`. """ - if isinstance(data, list): + if isinstance(data, (list, tuple)): ret = [ _get_error_details(item, default_code) for item in data ] @@ -72,16 +72,19 @@ class ErrorDetail(str): return self def __eq__(self, other): - r = super().__eq__(other) - if r is NotImplemented: + result = super().__eq__(other) + if result is NotImplemented: return NotImplemented try: - return r and self.code == other.code + return result and self.code == other.code except AttributeError: - return r + return result def __ne__(self, other): - return not self.__eq__(other) + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result def __repr__(self): return 'ErrorDetail(string=%r, code=%r)' % ( @@ -150,7 +153,9 @@ class ValidationError(APIException): # For validation failures, we may collect many errors together, # so the details should always be coerced to a list if not already. - if not isinstance(detail, dict) and not isinstance(detail, list): + if isinstance(detail, tuple): + detail = list(detail) + elif not isinstance(detail, dict) and not isinstance(detail, list): detail = [detail] self.detail = _get_error_details(detail, code) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index fdfba13f2..4eae004dc 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1,3 +1,4 @@ +import contextlib import copy import datetime import decimal @@ -5,7 +6,6 @@ import functools import inspect import re import uuid -import warnings from collections import OrderedDict from collections.abc import Mapping @@ -27,13 +27,10 @@ from django.utils.duration import duration_string from django.utils.encoding import is_protected_type, smart_str from django.utils.formats import localize_input, sanitize_separators from django.utils.ipv6 import clean_ipv6_address -from django.utils.timezone import utc from django.utils.translation import gettext_lazy as _ from pytz.exceptions import InvalidTimeError -from rest_framework import ( - ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning -) +from rest_framework import ISO_8601 from rest_framework.exceptions import ErrorDetail, ValidationError from rest_framework.settings import api_settings from rest_framework.utils import html, humanize_datetime, json, representation @@ -63,6 +60,9 @@ def is_simple_callable(obj): """ True if the object is a callable that takes no arguments. """ + if not callable(obj): + return False + # Bail early since we cannot inspect built-in function signatures. if inspect.isbuiltin(obj): raise BuiltinSignatureError( @@ -263,16 +263,6 @@ class CreateOnlyDefault: if is_update: raise SkipField() if callable(self.default): - if hasattr(self.default, 'set_context'): - warnings.warn( - "Method `set_context` on defaults is deprecated and will " - "no longer be called starting with 3.13. Instead set " - "`requires_context = True` on the class, and accept the " - "context as an additional argument.", - RemovedInDRF313Warning, stacklevel=2 - ) - self.default.set_context(self) - if getattr(self.default, 'requires_context', False): return self.default(serializer_field) else: @@ -320,7 +310,7 @@ class Field: default_empty_html = empty initial = None - def __init__(self, read_only=False, write_only=False, + def __init__(self, *, read_only=False, write_only=False, required=None, default=empty, initial=empty, source=None, label=None, help_text=None, style=None, error_messages=None, validators=None, allow_null=False): @@ -502,16 +492,6 @@ class Field: # No default, or this is a partial update. raise SkipField() if callable(self.default): - if hasattr(self.default, 'set_context'): - warnings.warn( - "Method `set_context` on defaults is deprecated and will " - "no longer be called starting with 3.13. Instead set " - "`requires_context = True` on the class, and accept the " - "context as an additional argument.", - RemovedInDRF313Warning, stacklevel=2 - ) - self.default.set_context(self) - if getattr(self.default, 'requires_context', False): return self.default(self) else: @@ -576,16 +556,6 @@ class Field: """ errors = [] for validator in self.validators: - if hasattr(validator, 'set_context'): - warnings.warn( - "Method `set_context` on validators is deprecated and will " - "no longer be called starting with 3.13. Instead set " - "`requires_context = True` on the class, and accept the " - "context as an additional argument.", - RemovedInDRF313Warning, stacklevel=2 - ) - validator.set_context(self) - try: if getattr(validator, 'requires_context', False): validator(value, self) @@ -704,7 +674,7 @@ class BooleanField(Field): initial = False TRUE_VALUES = { 't', 'T', - 'y', 'Y', 'yes', 'YES', + 'y', 'Y', 'yes', 'Yes', 'YES', 'true', 'True', 'TRUE', 'on', 'On', 'ON', '1', 1, @@ -712,7 +682,7 @@ class BooleanField(Field): } FALSE_VALUES = { 'f', 'F', - 'n', 'N', 'no', 'NO', + 'n', 'N', 'no', 'No', 'NO', 'false', 'False', 'FALSE', 'off', 'Off', 'OFF', '0', 0, 0.0, @@ -721,15 +691,13 @@ class BooleanField(Field): NULL_VALUES = {'null', 'Null', 'NULL', '', None} def to_internal_value(self, data): - try: + with contextlib.suppress(TypeError): if data in self.TRUE_VALUES: return True elif data in self.FALSE_VALUES: return False elif data in self.NULL_VALUES and self.allow_null: return None - except TypeError: # Input is an unhashable type - pass self.fail('invalid', input=data) def to_representation(self, value): @@ -742,23 +710,6 @@ class BooleanField(Field): return bool(value) -class NullBooleanField(BooleanField): - initial = None - - def __init__(self, **kwargs): - warnings.warn( - "The `NullBooleanField` is deprecated and will be removed starting " - "with 3.14. Instead use the `BooleanField` field and set " - "`allow_null=True` which does the same thing.", - RemovedInDRF314Warning, stacklevel=2 - ) - - assert 'allow_null' not in kwargs, '`allow_null` is not a valid option.' - kwargs['allow_null'] = True - - super().__init__(**kwargs) - - # String types... class CharField(Field): @@ -968,7 +919,8 @@ class FloatField(Field): 'invalid': _('A valid number is required.'), 'max_value': _('Ensure this value is less than or equal to {max_value}.'), 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), - 'max_string_length': _('String value too large.') + 'max_string_length': _('String value too large.'), + 'overflow': _('Integer value too large to convert to float') } MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. @@ -994,6 +946,8 @@ class FloatField(Field): return float(data) except (TypeError, ValueError): self.fail('invalid') + except OverflowError: + self.fail('overflow') def to_representation(self, value): return float(value) @@ -1012,10 +966,11 @@ class DecimalField(Field): MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None, - localize=False, rounding=None, **kwargs): + localize=False, rounding=None, normalize_output=False, **kwargs): self.max_digits = max_digits self.decimal_places = decimal_places self.localize = localize + self.normalize_output = normalize_output if coerce_to_string is not None: self.coerce_to_string = coerce_to_string if self.localize: @@ -1046,6 +1001,11 @@ class DecimalField(Field): 'Invalid rounding option %s. Valid values for rounding are: %s' % (rounding, valid_roundings)) self.rounding = rounding + def validate_empty_values(self, data): + if smart_str(data).strip() == '' and self.allow_null: + return (True, None) + return super().validate_empty_values(data) + def to_internal_value(self, data): """ Validate that the input is a decimal number and return a Decimal @@ -1112,11 +1072,20 @@ class DecimalField(Field): def to_representation(self, value): coerce_to_string = getattr(self, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING) + if value is None: + if coerce_to_string: + return '' + else: + return None + if not isinstance(value, decimal.Decimal): value = decimal.Decimal(str(value).strip()) quantized = self.quantize(value) + if self.normalize_output: + quantized = quantized.normalize() + if not coerce_to_string: return quantized if self.localize: @@ -1152,21 +1121,21 @@ class DateTimeField(Field): } datetime_parser = datetime.datetime.strptime - def __init__(self, format=empty, input_formats=None, default_timezone=None, *args, **kwargs): + def __init__(self, format=empty, input_formats=None, default_timezone=None, **kwargs): if format is not empty: self.format = format if input_formats is not None: self.input_formats = input_formats if default_timezone is not None: self.timezone = default_timezone - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def enforce_timezone(self, value): """ When `self.default_timezone` is `None`, always return naive datetimes. When `self.default_timezone` is not `None`, always return aware datetimes. """ - field_timezone = getattr(self, 'timezone', self.default_timezone()) + field_timezone = self.timezone if hasattr(self, 'timezone') else self.default_timezone() if field_timezone is not None: if timezone.is_aware(value): @@ -1179,7 +1148,7 @@ class DateTimeField(Field): except InvalidTimeError: self.fail('make_aware', timezone=field_timezone) elif (field_timezone is None) and timezone.is_aware(value): - return timezone.make_naive(value, utc) + return timezone.make_naive(value, datetime.timezone.utc) return value def default_timezone(self): @@ -1195,19 +1164,14 @@ class DateTimeField(Field): return self.enforce_timezone(value) for input_format in input_formats: - if input_format.lower() == ISO_8601: - try: + with contextlib.suppress(ValueError, TypeError): + if input_format.lower() == ISO_8601: parsed = parse_datetime(value) if parsed is not None: return self.enforce_timezone(parsed) - except (ValueError, TypeError): - pass - else: - try: - parsed = self.datetime_parser(value, input_format) - return self.enforce_timezone(parsed) - except (ValueError, TypeError): - pass + + parsed = self.datetime_parser(value, input_format) + return self.enforce_timezone(parsed) humanized_format = humanize_datetime.datetime_formats(input_formats) self.fail('invalid', format=humanized_format) @@ -1238,12 +1202,12 @@ class DateField(Field): } datetime_parser = datetime.datetime.strptime - def __init__(self, format=empty, input_formats=None, *args, **kwargs): + def __init__(self, format=empty, input_formats=None, **kwargs): if format is not empty: self.format = format if input_formats is not None: self.input_formats = input_formats - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def to_internal_value(self, value): input_formats = getattr(self, 'input_formats', api_settings.DATE_INPUT_FORMATS) @@ -1304,12 +1268,12 @@ class TimeField(Field): } datetime_parser = datetime.datetime.strptime - def __init__(self, format=empty, input_formats=None, *args, **kwargs): + def __init__(self, format=empty, input_formats=None, **kwargs): if format is not empty: self.format = format if input_formats is not None: self.input_formats = input_formats - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def to_internal_value(self, value): input_formats = getattr(self, 'input_formats', api_settings.TIME_INPUT_FORMATS) @@ -1365,6 +1329,7 @@ class DurationField(Field): 'invalid': _('Duration has wrong format. Use one of these formats instead: {format}.'), 'max_value': _('Ensure this value is less than or equal to {max_value}.'), 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'overflow': _('The number of days must be between {min_days} and {max_days}.'), } def __init__(self, **kwargs): @@ -1383,7 +1348,10 @@ class DurationField(Field): def to_internal_value(self, value): if isinstance(value, datetime.timedelta): return value - parsed = parse_duration(str(value)) + try: + parsed = parse_duration(str(value)) + except OverflowError: + self.fail('overflow', min_days=datetime.timedelta.min.days, max_days=datetime.timedelta.max.days) if parsed is not None: return parsed self.fail('invalid', format='[DD] [HH:[MM:]]ss[.uuuuuu]') @@ -1459,9 +1427,9 @@ class MultipleChoiceField(ChoiceField): } default_empty_html = [] - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.allow_empty = kwargs.pop('allow_empty', True) - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def get_value(self, dictionary): if self.field_name not in dictionary: @@ -1480,6 +1448,8 @@ class MultipleChoiceField(ChoiceField): self.fail('empty') return { + # Arguments for super() are needed because of scoping inside + # comprehensions. super(MultipleChoiceField, self).to_internal_value(item) for item in data } @@ -1518,12 +1488,12 @@ class FileField(Field): 'max_length': _('Ensure this filename has at most {max_length} characters (it has {length}).'), } - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.max_length = kwargs.pop('max_length', None) self.allow_empty_file = kwargs.pop('allow_empty_file', False) if 'use_url' in kwargs: self.use_url = kwargs.pop('use_url') - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def to_internal_value(self, data): try: @@ -1567,9 +1537,9 @@ class ImageField(FileField): ), } - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self._DjangoImageField = kwargs.pop('_DjangoImageField', DjangoImageField) - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def to_internal_value(self, data): # Image validation is a bit grungy, so we'll just outright @@ -1584,8 +1554,8 @@ class ImageField(FileField): # Composite field types... class _UnvalidatedField(Field): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, **kwargs): + super().__init__(**kwargs) self.allow_blank = True self.allow_null = True @@ -1606,7 +1576,7 @@ class ListField(Field): 'max_length': _('Ensure this field has no more than {max_length} elements.') } - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.child = kwargs.pop('child', copy.deepcopy(self.child)) self.allow_empty = kwargs.pop('allow_empty', True) self.max_length = kwargs.pop('max_length', None) @@ -1618,7 +1588,7 @@ class ListField(Field): "Remove `source=` from the field declaration." ) - super().__init__(*args, **kwargs) + super().__init__(**kwargs) self.child.bind(field_name='', parent=self) if self.max_length is not None: message = lazy_format(self.error_messages['max_length'], max_length=self.max_length) @@ -1683,7 +1653,7 @@ class DictField(Field): 'empty': _('This dictionary may not be empty.'), } - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.child = kwargs.pop('child', copy.deepcopy(self.child)) self.allow_empty = kwargs.pop('allow_empty', True) @@ -1693,7 +1663,7 @@ class DictField(Field): "Remove `source=` from the field declaration." ) - super().__init__(*args, **kwargs) + super().__init__(**kwargs) self.child.bind(field_name='', parent=self) def get_value(self, dictionary): @@ -1742,8 +1712,8 @@ class DictField(Field): class HStoreField(DictField): child = CharField(allow_blank=True, allow_null=True) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, **kwargs): + super().__init__(**kwargs) assert isinstance(self.child, CharField), ( "The `child` argument must be an instance of `CharField`, " "as the hstore extension stores values as strings." @@ -1755,11 +1725,14 @@ class JSONField(Field): 'invalid': _('Value must be valid JSON.') } - def __init__(self, *args, **kwargs): + # Workaround for isinstance calls when importing the field isn't possible + _is_jsonfield = True + + def __init__(self, **kwargs): self.binary = kwargs.pop('binary', False) self.encoder = kwargs.pop('encoder', None) self.decoder = kwargs.pop('decoder', None) - super().__init__(*args, **kwargs) + super().__init__(**kwargs) def get_value(self, dictionary): if html.is_html_input(dictionary) and self.field_name in dictionary: @@ -1846,7 +1819,7 @@ class SerializerMethodField(Field): For example: - class ExampleSerializer(self): + class ExampleSerializer(Serializer): extra_info = SerializerMethodField() def get_extra_info(self, obj): diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 6fc6a502f..c7d7c3d43 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -232,10 +232,20 @@ class OrderingFilter(BaseFilterBackend): ) raise ImproperlyConfigured(msg % self.__class__.__name__) + model_class = queryset.model + model_property_names = [ + # 'pk' is a property added in Django's Model class, however it is valid for ordering. + attr for attr in dir(model_class) if isinstance(getattr(model_class, attr), property) and attr != 'pk' + ] + return [ (field.source.replace('.', '__') or field_name, field.label) for field_name, field in serializer_class(context=context).fields.items() - if not getattr(field, 'write_only', False) and not field.source == '*' + if ( + not getattr(field, 'write_only', False) and + not field.source == '*' and + field.source not in model_property_names + ) ] def get_valid_fields(self, queryset, view, context={}): diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.mo b/rest_framework/locale/ar/LC_MESSAGES/django.mo index 19a41dfd6..f793d7c73 100644 Binary files a/rest_framework/locale/ar/LC_MESSAGES/django.mo and b/rest_framework/locale/ar/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.po b/rest_framework/locale/ar/LC_MESSAGES/django.po index 968ce0661..58f72ec17 100644 --- a/rest_framework/locale/ar/LC_MESSAGES/django.po +++ b/rest_framework/locale/ar/LC_MESSAGES/django.po @@ -7,13 +7,14 @@ # aymen chaieb , 2017 # Bashar Al-Abdulhadi, 2016-2017 # Eyad Toma , 2015,2017 +# zak zak , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-10-18 09:51+0000\n" -"Last-Translator: Andrew Ayoub \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Arabic (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,40 +22,40 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." -msgstr "" +msgstr "رأس أساسي غير صالح, لم تقدم اي بيانات." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "" +msgstr "رأس أساسي غير صالح, سلسلة البيانات لا يجب أن تحتوي على أي أحرف مسافات" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "" +msgstr "رأس أساسي غير صالح, البيانات ليست مرمّزة بصحة على أساس64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "اسم المستخدم/كلمة السر غير صحيحين." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "المستخدم غير مفعل او تم حذفه." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "" +msgstr "رمز الراْس المميّز غير صالح, لم تقدم أي بيانات." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "" +msgstr "رمز الراْس المميّز غير صالح, سلسلة الرمز المميّز لا يجب أن تحتوي على أي أحرف مسافات." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "رمز الراْس المميّز غير صالح, سلسلة الرمز المميّز لا يجب أن تحتوي على أي أحرف غير صالحة." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "رمز غير صحيح." @@ -62,382 +63,515 @@ msgstr "رمز غير صحيح." msgid "Auth Token" msgstr "رمز التفويض" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "المفتاح" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "المستخدم" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "أنشئ" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "الرمز" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "الرموز" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "اسم المستخدم" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "كلمة المرور" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "حساب المستخدم غير مفعل." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "تعذر تسجيل الدخول بالبيانات التي ادخلتها." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "يجب أن تتضمن \"اسم المستخدم\" و \"كلمة المرور\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "حدث خطأ في المخدم." -#: exceptions.py:84 -msgid "Malformed request." +#: exceptions.py:142 +msgid "Invalid input." msgstr "" -#: exceptions.py:89 +#: exceptions.py:161 +msgid "Malformed request." +msgstr "الطلب صيغ بشكل سيء." + +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "بيانات الدخول غير صحيحة." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "لم يتم تزويد بيانات الدخول." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "ليس لديك صلاحية للقيام بهذا الإجراء." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "غير موجود." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "طلب غير مسموح به" +msgstr "الطريقة \"{method}\" غير مسموح بها." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "لم نتمكن من تلبية الرٱس Accept في الطلب." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "الوسيط \"{media_type}\" الموجود في الطلب غير معتمد." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." +msgstr "تم تقييد الطلب." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "هذا الحقل مطلوب." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" ليس قيمة منطقية." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "تأكد ان الحقل لا يزيد عن {max_length} محرف." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "تأكد ان الحقل {min_length} محرف على الاقل." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "عليك ان تدخل بريد إلكتروني صالح." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "هذه القيمة لا تطابق النمط المطلوب." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." +msgstr "أدخل \"slug\" صالح يحتوي على حروف، أرقام، شُرط سفلية أو واصلات." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." msgstr "" -#: fields.py:747 +#: fields.py:854 msgid "Enter a valid URL." msgstr "الرجاء إدخال رابط إلكتروني صالح." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "برجاء إدخال عنوان IPV4 أو IPV6 صحيح" +msgstr "أدخِل عنوان IPV4 أو IPV6 صحيح." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "الرجاء إدخال رقم صحيح صالح." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "تأكد ان القيمة أقل أو تساوي {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "تأكد ان القيمة أكبر أو تساوي {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." -msgstr "القيمه اكبر من المسموح" +msgstr "السلسلة اطول من القيمة المسموح بها." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "الرجاء إدخال رقم صالح." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "تأكد ان القيمة لا تحوي أكثر من {max_digits} رقم." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "تأكد انه لا يوجد اكثر من {max_decimal_places} منازل عشرية." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "تأكد انه لا يوجد اكثر من {max_whole_digits} أرقام قبل النقطة العشرية." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "صيغة التاريخ و الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "متوقع تاريخ و وقت و وجد تاريخ فقط" -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "صيغة التاريخ غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "متوقع تاريخ فقط و وجد تاريخ ووقت" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "صيغة الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "صيغة المده غير صحيحه, برجاء إستخدام أحد هذه الصيغ {format}" +msgstr "صيغة المدة غير صحيحه, يرجى إستخدام إحدى هذه الصيغ: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ليست واحدة من الخيارات الصالحة." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "أكثر من {count} عنصر..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "المتوقع وجود قائمة عناصر لكن وجد النوع \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "هذا التحديد لا يجب أن يكون فارغا." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "{input} كإختيار مسار غير صالح." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "لم يتم إرسال أي ملف." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "المعطيات المرسولة ليست ملف. إفحص نوع الترميز في النموذج." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." -msgstr "" +msgstr "ما من إسم ملف أمكن تحديده." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "الملف الذي تم إرساله فارغ." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "تأكد ان اسم الملف لا يحوي أكثر من {max_length} محرف (الإسم المرسل يحوي {length} محرف)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "الرجاء تحميل صورة صالحة. الملف الذي تم تحميله إما لم يكن صورة او انه كان صورة تالفة." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "القائمة يجب أن لا تكون فارغة." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "المتوقع كان قاموس عناصر و لكن النوع المتحصل عليه هو \"{input_type}\"." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." -msgstr "" +msgstr "القيمة يجب أن تكون JSON صالح." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "أرسل" - -#: filters.py:336 -msgid "ascending" -msgstr "تصاعدي" - -#: filters.py:337 -msgid "descending" -msgstr "تنازلي" - -#: pagination.py:193 -msgid "Invalid page." -msgstr "صفحة غير صحيحة." - -#: pagination.py:427 -msgid "Invalid cursor" -msgstr "" - -#: relations.py:207 -msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود." - -#: relations.py:208 -msgid "Incorrect type. Expected pk value, received {data_type}." -msgstr "" - -#: relations.py:240 -msgid "Invalid hyperlink - No URL match." -msgstr "" - -#: relations.py:241 -msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" - -#: relations.py:242 -msgid "Invalid hyperlink - Object does not exist." -msgstr "" - -#: relations.py:243 -msgid "Incorrect type. Expected URL string, received {data_type}." -msgstr "" - -#: relations.py:401 -msgid "Object with {slug_name}={value} does not exist." -msgstr "" - -#: relations.py:402 -msgid "Invalid value." -msgstr "قيمة غير صالحة." - -#: serializers.py:326 -msgid "Invalid data. Expected a dictionary, but got {datatype}." -msgstr "" - -#: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 -msgid "Filters" -msgstr "مرشحات" - -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "مرشحات الحقول" - -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "الترتيب" - -#: templates/rest_framework/filters/search.html:2 +#: filters.py:49 templates/rest_framework/filters/search.html:2 msgid "Search" msgstr "بحث" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "الترتيب" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "تصاعدي" + +#: filters.py:288 +msgid "descending" +msgstr "تنازلي" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "صفحة غير صحيحة." + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "مؤشر غير صالح" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود." + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "نوع خاطئ. المتوقع قيمة من pk، لكن المتحصل عليه {data_type}." + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "إرتباط تشعبي غير صالح - لا مطابقة لURL." + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "إرتباط تشعبي غير صالح - مطابقة خاطئة لURL." + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "إرتباط تشعبي غير صالح - عنصر غير موجود." + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "نوع خاطئ. المتوقع سلسلة URL، لكن المتحصل عليه {data_type}." + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "عنصر ب {slug_name}={value} غير موجود." + +#: relations.py:449 +msgid "Invalid value." +msgstr "قيمة غير صالحة." + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "معطيات غير صالحة. المتوقع هو قاموس، لكن المتحصل عليه {datatype}." + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "مرشحات" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "لا شيء" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "ما من عناصر للتحديد." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "هذا الحقل يجب أن يكون فريد" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." +msgstr "الحقول {field_names} يجب أن تشكل مجموعة فريدة." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." msgstr "" -#: validators.py:245 +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "" +msgstr "الحقل يجب ان يكون فريد للتاريخ {date_field}." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "" +msgstr "الحقل يجب ان يكون فريد للشهر {date_field}." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "" +msgstr "الحقل يجب ان يكون فريد للعام {date_field}." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "إصدار غير صالح في الرٱس \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." -msgstr "" +msgstr "إصدار غير صالح في المسار URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr " إصدار غير صالح في المسار URL. لا يطابق أي إصدار من مساحة الإسم." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." -msgstr "" +msgstr "إصدار غير صالح في اسم المضيف." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." -msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "ليس لديك صلاحية." +msgstr "إصدار غير صالح في معلمة الإستعلام." diff --git a/rest_framework/locale/az/LC_MESSAGES/django.mo b/rest_framework/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 000000000..08648351e Binary files /dev/null and b/rest_framework/locale/az/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/az/LC_MESSAGES/django.po b/rest_framework/locale/az/LC_MESSAGES/django.po new file mode 100644 index 000000000..43a224259 --- /dev/null +++ b/rest_framework/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,573 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emin Mastizada , 2020 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "Xətalı sadə başlıq. İstifadəçi məlumatları təchiz edilməyib." + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "Xətalı sadə başlıq. İstifadəçi məlumatlarında boşluq olmamalıdır." + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "Xətalı sadə başlıq. İstifadəçi məlumatları base64 ilə düzgün şifrələnməyib." + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "Xətalı istifadəçi adı/parol." + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "İstifadəçi aktiv deyil və ya silinib." + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "Xətalı token başlığı. İstifadəçi məlumatları təchiz edilməyib." + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "Xətalı token başlığı. Token mətnində boşluqlar olmamalıdır." + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "Xətalı token başlığı. Token mətnində xətalı simvollar olmamalıdır." + +#: authentication.py:203 +msgid "Invalid token." +msgstr "Xətalı token." + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "Təsdiqləmə Tokeni" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "Açar" + +#: authtoken/models.py:16 +msgid "User" +msgstr "İstifadəçi" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "Yaradılıb" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "Token" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "Tokenlər" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "İstifadəçi adı" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "Parol" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "Təchiz edilən istifadəçi məlumatları ilə daxil olmaq mümkün olmadı." + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "Mütləq \"username\" və \"password\" olmalıdır." + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "Server xətası yaşandı." + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "Qüsurlu istək." + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "Səhv təsdiqləmə məlumatları." + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "Təsdiqləmə məlumatları təchiz edilməyib." + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "Bu əməliyyat üçün icazəniz yoxdur." + +#: exceptions.py:185 +msgid "Not found." +msgstr "Tapılmadı." + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "\"{method}\" yöntəminə icazə verilmir." + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "İstəyin Accept başlığını qane etmək mümkün olmadı." + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "İstəkdə dəstəklənməyən \"{media_type}\" mediya növü." + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "İstək nəzərə alınmadı." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "Bu sahə tələb edilir." + +#: fields.py:317 +msgid "This field may not be null." +msgstr "Bu sahə null ola bilməz." + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "Bu sahə boş ola bilməz." + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "Bu sahənin ən çox {max_length} simvolu olduğuna əmin olun." + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "Bu sahənin ən az {min_length} simvolu olduğuna əmin olun." + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "Keçərli e-poçt ünvanı daxil edin." + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "Bu dəyər tələb edilən formaya uyğun gəlmir." + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "Hərf, rəqəm, alt xətt və defislərdən ibarət keçərli \"slug\" daxil edin." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "Keçərli URL daxil edin." + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Keçərli IPv4 və ya IPv6 ünvanı daxil edin." + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "Keçərli tam ədəd tələb edilir." + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "Bu dəyərin uzunluğunun ən çox {max_value} olduğuna əmin olun." + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "Bu dəyərin uzunluğunun ən az {min_value} olduğuna əmin olun." + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "Yazı dəyəri çox uzundur." + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "Keçərli rəqəm tələb edilir." + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "Ən çox {max_digits} rəqəm olduğuna əmin olun." + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "Ən çox {max_decimal_places} onluq kəsr hissəsi olduğuna əmin olun." + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "Onluq kərsdən əvvəl ən çox {max_whole_digits} rəqəm olduğuna əmin olun." + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "Datetime dəyəri səhvdir. Əvəzinə bu formatlardan birini işlədin: {format}." + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "Datetime gözlənirdi amma date gəldi." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Date dəyəri səhvdir. Əvəzinə bu formatlardan birini işlədin: {format}." + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "Date gözlənirdi amma datetime gəldi." + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "Vaxt formatı səhvdir. Əvəzinə bu formatlardan birini işlədin: {format}." + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "Müddət formatı səhvdir. Əvəzinə bu formatlardan birini işlədin: {format}." + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" keçərli seçim deyil." + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "{count} elementdən daha çoxdur..." + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "Elementlər siyahısı gözlənirdi, amma \"{input_type}\" növü gəldi." + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "Bu seçim boş ola bilməz." + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\" keçərli yol seçimi deyil." + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "Heç bir fayl göndərilmədi." + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "Göndərilən məlumat fayl deyildi. Anketin şifrələmə (encoding) növünü yoxlayın." + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "Faylın adı təyin edilə bilmədi." + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "Göndərilən fayl boşdur." + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "Fayl adının ən çox {max_length} simvoldan ibarət olduğuna əmin olun (hazırki: {length})." + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Keçərli şəkil yükləyin. Yüklədiyiniz fayl ya şəkil deyil, ya da ola bilsin zədələnib." + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "Bu siyahı boş ola bilməz." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Elementlərin kitabçası (dictionary) gözlənirdi amma \"{input_type}\" növü gəldi." + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "Dəyər keçərli JSON olmalıdır." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Axtarış" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sıralama" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "artan" + +#: filters.py:288 +msgid "descending" +msgstr "azalan" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "Xətalı səhifə." + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "Xətalı kursor" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "Xətalı pk \"{pk_value}\" - obyekt mövcud deyil." + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "Xətalı növ. PK dəyəri gözlənirdi, {data_type} alındı." + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "Xətalı hiperkeçid - Heç bir URL uyğun gəlmir." + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "Xətalı hiperkeçid - Xətalı URL uyğunluğu." + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "Xətalı hiperkeçid - Obyekt mövcud deyil." + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "Xətalı növ. URL yazısı gözlənirdi, {data_type} gəldi." + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "{slug_name}={value} üçün uyğun obyekt mövcud deyil." + +#: relations.py:449 +msgid "Invalid value." +msgstr "Xətalı dəyər." + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "Xətalı məlumat. Kitabça (dictionary) gözlənirdi, {datatype} gəldi." + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "Filterlər" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "Heç nə" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "Seçiləcək element yoxdur." + +#: validators.py:39 +msgid "This field must be unique." +msgstr "Bu sahə unikal olmalıdır." + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "{field_names} sahələri birlikdə unikal dəst olmalıdırlar." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "Bu sahə \"{date_field}\" günü üçün unikal olmalıdır." + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "Bu sahə \"{date_field}\" ayı üçün unikal olmalıdır." + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "Bu sahə \"{date_field}\" ili üçün unikal olmalıdır." + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "\"Accept\" başlığında xətalı versiya." + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "URL yolunda xətalı versiya." + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "URL yolunda xətalı versiya. Heç bir versiya namespace-inə uyğun gəlmir." + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "Hostname-də xətalı versiya." + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "Sorğu parametrində xətalı versiya." diff --git a/rest_framework/locale/bg/LC_MESSAGES/django.mo b/rest_framework/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 000000000..71a0d8a74 Binary files /dev/null and b/rest_framework/locale/bg/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/bg/LC_MESSAGES/django.po b/rest_framework/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 000000000..56e1c9ef8 --- /dev/null +++ b/rest_framework/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,572 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Bulgarian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "Невалиден header за базово удостоверение (basic authentication). Не се предоставени удостоверения." + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "Невалиден header за базово удостоверение (basic authentication). Носителите на удостоверение не трябва да съдържат интервали." + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "Невалиден header за базово удостоверение (basic authentication). Носителите на удостоверение не са кодирани в base64." + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "Невалидни потребителско име/парола." + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "Потребителят е неактивен или изтрит." + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "Невалиден token header. Не са предоставени носители на удостоверение." + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "Невалиден token header. Жетона (token-a) не трябва да съдържа интервали." + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "Невалиден token header. Жетона (token-a) не трябва да съдържа невалидни символи." + +#: authentication.py:203 +msgid "Invalid token." +msgstr "Невалиден жетон." + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "Жетон за удостоверение" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "Ключ" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Потребител" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "Създаден" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "Жетон" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "Жетони" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "Потребителско име" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "Парола" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "Не е възможен вход с предоставените удостоверения." + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "Трябва да съдържа \"username\" (потребителско име) и \"password\" (парола)." + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "Сървърна грешка." + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "Неправилно оформена заявка." + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "Невалидни носители на удостоверение." + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "Носители на удостоверение не са предоставени." + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "Нямате права да се направи това действие." + +#: exceptions.py:185 +msgid "Not found." +msgstr "Обектът не е намерен." + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "Метод \"{method}\" не е позволен." + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "Не може да бъде удовлетворен Accept header." + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "Неподдържан тип на документа \"{media_type}\" в заявката." + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "Заявката е ограничена." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "Това поле е задължително." + +#: fields.py:317 +msgid "This field may not be null." +msgstr "Това поле не може да има празна стойност." + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "Това поле не може да е празно." + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "Това поле не трябва да съдържа повече от {max_length} символа." + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "Това поле трябва да съдържа поде {min_length} символа." + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "Въведете валиден имейл адрес." + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "Тази стойност не съответства на изисквания шаблон." + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "Въведете валиден \"slug\" съдържащ латински букви, цифри, долни черти или тирета." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "Въведете валиден URL." + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Въведете валиден IPv4 или IPv6 адрес." + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "Необходимо е валидно цяло число." + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "Тази стойност трябва да е не повече от {max_value}." + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "Тази стойност трябва да е поне {min_value}." + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "Низът е прекалено голям." + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "Необходимо е валидно число." + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "Допустими са не повече от {max_digits} цифри." + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "Допустими са не повече от {max_decimal_places} цифри след десетичната запетая." + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "Допустими са не повече от {max_whole_digits} цифри преди десетичната запетая." + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "Датата и часът са в невалиден формат. Валидни са следните формати: {format}." + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "Очаква се дата и час, но е намерена само дата." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Дата е в невалиден формат. Валидни са следните формати: {format}." + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "Очаква се дата, но са подадени дата и час." + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "Времето е в невалиден формат. Валидни са следните формати: {format}." + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "Отрязъкът от време е в невалиден формат. Валидни са следните формати: {format}." + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" не е валиден избор." + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "Повече от {count} неща..." + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "Очаква се списък от неща, но е получен тип \"{input_type}\"." + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "Този избор не може да е празен." + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\" не е валиден избор за път." + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "Не е подаден файл." + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "Подадените данни не са файл. Проверете кодировката на формата." + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "Не може да бъде определено името на файла." + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "Подадения файл е празен." + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "Името на файла може да е до {max_length} символа (то е {length})." + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Невалидно изображение. Подадения файл не е изображение или е повредено изображение." + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "Този списък не може да е празен." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Очаква се асоциативен масив, но е получен \"{input_type}\"." + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "Стойността трябва да е валиден JSON." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Търсене" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Подредба" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "в нарастващ ред" + +#: filters.py:288 +msgid "descending" +msgstr "в намаляващ ред" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "Невалидна страница." + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "Невалиден курсор" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "Невалиден идентификатор \"{pk_value}\" - обектът не съществува." + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "Неправилен тип. Очакван е тип за основен ключ, получен е {data_type}." + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "Невалидна връзка (hyperlink) - няма намерен URL." + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "Невалидна връзка (hyperlink) - неправилно съвпадение на URL." + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "Невалидна връзка (hyperlink) - обектът не съществува." + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "Невалиден тип. Очаква се URL низ, получен е {data_type}." + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "Обект с {slug_name}={value} не съществува." + +#: relations.py:449 +msgid "Invalid value." +msgstr "Невалидна стойност." + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "Невалидни данни. Очаква се асоциативен масив, но е получен {datatype}." + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "Филтри" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "Нищо" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "Няма неща за избиране." + +#: validators.py:39 +msgid "This field must be unique." +msgstr "Това поле трябва да е уникално." + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "Полетата {field_names} трябва да образуват уникална комбинация." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "Това поле трябва да е уникално за \"{date_field}\" дата." + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "Това поле трябва да е уникално за \"{date_field}\" месец." + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "Това поле трябва да е уникално за \"{date_field}\" година." + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "Невалидна версия в \"Accept\" header." + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "Невалидна версия в URL пътя." + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "Невалидна версия в URL пътя. Няма съвпадение с пространството от имена на версии." + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "Невалидна версия в името на сървъра (hostname)." + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "Невалидна версия в GET параметър." diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.mo b/rest_framework/locale/ca/LC_MESSAGES/django.mo index 0f72ec039..7da9971a8 100644 Binary files a/rest_framework/locale/ca/LC_MESSAGES/django.mo and b/rest_framework/locale/ca/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.po b/rest_framework/locale/ca/LC_MESSAGES/django.po index f82de0068..03dbbad60 100644 --- a/rest_framework/locale/ca/LC_MESSAGES/django.po +++ b/rest_framework/locale/ca/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Catalan (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,40 +17,40 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Header Basic invàlid. No hi ha disponibles les credencials." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Header Basic invàlid. Les credencials no poden contenir espais." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Header Basic invàlid. Les credencials no estan codificades correctament en base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Usuari/Contrasenya incorrectes." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Usuari inactiu o esborrat." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Token header invàlid. No s'han indicat les credencials." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Token header invàlid. El token no ha de contenir espais." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Token header invàlid. El token no pot contenir caràcters invàlids." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token invàlid." @@ -58,382 +58,515 @@ msgstr "Token invàlid." msgid "Auth Token" msgstr "" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Compte d'usuari desactivat." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "No es possible loguejar-se amb les credencials introduïdes." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "S'ha d'incloure \"username\" i \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "S'ha produït un error en el servidor." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Request amb format incorrecte." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Credencials d'autenticació incorrectes." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Credencials d'autenticació no disponibles." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "No té permisos per realitzar aquesta acció." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "No trobat." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Mètode \"{method}\" no permès." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "No s'ha pogut satisfer l'Accept header de la petició." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Media type \"{media_type}\" no suportat." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "La petició ha estat limitada pel número màxim de peticions definit." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Aquest camp és obligatori." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Aquest camp no pot ser nul." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" no és un booleà." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Aquest camp no pot estar en blanc." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Aquest camp no pot tenir més de {max_length} caràcters." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Aquest camp ha de tenir un mínim de {min_length} caràcters." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Introdueixi una adreça de correu vàlida." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Aquest valor no compleix el patró requerit." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Introdueix un \"slug\" vàlid consistent en lletres, números, guions o guions baixos." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Introdueixi una URL vàlida." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" no és un UUID vàlid." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Introdueixi una adreça IPv4 o IPv6 vàlida." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Es requereix un nombre enter vàlid." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Aquest valor ha de ser menor o igual a {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Aquest valor ha de ser més gran o igual a {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Valor del text massa gran." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Es requereix un nombre vàlid." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "No pot haver-hi més de {max_digits} dígits en total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "No pot haver-hi més de {max_decimal_places} decimals." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "No pot haver-hi més de {max_whole_digits} dígits abans del punt decimal." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "El Datetime té un format incorrecte. Utilitzi un d'aquests formats: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "S'espera un Datetime però s'ha rebut un Date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "El Date té un format incorrecte. Utilitzi un d'aquests formats: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "S'espera un Date però s'ha rebut un Datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "El Time té un format incorrecte. Utilitzi un d'aquests formats: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "La durada té un format incorrecte. Utilitzi un d'aquests formats: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" no és una opció vàlida." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "S'espera una llista d'ítems però s'ha rebut el tipus \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Aquesta selecció no pot estar buida." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" no és un path vàlid." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "No s'ha enviat cap fitxer." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Les dades enviades no són un fitxer. Comproveu l'encoding type del formulari." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "No s'ha pogut determinar el nom del fitxer." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "El fitxer enviat està buit." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "El nom del fitxer ha de tenir com a màxim {max_length} caràcters (en té {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Envieu una imatge vàlida. El fitxer enviat no és una imatge o és una imatge corrompuda." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Aquesta llista no pot estar buida." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "S'espera un diccionari però s'ha rebut el tipus \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" msgstr "" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Cursor invàlid." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "PK invàlida \"{pk_value}\" - l'objecte no existeix." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tipus incorrecte. S'espera el valor d'una PK, s'ha rebut {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Hyperlink invàlid - Cap match d'URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hyperlink invàlid - Match d'URL incorrecta." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Hyperlink invàlid - L'objecte no existeix." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tipus incorrecte. S'espera una URL, s'ha rebut {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'objecte amb {slug_name}={value} no existeix." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valor invàlid." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Dades invàlides. S'espera un diccionari però s'ha rebut {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Cap" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Cap opció seleccionada." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Aquest camp ha de ser únic." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Aquests camps {field_names} han de constituir un conjunt únic." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Aquest camp ha de ser únic per a la data \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Aquest camp ha de ser únic per al mes \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Versió invàlida al header \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Versió invàlida a la URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Versió invàlida al hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Versió invàlida al paràmetre de consulta." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permís denegat." diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.mo b/rest_framework/locale/cs/LC_MESSAGES/django.mo index 1561cd98c..ebf7db5aa 100644 Binary files a/rest_framework/locale/cs/LC_MESSAGES/django.mo and b/rest_framework/locale/cs/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.po b/rest_framework/locale/cs/LC_MESSAGES/django.po index b6ee1ea48..ee6bad9ab 100644 --- a/rest_framework/locale/cs/LC_MESSAGES/django.po +++ b/rest_framework/locale/cs/LC_MESSAGES/django.po @@ -9,433 +9,566 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Czech (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Chybná hlavička. Nebyly poskytnuty přihlašovací údaje." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Chybná hlavička. Přihlašovací údaje by neměly obsahovat mezery." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Chybná hlavička. Přihlašovací údaje nebyly správně zakódovány pomocí base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Chybné uživatelské jméno nebo heslo." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Uživatelský účet je neaktivní nebo byl smazán." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Chybná hlavička tokenu. Nebyly zadány přihlašovací údaje." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Chybná hlavička tokenu. Přihlašovací údaje by neměly obsahovat mezery." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Chybná hlavička s tokenem. Token nesmí obsahovat nevalidní znaky." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Chybný token." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Autentizační token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Klíč" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Uživatel" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Vytvořeno" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Tokeny" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Uživatelské jméno" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Heslo" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Uživatelský účet je uzamčen." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Zadanými údaji se nebylo možné přihlásit." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Musí obsahovat \"uživatelské jméno\" a \"heslo\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Chyba na straně serveru." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Neplatný formát požadavku." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Chybné přihlašovací údaje." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Nebyly zadány přihlašovací údaje." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "K této akci nemáte oprávnění." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nenalezeno." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoda \"{method}\" není povolena." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Nelze vyhovět požadavku v hlavičce Accept." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Nepodporovaný media type \"{media_type}\" v požadavku." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Požadavek byl limitován kvůli omezení počtu požadavků za časovou periodu." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Toto pole je vyžadováno." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Toto pole nesmí být prázdné (null)." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" nelze použít jako typ boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Toto pole nesmí být prázdné." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Zkontrolujte, že toto pole není delší než {max_length} znaků." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Zkontrolujte, že toto pole obsahuje alespoň {min_length} znaků." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Vložte platnou e-mailovou adresu." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Hodnota v tomto poli neodpovídá požadovanému formátu." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Vložte platnou \"zkrácenou formu\" obsahující pouze malá písmena, čísla, spojovník nebo podtržítko." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Vložte platný odkaz." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" není platné UUID." - -#: fields.py:796 -msgid "Enter a valid IPv4 or IPv6 address." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:821 +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Vložte platnou IPv4 nebo IPv6 adresu." + +#: fields.py:931 msgid "A valid integer is required." msgstr "Je vyžadováno celé číslo." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Zkontrolujte, že hodnota je menší nebo rovna {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Zkontrolujte, že hodnota je větší nebo rovna {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Řetězec je příliš dlouhý." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Je vyžadováno číslo." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Zkontrolujte, že číslo neobsahuje více než {max_digits} čislic." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Zkontrolujte, že číslo nemá více než {max_decimal_places} desetinných míst." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Zkontrolujte, že číslo neobsahuje více než {max_whole_digits} čislic před desetinnou čárkou." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Chybný formát data a času. Použijte jeden z těchto formátů: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Bylo zadáno pouze datum bez času." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Chybný formát data. Použijte jeden z těchto formátů: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Bylo zadáno datum a čas, místo samotného data." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Chybný formát času. Použijte jeden z těchto formátů: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Trvání má nesprávný formát. Použijte jeden z následujících: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" není platnou možností." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Více než {count} položek..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Byl očekáván seznam položek ale nalezen \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "Tento výběr by neměl být prázdný." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" není validní cesta k souboru." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Nebyl zaslán žádný soubor." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Zaslaná data neobsahují soubor. Zkontrolujte typ kódování ve formuláři." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Nebylo možné zjistit jméno souboru." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Zaslaný soubor je prázdný." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Zajistěte, aby jméno souboru obsahovalo maximálně {max_length} znaků (teď má {length} znaků)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Nahrajte platný obrázek. Nahraný soubor buď není obrázkem nebo je poškozen." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "Tento list by neměl být prázdný." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Byl očekáván slovník položek ale nalezen \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Hodnota musí být platná hodnota JSON." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Hledat" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Řazení" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "vzestupně" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "sestupně" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "Nevalidní strana." + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 -msgid "Invalid cursor" -msgstr "Chybný kurzor." +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" -#: relations.py:207 +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "Chybný kurzor" + +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Chybný primární klíč \"{pk_value}\" - objekt neexistuje." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Chybný typ. Byl přijat typ {data_type} místo hodnoty primárního klíče." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Chybný odkaz - nebyla nalezena žádní shoda." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Chybný odkaz - byla nalezena neplatná shoda." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Chybný odkaz - objekt neexistuje." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Chybný typ. Byl přijat typ {data_type} místo očekávaného odkazu." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt s {slug_name}={value} neexistuje." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Chybná hodnota." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Chybná data. Byl přijat typ {datatype} místo očekávaného slovníku." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "Filtry" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "Neuvedeno" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "Žádné položky k výběru." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Tato položka musí být unikátní." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Položka {field_names} musí tvořit unikátní množinu." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Tato položka musí být pro datum \"{date_field}\" unikátní." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Tato položka musí být pro měsíc \"{date_field}\" unikátní." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Chybné číslo verze v hlavičce Accept." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Chybné číslo verze v odkazu." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Nevalidní verze v URL cestě. Neodpovídá žádnému z jmenných prostorů pro verze." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Chybné číslo verze v hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Chybné čislo verze v URL parametru." - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/da/LC_MESSAGES/django.mo b/rest_framework/locale/da/LC_MESSAGES/django.mo index 77fd7c2ab..d70bc13a5 100644 Binary files a/rest_framework/locale/da/LC_MESSAGES/django.mo and b/rest_framework/locale/da/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/da/LC_MESSAGES/django.po b/rest_framework/locale/da/LC_MESSAGES/django.po index 900695649..574066f2a 100644 --- a/rest_framework/locale/da/LC_MESSAGES/django.po +++ b/rest_framework/locale/da/LC_MESSAGES/django.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Mads Jensen \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Danish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,40 +19,40 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Ugyldig basic header. Ingen legitimation angivet." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Ugyldig basic header. Legitimationsstrenge må ikke indeholde mellemrum." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Ugyldig basic header. Legitimationen er ikke base64 encoded på korrekt vis." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Ugyldigt brugernavn/kodeord." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Inaktiv eller slettet bruger." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Ugyldig token header." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ugyldig token header. Token-strenge må ikke indeholde mellemrum." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Ugyldig token header. Token streng bør ikke indeholde ugyldige karakterer." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Ugyldigt token." @@ -60,382 +60,515 @@ msgstr "Ugyldigt token." msgid "Auth Token" msgstr "" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Nøgle" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Bruger" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Oprettet" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Brugernavn" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Kodeord" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Brugerkontoen er deaktiveret." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Kunne ikke logge ind med den angivne legitimation." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Skal indeholde \"username\" og \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Der er sket en serverfejl." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Misdannet forespørgsel." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Ugyldig legitimation til autentificering." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Legitimation til autentificering blev ikke angivet." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Du har ikke lov til at udføre denne handling." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Ikke fundet." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoden \"{method}\" er ikke tilladt." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Kunne ikke efterkomme forespørgslens Accept header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Forespørgslen blev neddroslet." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Dette felt er påkrævet." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Dette felt må ikke være null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" er ikke en tilladt boolsk værdi." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Dette felt må ikke være tomt." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Tjek at dette felt ikke indeholder flere end {max_length} tegn." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Tjek at dette felt indeholder mindst {min_length} tegn." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Angiv en gyldig e-mailadresse." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Denne værdi passer ikke med det påkrævede mønster." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Indtast en gyldig \"slug\", bestående af bogstaver, tal, bund- og bindestreger." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Indtast en gyldig URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" er ikke et gyldigt UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Indtast en gyldig IPv4 eller IPv6 adresse." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Et gyldigt heltal er påkrævet." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Tjek at værdien er mindre end eller lig med {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Tjek at værdien er større end eller lig med {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Strengværdien er for stor." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Et gyldigt tal er påkrævet." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Tjek at der ikke er flere end {max_digits} cifre i alt." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Tjek at der ikke er flere end {max_decimal_places} cifre efter kommaet." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Tjek at der ikke er flere end {max_whole_digits} cifre før kommaet." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datotid har et forkert format. Brug i stedet et af disse formater: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Forventede en datotid, men fik en dato." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Dato har et forkert format. Brug i stedet et af disse formater: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Forventede en dato men fik en datotid." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Klokkeslæt har forkert format. Brug i stedet et af disse formater: {format}. " -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Varighed har forkert format. Brug istedet et af følgende formater: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" er ikke et gyldigt valg." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Flere end {count} objekter..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Forventede en liste, men fik noget af typen \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Dette valg kan være tomt." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" er ikke et gyldigt valg af adresse." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Ingen medsendt fil." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Det medsendte data var ikke en fil. Tjek typen af indkodning på formularen." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Filnavnet kunne ikke afgøres." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Den medsendte fil er tom." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Sørg for at filnavnet er højst {max_length} langt (det er {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Medsend et gyldigt billede. Den medsendte fil var enten ikke et billede eller billedfilen var ødelagt." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Denne liste er muligvis ikke tom." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Forventede en dictionary, men fik noget af typen \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Værdi skal være gyldig JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Indsend." +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Søg" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sortering" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "stigende" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "faldende" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Ugyldig side" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Ugyldig cursor" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ugyldig primærnøgle \"{pk_value}\" - objektet findes ikke." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Ugyldig type. Forventet værdi er primærnøgle, fik {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Ugyldigt hyperlink - intet URL match." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ugyldigt hyperlink - forkert URL match." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ugyldigt hyperlink - objektet findes ikke." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Forkert type. Forventede en URL-streng, fik {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object med {slug_name}={value} findes ikke." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Ugyldig værdi." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Ugyldig data. Forventede en dictionary, men fik {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtre" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Søgefiltre" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sortering" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Søg" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ingen" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Intet at vælge." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Dette felt skal være unikt." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Felterne {field_names} skal udgøre et unikt sæt." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Dette felt skal være unikt for \"{date_field}\"-datoen." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Dette felt skal være unikt for \"{date_field}\"-måneden." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Dette felt skal være unikt for \"{date_field}\"-året." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Ugyldig version i \"Accept\" headeren." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Ugyldig version i URL-stien." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Ugyldig version in URLen. Den stemmer ikke overens med nogen versionsnumre." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Ugyldig version i hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Ugyldig version i forespørgselsparameteren." - -#: views.py:88 -msgid "Permission denied." -msgstr "Adgang nægtet." diff --git a/rest_framework/locale/de/LC_MESSAGES/django.mo b/rest_framework/locale/de/LC_MESSAGES/django.mo index 0042572ef..986880397 100644 Binary files a/rest_framework/locale/de/LC_MESSAGES/django.mo and b/rest_framework/locale/de/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/de/LC_MESSAGES/django.po b/rest_framework/locale/de/LC_MESSAGES/django.po index 725a0f757..12ae5ba18 100644 --- a/rest_framework/locale/de/LC_MESSAGES/django.po +++ b/rest_framework/locale/de/LC_MESSAGES/django.po @@ -4,7 +4,7 @@ # # Translators: # Fabian Büchler , 2015 -# datKater , 2017 +# 5a85a00218ad0559ac6870a4179f4dbc, 2017 # Lukas Bischofberger , 2017 # Mads Jensen , 2015 # Niklas P , 2015-2016 @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Lukas Bischofberger \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: German (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,40 +25,40 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Ungültiger basic header. Keine Zugangsdaten angegeben." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Ungültiger basic header. Zugangsdaten sollen keine Leerzeichen enthalten." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Ungültiger basic header. Zugangsdaten sind nicht korrekt mit base64 kodiert." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Ungültiger Benutzername/Passwort" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Benutzer inaktiv oder gelöscht." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Ungültiger token header. Keine Zugangsdaten angegeben." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ungültiger token header. Zugangsdaten sollen keine Leerzeichen enthalten." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Ungültiger Token Header. Tokens dürfen keine ungültigen Zeichen enthalten." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Ungültiges Token" @@ -66,382 +66,515 @@ msgstr "Ungültiges Token" msgid "Auth Token" msgstr "Auth Token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Schlüssel" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Benutzer" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Erzeugt" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Benutzername" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Passwort" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Benutzerkonto ist gesperrt." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Die angegebenen Zugangsdaten stimmen nicht." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "\"username\" und \"password\" sind erforderlich." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Ein Serverfehler ist aufgetreten." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Fehlerhafte Anfrage." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Falsche Anmeldedaten." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Anmeldedaten fehlen." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Sie sind nicht berechtigt diese Aktion durchzuführen." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nicht gefunden." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Methode \"{method}\" nicht erlaubt." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Kann die Accept Kopfzeile der Anfrage nicht erfüllen." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Die Anfrage wurde gedrosselt." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Dieses Feld ist erforderlich." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Dieses Feld darf nicht null sein." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" ist kein gültiger Wahrheitswert." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Dieses Feld darf nicht leer sein." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Stelle sicher, dass dieses Feld nicht mehr als {max_length} Zeichen lang ist." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Stelle sicher, dass dieses Feld mindestens {min_length} Zeichen lang ist." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Gib eine gültige E-Mail Adresse an." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Dieser Wert passt nicht zu dem erforderlichen Muster." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Gib ein gültiges \"slug\" aus Buchstaben, Ziffern, Unterstrichen und Minuszeichen ein." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Gib eine gültige URL ein." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" ist keine gültige UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Geben Sie eine gültige IPv4 oder IPv6 Adresse an" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Eine gültige Ganzzahl ist erforderlich." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Stelle sicher, dass dieser Wert kleiner oder gleich {max_value} ist." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Stelle sicher, dass dieser Wert größer oder gleich {min_value} ist." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Zeichenkette zu lang." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Eine gültige Zahl ist erforderlich." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Stelle sicher, dass es insgesamt nicht mehr als {max_digits} Ziffern lang ist." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Stelle sicher, dass es nicht mehr als {max_decimal_places} Nachkommastellen lang ist." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Stelle sicher, dass es nicht mehr als {max_whole_digits} Stellen vor dem Komma lang ist." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datums- und Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Erwarte eine Datums- und Zeitangabe, erhielt aber ein Datum." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Datum hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Erwarte ein Datum, erhielt aber eine Datums- und Zeitangabe." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Laufzeit hat das falsche Format. Benutze stattdessen eines dieser Formate {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ist keine gültige Option." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Mehr als {count} Ergebnisse" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Erwarte eine Liste von Elementen, erhielt aber den Typ \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Diese Auswahl darf nicht leer sein" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" ist ein ungültiger Pfad." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Es wurde keine Datei übermittelt." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Die übermittelten Daten stellen keine Datei dar. Prüfe den Kodierungstyp im Formular." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Der Dateiname konnte nicht ermittelt werden." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Die übermittelte Datei ist leer." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Stelle sicher, dass dieser Dateiname höchstens {max_length} Zeichen lang ist (er hat {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Lade ein gültiges Bild hoch. Die hochgeladene Datei ist entweder kein Bild oder ein beschädigtes Bild." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Diese Liste darf nicht leer sein." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Erwartete ein Dictionary mit Elementen, erhielt aber den Typ \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Wert muss gültiges JSON sein." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Abschicken" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Suche" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sortierung" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "Aufsteigend" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "Absteigend" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Ungültige Seite." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Ungültiger Zeiger" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ungültiger pk \"{pk_value}\" - Object existiert nicht." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Falscher Typ. Erwarte pk Wert, erhielt aber {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Ungültiger Hyperlink - entspricht keiner URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ungültiger Hyperlink - URL stimmt nicht überein." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ungültiger Hyperlink - Objekt existiert nicht." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Falscher Typ. Erwarte URL Zeichenkette, erhielt aber {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt mit {slug_name}={value} existiert nicht." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Ungültiger Wert." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Ungültige Daten. Dictionary erwartet, aber {datatype} erhalten." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filter" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Feldfilter" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sortierung" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Suche" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Nichts" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Keine Elemente zum Auswählen." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Dieses Feld muss eindeutig sein." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Die Felder {field_names} müssen eine eindeutige Menge bilden." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Datums eindeutig sein." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Monats eindeutig sein." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Ungültige Version in der \"Accept\" Kopfzeile." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Ungültige Version im URL Pfad." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Ungültige Version im URL-Pfad. Entspricht keinem Versions-Namensraum." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Ungültige Version im Hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Ungültige Version im Anfrageparameter." - -#: views.py:88 -msgid "Permission denied." -msgstr "Zugriff verweigert." diff --git a/rest_framework/locale/el/LC_MESSAGES/django.mo b/rest_framework/locale/el/LC_MESSAGES/django.mo index b44b9ea9c..f434e6fc9 100644 Binary files a/rest_framework/locale/el/LC_MESSAGES/django.mo and b/rest_framework/locale/el/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/el/LC_MESSAGES/django.po b/rest_framework/locale/el/LC_MESSAGES/django.po index 18eb371c9..65459fc7b 100644 --- a/rest_framework/locale/el/LC_MESSAGES/django.po +++ b/rest_framework/locale/el/LC_MESSAGES/django.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Christos Barkonikos , 2020 +# Panagiotis Pavlidis , 2019 # Serafeim Papastefanos , 2016 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Greek (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,40 +20,40 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Λανθασμένη επικεφαλίδα basic. Δεν υπάρχουν διαπιστευτήρια." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δε μπορεί να περιέχουν κενά." +msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δεν πρέπει να περιέχουν κενά." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δεν είναι κωδικοποιημένα κατά base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Λανθασμένο όνομα χρήστη/κωδικός." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Ο χρήστης είναι ανενεργός ή διεγραμμένος." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Λανθασμένη επικεφαλίδα token. Δεν υπάρχουν διαπιστευτήρια." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "Λανθασμένη επικεφαλίδα token. Το token δε πρέπει να περιέχει κενά." +msgstr "Λανθασμένη επικεφαλίδα token. Το token δεν πρέπει να περιέχει κενά." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Λανθασμένη επικεφαλίδα token. Το token περιέχει μη επιτρεπτούς χαρακτήρες." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Λανθασμένο token" @@ -59,382 +61,515 @@ msgstr "Λανθασμένο token" msgid "Auth Token" msgstr "Token πιστοποίησης" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Κλειδί" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Χρήστης" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Δημιουργήθηκε" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Όνομα χρήστη" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Κωδικός" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Ο λογαριασμός χρήστη είναι απενεργοποιημένος." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Δεν είναι δυνατή η σύνδεση με τα διαπιστευτήρια." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Πρέπει να περιέχει \"όνομα χρήστη\" και \"κωδικό\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Σφάλμα διακομιστή." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Λανθασμένο αίτημα." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Λάθος διαπιστευτήρια." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Δεν δόθηκαν διαπιστευτήρια." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Δεν έχετε δικαίωματα για αυτή την ενέργεια." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Δε βρέθηκε." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "Η μέθοδος \"{method\"} δεν επιτρέπεται." +msgstr "Η μέθοδος \"{method}\" δεν επιτρέπεται." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Δεν ήταν δυνατή η ικανοποίηση της επικεφαλίδας Accept της αίτησης." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Δεν υποστηρίζεται το media type \"{media_type}\" της αίτησης." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Το αίτημα έγινε throttle." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Το πεδίο είναι απαραίτητο." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Το πεδίο δε μπορεί να είναι null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "Το \"{input}\" δεν είναι έγκυρο boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Το πεδίο δε μπορεί να είναι κενό." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Επιβεβαιώσατε ότι το πεδίο δεν έχει περισσότερους από {max_length} χαρακτήρες." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Επιβεβαιώσατε ότι το πεδίο έχει τουλάχιστον {min_length} χαρακτήρες." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Συμπληρώσατε μια έγκυρη διεύθυνση e-mail." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Η τιμή δε ταιριάζει με το pattern." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Εισάγετε ένα έγκυρο \"slug\" που αποτελείται από γράμματα, αριθμούς παύλες και κάτω παύλες." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Εισάγετε έγκυρο URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "Το \"{value}\" δεν είναι έγκυρο UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Εισάγετε μια έγκυρη διεύθυνση IPv4 ή IPv6." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Ένας έγκυρος ακέραιος είναι απαραίτητος." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Επιβεβαιώσατε ότι η τιμή είναι μικρότερη ή ίση του {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Επιβεβαιώσατε ότι η τιμή είναι μεγαλύτερη ή ίση του {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Το κείμενο είναι πολύ μεγάλο." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Ένας έγκυρος αριθμός είναι απαραίτητος." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_digits} ψηφία." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_decimal_places} δεκαδικά ψηφία." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_whole_digits} ακέραια ψηφία." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Αναμένεται ημερομηνία και ώρα αλλά δόθηκε μόνο ημερομηνία." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Αναμένεται ημερομηνία αλλά δόθηκε ημερομηνία και ώρα." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Η ώρα έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Η διάρκεια έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Περισσότερα από {count} αντικείμενα..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Αναμένεται μια λίστα αντικειμένον αλλά δόθηκε ο τύπος \"{input_type}\"" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Η επιλογή δε μπορεί να είναι κενή." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή διαδρομής." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Δεν υποβλήθηκε αρχείο." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Τα δεδομένα που υποβλήθηκαν δεν ήταν αρχείο. Ελέγξατε την κωδικοποίηση της φόρμας." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Δε βρέθηκε όνομα αρχείου." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Το αρχείο που υποβλήθηκε είναι κενό." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Επιβεβαιώσατε ότι το όνομα αρχείου έχει ως {max_length} χαρακτήρες (έχει {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Ανεβάστε μια έγκυρη εικόνα. Το αρχείο που ανεβάσατε είτε δεν είναι εικόνα είτε έχει καταστραφεί." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Η λίστα δε μπορεί να είναι κενή." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Αναμένεται ένα λεξικό αντικείμενων αλλά δόθηκε ο τύπος \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Η τιμή πρέπει να είναι μορφής JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Υποβολή" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Αναζήτηση" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ταξινόμηση" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Λάθος σελίδα." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Λάθος cursor." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Λάθος κλειδί \"{pk_value}\" - το αντικείμενο δεν υπάρχει." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Λάθος τύπος. Αναμένεται τιμή κλειδιού, δόθηκε {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Λάθος σύνδεση - το αντικείμενο δεν υπάρχει." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Λάθος τύπος. Αναμένεται URL, δόθηκε {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Το αντικείμενο {slug_name}={value} δεν υπάρχει." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Λάθος τιμή." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Λάθος δεδομένα. Αναμένεται λεξικό αλλά δόθηκε {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Φίλτρα" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Φίλτρα πεδίων" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ταξινόμηση" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Αναζήτηση" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Δεν υπάρχουν αντικείμενα προς επιλογή." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Το πεδίο πρέπει να είναι μοναδικό" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Τα πεδία {field_names} πρέπει να αποτελούν ένα μοναδικό σύνολο." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Το πεδίο πρέπει να είναι μοναδικό για την ημερομηνία \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Το πεδίο πρέπει να είναι μοναδικό για το μήνα \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Το πεδίο πρέπει να είναι μοναδικό για το έτος \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Λάθος έκδοση στην επικεφαλίδα \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Λάθος έκδοση στη διαδρομή URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Λάθος έκδοση στο hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Λάθος έκδοση στην παράμετρο" - -#: views.py:88 -msgid "Permission denied." -msgstr "Απόρριψη πρόσβασης" diff --git a/rest_framework/locale/en/LC_MESSAGES/django.mo b/rest_framework/locale/en/LC_MESSAGES/django.mo index 68e5600ae..0770a9d5e 100644 Binary files a/rest_framework/locale/en/LC_MESSAGES/django.mo and b/rest_framework/locale/en/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/en/LC_MESSAGES/django.po b/rest_framework/locale/en/LC_MESSAGES/django.po index fa420670a..99c57b40c 100644 --- a/rest_framework/locale/en/LC_MESSAGES/django.po +++ b/rest_framework/locale/en/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-09-21 21:11+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: English (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,40 +17,40 @@ msgstr "" "Language: en\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Invalid basic header. No credentials provided." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Invalid basic header. Credentials string should not contain spaces." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Invalid basic header. Credentials not correctly base64 encoded." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Invalid username/password." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "User inactive or deleted." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Invalid token header. No credentials provided." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Invalid token header. Token string should not contain spaces." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Invalid token header. Token string should not contain invalid characters." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Invalid token." @@ -58,382 +58,515 @@ msgstr "Invalid token." msgid "Auth Token" msgstr "Auth Token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Key" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "User" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Created" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Username" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Password" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "User account is disabled." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Unable to log in with provided credentials." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Must include \"username\" and \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "A server error occurred." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "Invalid input." + +#: exceptions.py:161 msgid "Malformed request." msgstr "Malformed request." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Incorrect authentication credentials." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Authentication credentials were not provided." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "You do not have permission to perform this action." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Not found." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Method \"{method}\" not allowed." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Could not satisfy the request Accept header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Unsupported media type \"{media_type}\" in request." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Request was throttled." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "Expected available in {wait} second." + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "Expected available in {wait} seconds." + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "This field is required." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "This field may not be null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" is not a valid boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "Must be a valid boolean." -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "Not a valid string." + +#: fields.py:767 msgid "This field may not be blank." msgstr "This field may not be blank." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Ensure this field has no more than {max_length} characters." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Ensure this field has at least {min_length} characters." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Enter a valid email address." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "This value does not match the required pattern." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Enter a valid \"slug\" consisting of letters, numbers, underscores or hyphens." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, or hyphens." + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Enter a valid URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" is not a valid UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "Must be a valid UUID." -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Enter a valid IPv4 or IPv6 address." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "A valid integer is required." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Ensure this value is less than or equal to {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Ensure this value is greater than or equal to {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "String value too large." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "A valid number is required." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Ensure that there are no more than {max_digits} digits in total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Ensure that there are no more than {max_decimal_places} decimal places." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Ensure that there are no more than {max_whole_digits} digits before the decimal point." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime has wrong format. Use one of these formats instead: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Expected a datetime but got a date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "Invalid datetime for the timezone \"{timezone}\"." + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "Datetime value out of range." + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Date has wrong format. Use one of these formats instead: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Expected a date but got a datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time has wrong format. Use one of these formats instead: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duration has wrong format. Use one of these formats instead: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" is not a valid choice." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "More than {count} items..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Expected a list of items but got type \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "This selection may not be empty." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" is not a valid path choice." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "No file was submitted." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "The submitted data was not a file. Check the encoding type on the form." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "No filename could be determined." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "The submitted file is empty." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Ensure this filename has at most {max_length} characters (it has {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Upload a valid image. The file you uploaded was either not an image or a corrupted image." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "This list may not be empty." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "Ensure this field has at least {min_length} elements." + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "Ensure this field has no more than {max_length} elements." + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Expected a dictionary of items but got type \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "This dictionary may not be empty." + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Value must be valid JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Submit" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Search" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "A search term." + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordering" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "Which field to use when ordering the results." + +#: filters.py:287 msgid "ascending" msgstr "ascending" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "descending" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "A page number within the paginated result set." + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "Number of results to return per page." + +#: pagination.py:189 msgid "Invalid page." msgstr "Invalid page." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "The initial index from which to return the results." + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "The pagination cursor value." + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Invalid cursor" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Invalid pk \"{pk_value}\" - object does not exist." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Incorrect type. Expected pk value, received {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Invalid hyperlink - No URL match." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Invalid hyperlink - Incorrect URL match." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Invalid hyperlink - Object does not exist." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Incorrect type. Expected URL string, received {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object with {slug_name}={value} does not exist." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Invalid value." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "unique integer value" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "UUID string" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "unique value" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "A {value_type} identifying this {name}." + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Invalid data. Expected a dictionary, but got {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "Extra Actions" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filters" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "navbar" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "content" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "request form" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "main content" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "request info" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "response info" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "No items to select." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "This field must be unique." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "The fields {field_names} must make a unique set." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "Surrogate characters are not allowed: U+{code_point:X}." + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "This field must be unique for the \"{date_field}\" date." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "This field must be unique for the \"{date_field}\" month." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "This field must be unique for the \"{date_field}\" year." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Invalid version in \"Accept\" header." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Invalid version in URL path." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Invalid version in URL path. Does not match any version namespace." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Invalid version in hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Invalid version in query parameter." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permission denied." diff --git a/rest_framework/locale/en_US/LC_MESSAGES/django.po b/rest_framework/locale/en_US/LC_MESSAGES/django.po index 3733a1e33..c9dd2d633 100644 --- a/rest_framework/locale/en_US/LC_MESSAGES/django.po +++ b/rest_framework/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,40 +17,40 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "" @@ -58,380 +58,513 @@ msgstr "" msgid "Auth Token" msgstr "" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "" -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "" -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "" -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "" -#: fields.py:1359 +#: fields.py:1515 msgid "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" msgstr "" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/es/LC_MESSAGES/django.mo b/rest_framework/locale/es/LC_MESSAGES/django.mo index 6efb9bdd1..16df627fc 100644 Binary files a/rest_framework/locale/es/LC_MESSAGES/django.mo and b/rest_framework/locale/es/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/es/LC_MESSAGES/django.po b/rest_framework/locale/es/LC_MESSAGES/django.po index c9b6e9455..a2f7f1a43 100644 --- a/rest_framework/locale/es/LC_MESSAGES/django.po +++ b/rest_framework/locale/es/LC_MESSAGES/django.po @@ -3,8 +3,9 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Ernesto Rico-Schmidt , 2015 +# Ernesto Rico Schmidt , 2015 # José Padilla , 2015 +# Leo Prada , 2019 # Miguel Gonzalez , 2015 # Miguel Gonzalez , 2016 # Miguel Gonzalez , 2015-2016 @@ -13,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Miguel Gonzalez \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Spanish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,40 +24,40 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Cabecera básica inválida. Las credenciales no fueron suministradas." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Cabecera básica inválida. La cadena con las credenciales no debe contener espacios." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "Cabecera básica inválida. Las credenciales incorrectamente codificadas en base64." +msgstr "Cabecera básica inválida. Las credenciales no fueron codificadas correctamente en base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nombre de usuario/contraseña inválidos." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Usuario inactivo o borrado." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Cabecera token inválida. Las credenciales no fueron suministradas." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Cabecera token inválida. La cadena token no debe contener espacios." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Cabecera token inválida. La cadena token no debe contener caracteres inválidos." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token inválido." @@ -64,382 +65,515 @@ msgstr "Token inválido." msgid "Auth Token" msgstr "Token de autenticación" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Clave" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Usuario" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Fecha de creación" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Nombre de usuario" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Contraseña" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Cuenta de usuario está deshabilitada." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "No puede iniciar sesión con las credenciales proporcionadas." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Debe incluir \"username\" y \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Se ha producido un error en el servidor." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Solicitud con formato incorrecto." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Credenciales de autenticación incorrectas." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Las credenciales de autenticación no se proveyeron." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Usted no tiene permiso para realizar esta acción." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "No encontrado." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Método \"{method}\" no permitido." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "No se ha podido satisfacer la solicitud de cabecera de Accept." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Solicitud fue regulada (throttled)." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Este campo es requerido." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Este campo no puede ser nulo." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" no es un booleano válido." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Este campo no puede estar en blanco." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Asegúrese de que este campo no tenga más de {max_length} caracteres." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Asegúrese de que este campo tenga al menos {min_length} caracteres." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Introduzca una dirección de correo electrónico válida." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Este valor no coincide con el patrón requerido." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Introduzca un \"slug\" válido consistente en letras, números, guiones o guiones bajos." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Introduzca una URL válida." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" no es un UUID válido." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Introduzca una dirección IPv4 o IPv6 válida." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Introduzca un número entero válido." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Asegúrese de que este valor es menor o igual a {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Asegúrese de que este valor es mayor o igual a {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Cadena demasiado larga." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Se requiere un número válido." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Asegúrese de que no haya más de {max_digits} dígitos en total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Asegúrese de que no haya más de {max_decimal_places} decimales." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Asegúrese de que no haya más de {max_whole_digits} dígitos en la parte entera." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Fecha/hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Se esperaba un fecha/hora en vez de una fecha." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Se esperaba una fecha en vez de una fecha/hora." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duración con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" no es una elección válida." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Más de {count} elementos..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Se esperaba una lista de elementos en vez del tipo \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Esta selección no puede estar vacía." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" no es una elección de ruta válida." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "No se envió ningún archivo." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "La información enviada no era un archivo. Compruebe el tipo de codificación del formulario." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "No se pudo determinar un nombre de archivo." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "El archivo enviado está vació." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Asegúrese de que el nombre de archivo no tenga más de {max_length} caracteres (tiene {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Adjunte una imagen válida. El archivo adjunto o bien no es una imagen o bien está dañado." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Esta lista no puede estar vacía." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Se esperaba un diccionario de elementos en vez del tipo \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "El valor debe ser JSON válido." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Enviar" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Buscar" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordenamiento" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "ascendiente" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "descendiente" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Página inválida." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Cursor inválido" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Clave primaria \"{pk_value}\" inválida - objeto no existe." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tipo incorrecto. Se esperaba valor de clave primaria y se recibió {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Hiperenlace inválido - No hay URL coincidentes." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hiperenlace inválido - Coincidencia incorrecta de la URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Hiperenlace inválido - Objeto no existe." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tipo incorrecto. Se esperaba una URL y se recibió {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objeto con {slug_name}={value} no existe." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valor inválido." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Datos inválidos. Se esperaba un diccionario pero es un {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtros" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filtros de campo" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordenamiento" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Buscar" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ninguno" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "No hay elementos para seleccionar." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Este campo debe ser único." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Los campos {field_names} deben formar un conjunto único." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Este campo debe ser único para el día \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Este campo debe ser único para el mes \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Este campo debe ser único para el año \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Versión inválida en la cabecera \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Versión inválida en la ruta de la URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "La versión especificada en la ruta de la URL no es válida. No coincide con ninguna del espacio de nombres de versiones." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Versión inválida en el nombre de host." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Versión inválida en el parámetro de consulta." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permiso denegado." diff --git a/rest_framework/locale/et/LC_MESSAGES/django.mo b/rest_framework/locale/et/LC_MESSAGES/django.mo index 8deba1eb0..e14ea9e27 100644 Binary files a/rest_framework/locale/et/LC_MESSAGES/django.mo and b/rest_framework/locale/et/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/et/LC_MESSAGES/django.po b/rest_framework/locale/et/LC_MESSAGES/django.po index cc2c2e3f0..d9c4b184f 100644 --- a/rest_framework/locale/et/LC_MESSAGES/django.po +++ b/rest_framework/locale/et/LC_MESSAGES/django.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Tõnis Kärdi , 2015 +# Erlend Eelmets , 2020 +# Tõnis Kärdi , 2015,2019 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Estonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,423 +19,556 @@ msgstr "" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Sobimatu lihtpäis. Kasutajatunnus on esitamata." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Sobimatu lihtpäis. Kasutajatunnus ei tohi sisaldada tühikuid." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Sobimatu lihtpäis. Kasutajatunnus pole korrektselt base64-kodeeritud." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Sobimatu kasutajatunnus/salasõna." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Kasutaja on inaktiivne või kustutatud." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Sobimatu lubakaardi päis. Kasutajatunnus on esitamata." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Sobimatu lubakaardi päis. Loa sõne ei tohi sisaldada tühikuid." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Sobimatu lubakaardi päis. Loa sõne ei tohi sisaldada sobimatuid märke." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Sobimatu lubakaart." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Autentimistähis" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Võti" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Kasutaja" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Loodud" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Tähis" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Tähised" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Kasutajanimi" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Salasõna" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Kasutajakonto on suletud." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Sisselogimine antud tunnusega ebaõnnestus." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Peab sisaldama \"kasutajatunnust\" ja \"slasõna\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Viga serveril." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Väändunud päring." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Ebakorrektne autentimistunnus." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Autentimistunnus on esitamata." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Teil puuduvad piisavad õigused selle tegevuse teostamiseks." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Ei leidnud." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Meetod \"{method}\" pole lubatud." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Päringu Accept-päist ei suutnud täita." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Meedia tüüpi {media_type} päringus ei toetata." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Liiga palju päringuid." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Väli on kohustuslik." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Väli ei tohi olla tühi." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" pole kehtiv kahendarv." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "See väli ei tohi olla tühi." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Veendu, et see väli poleks pikem kui {max_length} tähemärki." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Veendu, et see väli oleks vähemalt {min_length} tähemärki pikk." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Sisestage kehtiv e-posti aadress." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Väärtus ei ühti etteantud mustriga." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Sisestage kehtiv \"slug\", mis koosneks tähtedest, numbritest, ala- või sidekriipsudest." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Sisestage korrektne URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" pole kehtiv UUID." - -#: fields.py:796 -msgid "Enter a valid IPv4 or IPv6 address." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:821 +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Sisesta valiidne IPv4 või IPv6 aadress" + +#: fields.py:931 msgid "A valid integer is required." msgstr "Sisendiks peab olema täisarv." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Veenduge, et väärtus on väiksem kui või võrdne väärtusega {max_value}. " -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Veenduge, et väärtus on suurem kui või võrdne väärtusega {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Sõne on liiga pikk." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Sisendiks peab olema arv." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Veenduge, et kokku pole rohkem kui {max_digits} numbit." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Veenduge, et komakohti pole rohkem kui {max_decimal_places}. " -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Veenduge, et täiskohti poleks rohkem kui {max_whole_digits}." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Valesti formaaditud kuupäev-kellaaeg. Kasutage mõnda neist: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Ootasin kuupäev-kellaaeg andmetüüpi, kuid sain hoopis kuupäeva." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Valesti formaaditud kuupäev. Kasutage mõnda neist: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Ootasin kuupäeva andmetüüpi, kuid sain hoopis kuupäev-kellaaja." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Valesti formaaditud kellaaeg. Kasutage mõnda neist: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Valesti formaaditud kestvus. Kasutage mõnda neist: {format}" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" on sobimatu valik." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Kirjeid on rohkem kui {count} ... " -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Ootasin kirjete järjendit, kuid sain \"{input_type}\" - tüübi." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "Valik ei tohi olla määramata." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" on sobimatu valik." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Ühtegi faili ei esitatud." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Esitatud andmetes ei olnud faili. Kontrollige vormi kodeeringut." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Ei suutnud tuvastada failinime." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Esitatud fail oli tühi." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Veenduge, et failinimi oleks maksimaalselt {max_length} tähemärki pikk (praegu on {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Laadige üles kehtiv pildifail. Üles laetud fail ei olnud pilt või oli see katki." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "Loetelu ei tohi olla määramata." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Ootasin kirjete sõnastikku, kuid sain \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Väärtus peab olema valiidne JSON." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Otsing" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Järjestus" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "kasvav" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "kahanev" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "Sobimatu lehekülg." + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 -msgid "Invalid cursor" -msgstr "Sobimatu kursor." +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" -#: relations.py:207 +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "Sobimatu kursor" + +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Sobimatu primaarvõti \"{pk_value}\" - objekti pole olemas." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Sobimatu andmetüüp. Ootasin primaarvõtit, sain {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Sobimatu hüperlink - ei leidnud URLi vastet." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Sobimatu hüperlink - vale URLi vaste." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Sobimatu hüperlink - objekti ei eksisteeri." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Sobimatu andmetüüp. Ootasin URLi sõne, sain {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekti {slug_name}={value} ei eksisteeri." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Sobimatu väärtus." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Sobimatud andmed. Ootasin sõnastikku, kuid sain {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "Filtrid" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "Puudub" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "Pole midagi valida." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Selle välja väärtus peab olema unikaalne." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Veerud {field_names} peavad moodustama unikaalse hulga." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Selle välja väärtus peab olema unikaalne veerus \"{date_field}\" märgitud kuupäeval." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud kuul." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud aastal." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Sobimatu versioon \"Accept\" päises." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Sobimatu versioon URLi rajas." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Sobimatu versioon URLis - see ei vasta ühelegi teadaolevale." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Sobimatu versioon hostinimes." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Sobimatu versioon päringu parameetris." - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/fa/LC_MESSAGES/django.mo b/rest_framework/locale/fa/LC_MESSAGES/django.mo index 0e73156d4..099318e69 100644 Binary files a/rest_framework/locale/fa/LC_MESSAGES/django.mo and b/rest_framework/locale/fa/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/fa/LC_MESSAGES/django.po b/rest_framework/locale/fa/LC_MESSAGES/django.po index 0aa9ae4c6..6a5b99acf 100644 --- a/rest_framework/locale/fa/LC_MESSAGES/django.po +++ b/rest_framework/locale/fa/LC_MESSAGES/django.po @@ -3,437 +3,574 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Ali Mahdiyar , 2020 +# Aryan Baghi , 2020 +# Omid Zarin , 2019 +# Xavier Ordoquy , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:58+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Persian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "هدر اولیه نامعتبر است. اطلاعات هویتی ارائه نشده است." #: authentication.py:73 -msgid "Invalid basic header. No credentials provided." -msgstr "" - -#: authentication.py:76 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "" +msgstr "هدر اولیه نامعتبر است. رشته ی اطلاعات هویتی نباید شامل فاصله باشد." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "" +msgstr "هدر اولیه نامعتبر است. اطلاعات هویتی با متد base64 به درستی رمزنگاری نشده است." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "نام کاربری/رمز‌عبور نامعتبر است." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "کاربر غیر فعال یا حذف شده است." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "" +msgstr "توکن هدر نامعتبر است. اطلاعات هویتی ارائه نشده است. " -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "" +msgstr "توکن هدر نامعتبر است. توکن نباید شامل فضای خالی باشد." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "توکن هدر نامعتبر است. توکن شامل کاراکتر‌های نامعتبر است." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." -msgstr "" +msgstr "توکن هدر نامعتبر است. " #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "توکن اعتبار‌سنجی" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "کلید" + +#: authtoken/models.py:16 +msgid "User" +msgstr "کاربر" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "ایجاد‌شد" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "توکن" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "توکن‌ها" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "نام‌کاربری" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "رمز‌عبور" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "با اطلاعات ارسال شده نمیتوان وارد شد." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "باید شامل نام‌کاربری و رمز‌عبود باشد." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." +msgstr "خطای سمت سرور رخ داده است." + +#: exceptions.py:142 +msgid "Invalid input." msgstr "" -#: exceptions.py:84 +#: exceptions.py:161 msgid "Malformed request." -msgstr "" +msgstr "درخواست ناقص." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." -msgstr "" +msgstr "اطلاعات احراز هویت صحیح نیست." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." -msgstr "" +msgstr "اطلاعات برای اعتبارسنجی ارسال نشده است." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "شما اجازه انجام این دستور را ندارید." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "یافت نشد." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "متد {method} مجاز نیست." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "نوع محتوای درخواستی در هدر قابل قبول نیست." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "نوع رسانه {media_type} در درخواست پشتیبانی نمیشود." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." +msgstr "تعداد درخواست‌های شما محدود شده است." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." -msgstr "" +msgstr "این مقدار لازم است." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." +msgstr "این مقدار نباید توهی باشد." + +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:766 +msgid "Not a valid string." msgstr "" -#: fields.py:674 +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "این مقدار نباید خالی باشد." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "مطمعن شوید طول این مقدار بیشتر از {max_length} نیست." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "مطمعن شوید طول این مقدار حداقل {min_length} است." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "پست الکترونیکی صحبح وارد کنید." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." -msgstr "" +msgstr "مقدار وارد شده با الگو مطابقت ندارد." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." +msgstr "یک \"slug\" معتبر شامل حروف، اعداد، آندرلاین یا خط فاصله وارد کنید" + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." msgstr "" -#: fields.py:747 +#: fields.py:854 msgid "Enter a valid URL." +msgstr "یک URL معتبر وارد کنید" + +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "" - -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "یک آدرس IPv4 یا IPv6 معتبر وارد کنید." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." -msgstr "" +msgstr "یک مقدار عددی معتبر لازم است." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "این مقدار باید کوچکتر یا مساوی با {max_value} باشد." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "این مقدار باید بزرگتر یا مساوی با {min_value} باشد." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." -msgstr "" +msgstr "رشته بسیار طولانی است." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." -msgstr "" +msgstr "یک عدد معتبر نیاز است." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "" +msgstr "بیشتر از {max_digits} رقم نباید وجود داشته باشد." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "بیشتر از {max_decimal_places} ممیز اعشار نباید وجود داشته باشد" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "بیشتر از {max_whole_digits} رقم نباید قبل از ممیز اعشار باشد." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Datetime اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." +msgstr "باید datetime باشد اما date دریافت شد." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1103 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت تاریخ اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." -msgstr "" +msgstr "باید date باشد اما datetime دریافت شد." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Time اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Duration اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" یک انتخاب معتبر نیست." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "بیشتر از {count} آیتم..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "باید یک لیست از مقادیر ارسال شود اما یک «{input_type}» دریافت شد." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "این بخش نمی‌تواند خالی باشد." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" یک مسیر انتخاب معتبر نیست." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "" +msgstr "فایلی ارسال نشده است." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "دیتای ارسال شده فایل نیست. encoding type فرم را چک کنید." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." -msgstr "" +msgstr "اسم فایل مشخص نیست." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "" +msgstr "فایل ارسال شده خالی است." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "" +msgstr "نام این فایل باید حداکثر {max_length} کاراکتر باشد ({length} کاراکتر دارد)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "یک عکس معتبر آپلود کنید. فایلی که ارسال کردید عکس یا عکس خراب شده نیست" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "این لیست نمی تواند خالی باشد" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "باید دیکشنری از آیتم ها ارسال می شد، اما \"{input_type}\" ارسال شده است." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "مقدار باید JSON معتبر باشد." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "جستجو" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "ترتیب" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "صعودی" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "نزولی" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "صفحه نامعتبر" + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" -msgstr "" +msgstr "مکان نمای نامعتبر" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "pk نامعتبر \"{pk_value}\" - این Object وجود ندارد" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." -msgstr "" +msgstr "تایپ نامعتبر. باید pk ارسال می شد اما {data_type} ارسال شده است." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "هایپرلینک نامعتبر - URL مطابق وجود ندارد" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "هایپرلینک نامعتبر - خطا در تطابق URL" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "هایپرلینک نامعبتر - Object وجود ندارد." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." -msgstr "" +msgstr "داده نامعتبر. باید رشته ی URL باشد، اما {data_type} دریافت شد." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." -msgstr "" +msgstr "Object با {slug_name}={value} وجود ندارد." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." +msgstr "مقدار نامعتبر." + +#: schemas/utils.py:32 +msgid "unique integer value" msgstr "" -#: serializers.py:326 -msgid "Invalid data. Expected a dictionary, but got {datatype}." +#: schemas/utils.py:34 +msgid "UUID string" msgstr "" +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "داده نامعتبر. باید دیکشنری ارسال می شد، اما {datatype} ارسال شده است." + #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "فیلترها" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "آیتمی برای انتخاب وجود ندارد" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." -msgstr "" +msgstr "این فیلد باید یکتا باشد" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." +msgstr "فیلدهای {field_names} باید یک مجموعه یکتا باشند." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." msgstr "" -#: validators.py:245 +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "" +msgstr "این فیلد باید برای تاریخ \"{date_field}\" یکتا باشد." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "" +msgstr "این فیلد باید برای ماه \"{date_field}\" یکتا باشد." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "" +msgstr "این فیلد باید برای سال \"{date_field}\" یکتا باشد." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "ورژن نامعتبر در هدر \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." -msgstr "" +msgstr "ورژن نامعتبر در مسیر URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "ورژن نامعتبر در مسیر URL. با هیچ نام گذاری ورژنی تطابق ندارد." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." -msgstr "" +msgstr "نسخه نامعتبر در نام هاست" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." -msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" +msgstr "ورژن نامعتبر در پارامتر کوئری." diff --git a/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo b/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo index 1f72e1090..52d3f3bf8 100644 Binary files a/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo and b/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/fa_IR/LC_MESSAGES/django.po b/rest_framework/locale/fa_IR/LC_MESSAGES/django.po index 75b6fd156..61361d50e 100644 --- a/rest_framework/locale/fa_IR/LC_MESSAGES/django.po +++ b/rest_framework/locale/fa_IR/LC_MESSAGES/django.po @@ -3,437 +3,574 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Ali Mahdiyar , 2020 +# Aryan Baghi , 2020 +# Omid Zarin , 2019 +# Xavier Ordoquy , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:59+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Persian (Iran) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa_IR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_IR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "هدر اولیه نامعتبر است. اطلاعات هویتی ارائه نشده است." #: authentication.py:73 -msgid "Invalid basic header. No credentials provided." -msgstr "" - -#: authentication.py:76 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "" +msgstr "هدر اولیه نامعتبر است. رشته ی اطلاعات هویتی نباید شامل فاصله باشد." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "" +msgstr "هدر اولیه نامعتبر است. اطلاعات هویتی با متد base64 به درستی رمزنگاری نشده است." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "نام کاربری/رمز‌عبور نامعتبر است." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "کاربر غیر فعال یا حذف شده است." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "" +msgstr "توکن هدر نامعتبر است. اطلاعات هویتی ارائه نشده است. " -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "" +msgstr "توکن هدر نامعتبر است. توکن نباید شامل فضای خالی باشد." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "توکن هدر نامعتبر است. توکن شامل کاراکتر‌های نامعتبر است." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." -msgstr "" +msgstr "توکن هدر نامعتبر است. " #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "توکن اعتبار‌سنجی" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "کلید" + +#: authtoken/models.py:16 +msgid "User" +msgstr "کاربر" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "ایجاد‌شد" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "توکن" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "توکن‌ها" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "نام‌کاربری" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "رمز‌عبور" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "با اطلاعات ارسال شده نمیتوان وارد شد." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "باید شامل نام‌کاربری و رمز‌عبود باشد." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." +msgstr "خطای سمت سرور رخ داده است." + +#: exceptions.py:142 +msgid "Invalid input." msgstr "" -#: exceptions.py:84 +#: exceptions.py:161 msgid "Malformed request." -msgstr "" +msgstr "درخواست ناقص." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." -msgstr "" +msgstr "اطلاعات احراز هویت صحیح نیست." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." -msgstr "" +msgstr "اطلاعات برای اعتبارسنجی ارسال نشده است." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "شما اجازه انجام این دستور را ندارید." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "یافت نشد." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "متد {method} مجاز نیست." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "نوع محتوای درخواستی در هدر قابل قبول نیست." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "نوع رسانه {media_type} در درخواست پشتیبانی نمیشود." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." +msgstr "تعداد درخواست‌های شما محدود شده است." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." -msgstr "" +msgstr "این مقدار لازم است." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." +msgstr "این مقدار نباید توهی باشد." + +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:766 +msgid "Not a valid string." msgstr "" -#: fields.py:674 +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "این مقدار نباید خالی باشد." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "مطمعن شوید طول این مقدار بیشتر از {max_length} نیست." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "مطمعن شوید طول این مقدار حداقل {min_length} است." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "پست الکترونیکی صحبح وارد کنید." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." -msgstr "" +msgstr "مقدار وارد شده با الگو مطابقت ندارد." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." +msgstr "یک \"slug\" معتبر شامل حروف، اعداد، آندرلاین یا خط فاصله وارد کنید" + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." msgstr "" -#: fields.py:747 +#: fields.py:854 msgid "Enter a valid URL." +msgstr "یک URL معتبر وارد کنید" + +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "" - -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "یک آدرس IPv4 یا IPv6 معتبر وارد کنید." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." -msgstr "" +msgstr "یک مقدار عددی معتبر لازم است." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "این مقدار باید کوچکتر یا مساوی با {max_value} باشد." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "این مقدار باید بزرگتر یا مساوی با {min_value} باشد." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." -msgstr "" +msgstr "رشته بسیار طولانی است." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." -msgstr "" +msgstr "یک عدد معتبر نیاز است." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "" +msgstr "بیشتر از {max_digits} رقم نباید وجود داشته باشد." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "بیشتر از {max_decimal_places} ممیز اعشار نباید وجود داشته باشد" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "بیشتر از {max_whole_digits} رقم نباید قبل از ممیز اعشار باشد." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Datetime اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." +msgstr "باید datetime باشد اما date دریافت شد." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1103 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت تاریخ اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." -msgstr "" +msgstr "باید date باشد اما datetime دریافت شد." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Time اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "فرمت Duration اشتباه است. از یکی از این فرمت ها استفاده کنید: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" یک انتخاب معتبر نیست." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "بیشتر از {count} آیتم..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "باید یک لیست از مقادیر ارسال شود اما یک «{input_type}» دریافت شد." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "این بخش نمی‌تواند خالی باشد." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" یک مسیر انتخاب معتبر نیست." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "" +msgstr "فایلی ارسال نشده است." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "دیتای ارسال شده فایل نیست. encoding type فرم را چک کنید." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." -msgstr "" +msgstr "اسم فایل مشخص نیست." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "" +msgstr "فایل ارسال شده خالی است." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "" +msgstr "نام این فایل باید حداکثر {max_length} کاراکتر باشد ({length} کاراکتر دارد)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "یک عکس معتبر آپلود کنید. فایلی که ارسال کردید عکس یا عکس خراب شده نیست" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "این لیست نمی تواند خالی باشد" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "باید دیکشنری از آیتم ها ارسال می شد، اما \"{input_type}\" ارسال شده است." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "مقدار باید JSON معتبر باشد." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "جستجو" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "ترتیب" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "صعودی" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "نزولی" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "صفحه نامعتبر" + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" -msgstr "" +msgstr "مکان نمای نامعتبر" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "pk نامعتبر \"{pk_value}\" - این Object وجود ندارد" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." -msgstr "" +msgstr "تایپ نامعتبر. باید pk ارسال می شد اما {data_type} ارسال شده است." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "هایپرلینک نامعتبر - URL مطابق وجود ندارد" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "هایپرلینک نامعتبر - خطا در تطابق URL" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "هایپرلینک نامعبتر - Object وجود ندارد." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." -msgstr "" +msgstr "داده نامعتبر. باید رشته ی URL باشد، اما {data_type} دریافت شد." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." -msgstr "" +msgstr "Object با {slug_name}={value} وجود ندارد." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." +msgstr "مقدار نامعتبر." + +#: schemas/utils.py:32 +msgid "unique integer value" msgstr "" -#: serializers.py:326 -msgid "Invalid data. Expected a dictionary, but got {datatype}." +#: schemas/utils.py:34 +msgid "UUID string" msgstr "" +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "داده نامعتبر. باید دیکشنری ارسال می شد، اما {datatype} ارسال شده است." + #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "فیلترها" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "آیتمی برای انتخاب وجود ندارد" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." -msgstr "" +msgstr "این فیلد باید یکتا باشد" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." +msgstr "فیلدهای {field_names} باید یک مجموعه یکتا باشند." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." msgstr "" -#: validators.py:245 +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "" +msgstr "این فیلد باید برای تاریخ \"{date_field}\" یکتا باشد." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "" +msgstr "این فیلد باید برای ماه \"{date_field}\" یکتا باشد." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "" +msgstr "این فیلد باید برای سال \"{date_field}\" یکتا باشد." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "ورژن نامعتبر در هدر \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." -msgstr "" +msgstr "ورژن نامعتبر در مسیر URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "ورژن نامعتبر در مسیر URL. با هیچ نام گذاری ورژنی تطابق ندارد." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." -msgstr "" +msgstr "نسخه نامعتبر در نام هاست" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." -msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" +msgstr "ورژن نامعتبر در پارامتر کوئری." diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.mo b/rest_framework/locale/fi/LC_MESSAGES/django.mo index 67dd26ef2..50a6d0f8a 100644 Binary files a/rest_framework/locale/fi/LC_MESSAGES/django.mo and b/rest_framework/locale/fi/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.po b/rest_framework/locale/fi/LC_MESSAGES/django.po index 0791a3005..97e5c1394 100644 --- a/rest_framework/locale/fi/LC_MESSAGES/django.po +++ b/rest_framework/locale/fi/LC_MESSAGES/django.po @@ -5,13 +5,14 @@ # Translators: # Aarni Koskela, 2015 # Aarni Koskela, 2015-2016 +# Kimmo Huoman , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Aarni Koskela\n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Finnish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,423 +20,556 @@ msgstr "" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." -msgstr "Epäkelpo perusotsake. Ei annettuja tunnuksia." +msgstr "Epäkelpo \"basic\" -otsake. Ei annettuja tunnuksia." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "Epäkelpo perusotsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." +msgstr "Epäkelpo \"basic\" -otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "Epäkelpo perusotsake. Tunnukset eivät ole base64-koodattu." +msgstr "Epäkelpo \"basic\" -otsake. Tunnukset eivät ole base64-koodattu." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Epäkelpo käyttäjänimi tai salasana." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Käyttäjä ei-aktiivinen tai poistettu." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "Epäkelpo Token-otsake. Ei annettuja tunnuksia." +msgstr "Epäkelpo \"token\" -otsake. Ei annettuja tunnuksia." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." +msgstr "Epäkelpo \"token\" -otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää epäkelpoja merkkejä." +msgstr "Epäkelpo \"token\" -otsake. Tunnusmerkkijono ei saa sisältää epäkelpoja merkkejä." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." -msgstr "Epäkelpo Token." +msgstr "Epäkelpo token." #: authtoken/apps.py:7 msgid "Auth Token" msgstr "Autentikaatiotunniste" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Avain" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Käyttäjä" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Luotu" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Tunniste" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tunnisteet" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Käyttäjänimi" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Salasana" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Käyttäjätili ei ole käytössä." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "Ei voitu kirjautua annetuilla tunnuksilla." +msgstr "Kirjautuminen epäonnistui annetuilla tunnuksilla." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Pitää sisältää \"username\" ja \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Sattui palvelinvirhe." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Pyyntö on virheellisen muotoinen." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Väärät autentikaatiotunnukset." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Autentikaatiotunnuksia ei annettu." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "Sinulla ei ole lupaa suorittaa tätä toimintoa." +msgstr "Sinulla ei ole oikeutta suorittaa tätä toimintoa." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Ei löydy." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metodi \"{method}\" ei ole sallittu." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Ei voitu vastata pyynnön Accept-otsakkeen mukaisesti." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Pyyntö hidastettu." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Tämä kenttä vaaditaan." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Tämän kentän arvo ei voi olla \"null\"." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" ei ole kelvollinen totuusarvo." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Tämä kenttä ei voi olla tyhjä." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Arvo saa olla enintään {max_length} merkkiä pitkä." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Arvo tulee olla vähintään {min_length} merkkiä pitkä." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Syötä kelvollinen sähköpostiosoite." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Arvo ei täsmää vaadittuun kuvioon." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja tavuviivoja (_ -)." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Syötä oikea URL-osoite." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "{value} ei ole kelvollinen UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Syötä kelvollinen kokonaisluku." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "Tämän arvon on oltava enintään {max_value}." +msgstr "Tämän arvon on oltava pienempi tai yhtä suuri kuin {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "Tämän luvun on oltava vähintään {min_value}." +msgstr "Tämän luvun on oltava suurempi tai yhtä suuri kuin {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Liian suuri merkkijonoarvo." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Kelvollinen luku vaaditaan." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Tässä luvussa voi olla yhteensä enintään {max_digits} numeroa." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "Tässä luvussa saa olla enintään {max_decimal_places} desimaalia." +msgstr "Tässä luvussa voi olla enintään {max_decimal_places} desimaalia." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "Tässä luvussa saa olla enintään {max_whole_digits} numeroa ennen desimaalipilkkua." +msgstr "Tässä luvussa voi olla enintään {max_whole_digits} numeroa ennen desimaalipilkkua." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Virheellinen päivämäärän/ajan muotoilu. Käytä jotain näistä muodoista: {format}" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Odotettiin päivämäärää ja aikaa, saatiin vain päivämäärä." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Virheellinen päivämäärän muotoilu. Käytä jotain näistä muodoista: {format}" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Odotettiin päivämäärää, saatiin päivämäärä ja aika." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Virheellinen kellonajan muotoilu. Käytä jotain näistä muodoista: {format}" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Virheellinen keston muotoilu. Käytä jotain näistä muodoista: {format}" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ei ole kelvollinen valinta." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Enemmän kuin {count} kappaletta..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Odotettiin listaa, saatiin tyyppi {input_type}." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Valinta ei saa olla tyhjä." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" ei ole kelvollinen polku." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Yhtään tiedostoa ei ole lähetetty." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Tiedostonimeä ei voitu päätellä." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Lähetetty tiedosto on tyhjä." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Varmista että tiedostonimi on enintään {max_length} merkkiä pitkä (nyt {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Lista ei saa olla tyhjä." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Odotettiin sanakirjaa, saatiin tyyppi {input_type}." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Arvon pitää olla kelvollista JSONia." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Lähetä" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Haku" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Järjestys" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "nouseva" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "laskeva" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Epäkelpo sivu." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Epäkelpo kursori" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Epäkelpo pääavain {pk_value} - objektia ei ole olemassa." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Väärä tyyppi. Odotettiin pääavainarvoa, saatiin {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Epäkelpo linkki - URL ei täsmää." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Epäkelpo linkki - epäkelpo URL-osuma." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Epäkelpo linkki - objektia ei ole." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Epäkelpo tyyppi. Odotettiin URL-merkkijonoa, saatiin {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objektia ({slug_name}={value}) ei ole." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Epäkelpo arvo." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Odotettiin sanakirjaa, saatiin tyyppi {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Suotimet" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Kenttäsuotimet" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Järjestys" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Haku" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ei mitään" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Ei valittavia kohteita." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Arvon tulee olla uniikki." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Kenttien {field_names} tulee muodostaa uniikki joukko." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Kentän tulee olla uniikki päivämäärän {date_field} suhteen." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Kentän tulee olla uniikki kuukauden {date_field} suhteen." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Epäkelpo versio Accept-otsakkeessa." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Epäkelpo versio URL-polussa." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "URL-polun versio ei täsmää mihinkään versionimiavaruuteen." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Epäkelpo versio palvelinosoitteessa." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Epäkelpo versio kyselyparametrissa." - -#: views.py:88 -msgid "Permission denied." -msgstr "Pääsy evätty." diff --git a/rest_framework/locale/fr/LC_MESSAGES/django.mo b/rest_framework/locale/fr/LC_MESSAGES/django.mo index b462e08d7..a1c0b3c2d 100644 Binary files a/rest_framework/locale/fr/LC_MESSAGES/django.mo and b/rest_framework/locale/fr/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/fr/LC_MESSAGES/django.po b/rest_framework/locale/fr/LC_MESSAGES/django.po index 25b39e453..c2e08c80b 100644 --- a/rest_framework/locale/fr/LC_MESSAGES/django.po +++ b/rest_framework/locale/fr/LC_MESSAGES/django.po @@ -3,16 +3,18 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Erwann Mest , 2019 # Etienne Desgagné , 2015 # Martin Maillard , 2015 # Martin Maillard , 2015 +# Stéphane Raimbault , 2019 # Xavier Ordoquy , 2015-2016 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: French (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr/)\n" "MIME-Version: 1.0\n" @@ -21,40 +23,40 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "En-tête « basic » non valide. Informations d'identification non fournies." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "En-tête « basic » non valide. Les informations d'identification ne doivent pas contenir d'espaces." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "En-tête « basic » non valide. Encodage base64 des informations d'identification incorrect." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nom d'utilisateur et/ou mot de passe non valide(s)." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Utilisateur inactif ou supprimé." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "En-tête « token » non valide. Informations d'identification non fournies." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "En-tête « token » non valide. Un token ne doit pas contenir d'espaces." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "En-tête « token » non valide. Un token ne doit pas contenir de caractères invalides." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token non valide." @@ -62,382 +64,515 @@ msgstr "Token non valide." msgid "Auth Token" msgstr "Jeton d'authentification" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Clef" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Utilisateur" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Création" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Jeton" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Jetons" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Nom de l'utilisateur" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Mot de passe" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Ce compte est désactivé." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Impossible de se connecter avec les informations d'identification fournies." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "\"username\" et \"password\" doivent être inclus." +msgstr "« username » et « password » doivent être inclus." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Une erreur du serveur est survenue." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Requête malformée" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Informations d'authentification incorrectes." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Informations d'authentification non fournies." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Vous n'avez pas la permission d'effectuer cette action." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Pas trouvé." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "Méthode \"{method}\" non autorisée." +msgstr "Méthode « {method} » non autorisée." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "L'en-tête « Accept » n'a pas pu être satisfaite." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "Type de média \"{media_type}\" non supporté." +msgstr "Type de média « {media_type} » non supporté." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Requête ralentie." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Ce champ est obligatoire." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Ce champ ne peut être nul." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" n'est pas un booléen valide." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Ce champ ne peut être vide." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "Assurez-vous que ce champ comporte au plus {max_length} caractères." +msgstr "Assurez-vous que ce champ comporte au plus {max_length} caractères." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "Assurez-vous que ce champ comporte au moins {min_length} caractères." +msgstr "Assurez-vous que ce champ comporte au moins {min_length} caractères." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "Saisissez une adresse email valable." +msgstr "Saisissez une adresse e-mail valide." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Cette valeur ne satisfait pas le motif imposé." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et des traits d'union." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Saisissez une URL valide." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" n'est pas un UUID valide." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Saisissez une adresse IPv4 ou IPv6 valide." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Un nombre entier valide est requis." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "Assurez-vous que cette valeur est inférieure ou égale à {max_value}." +msgstr "Assurez-vous que cette valeur est inférieure ou égale à {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "Assurez-vous que cette valeur est supérieure ou égale à {min_value}." +msgstr "Assurez-vous que cette valeur est supérieure ou égale à {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Chaîne de caractères trop longue." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Un nombre valide est requis." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "Assurez-vous qu'il n'y a pas plus de {max_digits} chiffres au total." +msgstr "Assurez-vous qu'il n'y a pas plus de {max_digits} chiffres au total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "Assurez-vous qu'il n'y a pas plus de {max_decimal_places} chiffres après la virgule." +msgstr "Assurez-vous qu'il n'y a pas plus de {max_decimal_places} chiffres après la virgule." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Assurez-vous qu'il n'y a pas plus de {max_whole_digits} chiffres avant la virgule." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "La date + heure n'a pas le bon format. Utilisez un des formats suivants : {format}." +msgstr "La date + heure n'a pas le bon format. Utilisez un des formats suivants : {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Attendait une date + heure mais a reçu une date." -#: fields.py:1103 -msgid "Date has wrong format. Use one of these formats instead: {format}." -msgstr "La date n'a pas le bon format. Utilisez un des formats suivants : {format}." +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" -#: fields.py:1104 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "La date n'a pas le bon format. Utilisez un des formats suivants : {format}." + +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Attendait une date mais a reçu une date + heure." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "L'heure n'a pas le bon format. Utilisez un des formats suivants : {format}." +msgstr "L'heure n'a pas le bon format. Utilisez un des formats suivants : {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "La durée n'a pas le bon format. Utilisez l'un des formats suivants: {format}." +msgstr "La durée n'a pas le bon format. Utilisez l'un des formats suivants : {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "\"{input}\" n'est pas un choix valide." +msgstr "« {input} » n'est pas un choix valide." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Plus de {count} éléments..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "Attendait une liste d'éléments mais a reçu \"{input_type}\"." +msgstr "Attendait une liste d'éléments mais a reçu « {input_type} »." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Cette sélection ne peut être vide." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "\"{input}\" n'est pas un choix de chemin valide." +msgstr "« {input} » n'est pas un choix de chemin valide." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Aucun fichier n'a été soumis." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "La donnée soumise n'est pas un fichier. Vérifiez le type d'encodage du formulaire." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Le nom de fichier n'a pu être déterminé." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Le fichier soumis est vide." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "Assurez-vous que le nom de fichier comporte au plus {max_length} caractères (il en comporte {length})." +msgstr "Assurez-vous que le nom de fichier comporte au plus {max_length} caractères (il en comporte {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Transférez une image valide. Le fichier que vous avez transféré n'est pas une image, ou il est corrompu." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Cette liste ne peut pas être vide." -#: fields.py:1502 -msgid "Expected a dictionary of items but got type \"{input_type}\"." -msgstr "Attendait un dictionnaire d'éléments mais a reçu \"{input_type}\"." +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" -#: fields.py:1549 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Attendait un dictionnaire d'éléments mais a reçu « {input_type} »." + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "La valeur doit être un JSON valide." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Envoyer" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Recherche" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordre" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "croissant" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "décroissant" -#: pagination.py:193 -msgid "Invalid page." -msgstr "Page invalide." +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" -#: pagination.py:427 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "Page non valide." + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Curseur non valide" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "Clé primaire \"{pk_value}\" non valide - l'objet n'existe pas." +msgstr "Clé primaire « {pk_value} » non valide - l'objet n'existe pas." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Type incorrect. Attendait une clé primaire, a reçu {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." -msgstr "Lien non valide : pas d'URL correspondante." +msgstr "Lien non valide : pas d'URL correspondante." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "Lien non valide : URL correspondante incorrecte." +msgstr "Lien non valide : URL correspondante incorrecte." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." -msgstr "Lien non valide : l'objet n'existe pas." +msgstr "Lien non valide : l'objet n'existe pas." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Type incorrect. Attendait une URL, a reçu {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'object avec {slug_name}={value} n'existe pas." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valeur non valide." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Donnée non valide. Attendait un dictionnaire, a reçu {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtres" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filtres de champ" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordre" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Recherche" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Aucune" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Aucun élément à sélectionner." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Ce champ doit être unique." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Les champs {field_names} doivent former un ensemble unique." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "Ce champ doit être unique pour la date \"{date_field}\"." +msgstr "Ce champ doit être unique pour la date « {date_field} »." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "Ce champ doit être unique pour le mois \"{date_field}\"." +msgstr "Ce champ doit être unique pour le mois « {date_field} »." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "Ce champ doit être unique pour l'année \"{date_field}\"." +msgstr "Ce champ doit être unique pour l'année « {date_field} »." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Version non valide dans l'en-tête « Accept »." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Version non valide dans l'URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Version invalide dans l'URL. Ne correspond à aucune version de l'espace de nommage." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Version non valide dans le nom d'hôte." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Version non valide dans le paramètre de requête." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permission refusée." diff --git a/rest_framework/locale/hu/LC_MESSAGES/django.mo b/rest_framework/locale/hu/LC_MESSAGES/django.mo index 8fadddcea..61f285299 100644 Binary files a/rest_framework/locale/hu/LC_MESSAGES/django.mo and b/rest_framework/locale/hu/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/hu/LC_MESSAGES/django.po b/rest_framework/locale/hu/LC_MESSAGES/django.po index 9002f8e61..a1d75b9f0 100644 --- a/rest_framework/locale/hu/LC_MESSAGES/django.po +++ b/rest_framework/locale/hu/LC_MESSAGES/django.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Zoltan Szalai , 2015 +# Zoltan Szalai , 2015,2018-2019 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Hungarian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,423 +18,556 @@ msgstr "" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." -msgstr "Érvénytelen basic fejlécmező. Nem voltak megadva azonosítók." +msgstr "Érvénytelen basic fejléc. Nem voltak megadva azonosítók." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "Érvénytelen basic fejlécmező. Az azonosító karakterlánc nem tartalmazhat szóközöket." +msgstr "Érvénytelen basic fejléc. Az azonosító karakterlánc nem tartalmazhat szóközöket." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "Érvénytelen basic fejlécmező. Az azonosítók base64 kódolása nem megfelelő." +msgstr "Érvénytelen basic fejléc. Az azonosítók base64 kódolása nem megfelelő." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Érvénytelen felhasználónév/jelszó." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "A felhasználó nincs aktiválva vagy törölve lett." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "Érvénytelen token fejlécmező. Nem voltak megadva azonosítók." +msgstr "Érvénytelen token fejléc. Nem voltak megadva azonosítók." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "Érvénytelen token fejlécmező. A token karakterlánc nem tartalmazhat szóközöket." +msgstr "Érvénytelen token fejléc. A token karakterlánc nem tartalmazhat szóközöket." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Érvénytelen token fejléc. A token karakterlánc nem tartalmazhat érvénytelen karaktereket." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Érvénytelen token." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Auth token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Kulcs" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Felhasználó" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Létrehozva" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Tokenek" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Felhasználónév" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Jelszó" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "A felhasználó tiltva van." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "A megadott azonosítókkal nem lehet bejelentkezni." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Tartalmaznia kell a \"felhasználónevet\" és a \"jelszót\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Szerver oldali hiba történt." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Hibás kérés." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Hibás azonosítók." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Nem voltak megadva azonosítók." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Nincs jogosultsága a művelet végrehajtásához." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nem található." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "A \"{method}\" metódus nem megengedett." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "A kérés Accept fejlécmezőjét nem lehetett kiszolgálni." +msgstr "A kérés Accept fejlécét nem lehetett teljesíteni." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Nem támogatott média típus \"{media_type}\" a kérésben." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "A kérés korlátozva lett." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Ennek a mezőnek a megadása kötelező." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Ez a mező nem lehet null értékű." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "Az \"{input}\" nem egy érvényes logikai érték." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Ez a mező nem lehet üres." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Bizonyosodjon meg arról, hogy ez a mező legfeljebb {max_length} karakterből áll." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Bizonyosodjon meg arról, hogy ez a mező legalább {min_length} karakterből áll." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Adjon meg egy érvényes e-mail címet!" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Ez az érték nem illeszkedik a szükséges mintázatra." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Az URL barát cím csak betűket, számokat, aláhúzásokat és kötőjeleket tartalmazhat." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Adjon meg egy érvényes URL-t!" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Adjon meg egy érvényes IPv4 vagy IPv6 címet!" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Egy érvényes egész szám megadása szükséges." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Bizonyosodjon meg arról, hogy ez az érték legfeljebb {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Bizonyosodjon meg arról, hogy ez az érték legalább {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "A karakterlánc túl hosszú." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Egy érvényes szám megadása szükséges." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Bizonyosodjon meg arról, hogy a számjegyek száma összesen legfeljebb {max_digits}." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Bizonyosodjon meg arról, hogy a tizedes tört törtrészében levő számjegyek száma összesen legfeljebb {max_decimal_places}." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Bizonyosodjon meg arról, hogy a tizedes tört egész részében levő számjegyek száma összesen legfeljebb {max_whole_digits}." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "A dátum formátuma hibás. Használja ezek valamelyikét helyette: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Időt is tartalmazó dátum helyett egy időt nem tartalmazó dátum lett elküldve." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "A dátum formátuma hibás. Használja ezek valamelyikét helyette: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Időt nem tartalmazó dátum helyett egy időt is tartalmazó dátum lett elküldve." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Az idő formátuma hibás. Használja ezek valamelyikét helyette: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Az időtartam formátuma hibás. Használja ezek valamelyikét helyette: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "Az \"{input}\" nem egy érvényes elem." +msgstr "Érvénytelen választási lehetőség: \"{input}\"" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Több, mint {count} elem ..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Elemek listája helyett \"{input_type}\" lett elküldve." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "Választania kell egy elemet." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "Érvénytelen választási lehetőség: \"{input}\"" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Semmilyen fájl sem került feltöltésre." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Az elküldött adat nem egy fájl volt. Ellenőrizze a kódolás típusát az űrlapon!" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "A fájlnév nem megállapítható." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "A küldött fájl üres." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Bizonyosodjon meg arról, hogy a fájlnév legfeljebb {max_length} karakterből áll (jelenlegi hossza: {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Töltsön fel egy érvényes képfájlt! A feltöltött fájl nem kép volt, vagy megsérült." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "Nem lehet üres a lista." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Dictionary elemek helyett \"{input_type}\" lett megadva." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Az értéknek érvényes JSON-nek lennie." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Keresés" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Rendezés" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "növekvő" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "csökkenő" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "Érvénytelen oldal." + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" -msgstr "" +msgstr "Érvénytelen kurzor" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Érvénytelen pk \"{pk_value}\" - az objektum nem létezik." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Helytelen típus. pk érték helyett {data_type} lett elküldve." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Érvénytelen link - Nem illeszkedő URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Érvénytelen link. - Eltérő URL illeszkedés." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Érvénytelen link - Az objektum nem létezik." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Helytelen típus. URL karakterlánc helyett {data_type} lett elküldve." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Nem létezik olyan objektum, amelynél {slug_name}={value}." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Érvénytelen érték." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Érvénytelen adat. Egy dictionary helyett {datatype} lett elküldve." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "Szűrők" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "Semmi" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "Nincsenek kiválasztható elemek." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Ennek a mezőnek egyedinek kell lennie." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "A {field_names} mezőnevek nem tartalmazhatnak duplikátumot." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" dátumra." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" hónapra." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" évre." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." -msgstr "Érvénytelen verzió az \"Accept\" fejlécmezőben." +msgstr "Érvénytelen verzió az \"Accept\" fejlécben." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Érvénytelen verzió az URL elérési útban." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Érvénytelen verzió az URL elérési útban. Nem illeszkedik egyetlen verzió névtérre sem." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Érvénytelen verzió a hosztnévben." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Érvénytelen verzió a lekérdezési paraméterben." - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/hy/LC_MESSAGES/django.mo b/rest_framework/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 000000000..c5f3ebcfa Binary files /dev/null and b/rest_framework/locale/hy/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/hy/LC_MESSAGES/django.po b/rest_framework/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 000000000..7ccfd0642 --- /dev/null +++ b/rest_framework/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,573 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Arnak Melikyan , 2019 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Armenian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "Անվավեր վերնագիր: Նույնականացման տվյալները տրամադրված չեն:" + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "Անվավեր վերնագիր: Նույնականացման տողը չպետք է պարունակի բացատներ:" + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "Անվավեր վերնագիր: Նույնականացման տվյալները սխալ են ձեւակերպված base64-ում:" + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "Անվավեր օգտանուն / գաղտնաբառ:" + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "Օգտատերը ջնջված է կամ ոչ ակտիվ:" + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "Անվավեր տոկենի վերնագիր: Նույնականացման տվյալները տրամադրված չեն:" + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "Անվավեր տոկենի վերնագիր: Տոկենի տողը չպետք է պարունակի բացատներ:" + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "Անվավեր տոկենի վերնագիր: Տոկենի տողը չպետք է պարունակի անթույլատրելի նիշեր:" + +#: authentication.py:203 +msgid "Invalid token." +msgstr "Անվավեր տոկեն։" + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "Վավերացման Տոկեն։" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "Բանալի" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Օգտատեր" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "Ստեղծված է" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "Տոկեն" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "Տոկեններ" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "Օգտանուն" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "Գաղտնաբառ" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "Անհնար է մուտք գործել տրամադրված նույնականացման տվյալներով:" + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "Պետք է ներառի «օգտանուն» եւ «գաղտնաբառ»:" + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "Տեղի ունեցել սերվերի սխալ:" + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "Սխալ հարցում:" + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "Սխալ նույնականացման տվյալներ։" + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "Նույնականացման տվյալները տրամադրված չեն:" + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "Այս գործողությունը կատարելու թույլտվություն չունեք:" + +#: exceptions.py:185 +msgid "Not found." +msgstr "Չի գտնվել։" + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "\"{method}\" մեթոդը թույլատրված չէ:" + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "Չհաջողվեց բավարարել հարցման Ընդունել վերնագիրը:" + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "Անհամապատասխան մեդիա տիպ \"{media_type}\":" + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "Հարցումն ընդհատվել է:" + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "Այս դաշտը պարտադիր է:" + +#: fields.py:317 +msgid "This field may not be null." +msgstr "Այս դաշտը չի կարող զրոյական լինել:" + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "Այս դաշտը չի կարող դատարկ լինել:" + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "Համոզվեք, որ այս դաշտը լինի ոչ ավել, քան {max_length} նիշ:" + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "Համոզվեք, որ այս դաշտը ունի առնվազն {min_length} նիշ:" + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "Մուտքագրեք վավեր էլ.փոստի հասցե:" + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "Այս արժեքը չի համապատասխանում պահանջվող օրինակին:" + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "Մուտքագրեք վավեր \"slug\", որը բաղկացած է տառերից, թվերից, ընդգծումից կամ դեֆիսից:" + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "Մուտքագրեք վավեր հղում:" + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Մուտքագրեք վավեր IPv4 կամ IPv6 հասցե:" + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "Պահանջվում է լիարժեք ամբողջական թիվ:" + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "Համոզվեք, որ արժեքը փոքր է կամ հավասար {max_value} -ին։" + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "Համոզվեք, որ արժեքը մեծ է կամ հավասար {min_value} -ին։" + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "Տողը ունի չափազանց մեծ արժեք:" + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "Պահանջվում է վավեր համար:" + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "Համոզվեք, որ {max_digits} -ից ավել թվանշան չկա:" + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "Համոզվեք, որ {max_decimal_places} -ից ավել տասնորդական նշան չկա:" + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "Համոզվեք, որ տասնորդական կետից առաջ չկա {max_whole_digits} -ից ավել թվանշան:" + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "Datetime -ը սխալ ձեւաչափ ունի: Փոխարենը օգտագործեք այս ձեւաչափերից մեկը. {format} ։" + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "Ակնկալվում է օրվա ժամը, սակայն ամսաթիվ է ստացել:" + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Ամսաթիվն ունի սխալ ձեւաչափ: Փոխարենը օգտագործեք այս ձեւաչափերից մեկը. {format} ։" + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "Ակնկալվում է ամսաթիվ, սակայն ստացել է օրվա ժամը:" + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "Ժամանակը սխալ ձեւաչափ ունի: Փոխարենը օգտագործեք այս ձեւաչափերից մեկը. {format} ։" + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "Տեւողությունը սխալ ձեւաչափ ունի: Փոխարենը օգտագործեք այս ձեւաչափերից մեկը. {format} ։" + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" -ը վավեր ընտրություն չէ:" + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "Ավելի քան {count} առարկա..." + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "Ակնկալվում է տարրերի ցանկ, բայց ստացել է \"{input_type}\" -ի տիպ:" + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "Այս ընտրությունը չի կարող դատարկ լինել:" + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\" -ը վավեր ճանապարհի ընտրություն չէ:" + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "Ոչ մի ֆայլ չի ուղարկվել:" + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "Ուղարկված տվյալը ֆայլ չէ: Ստուգեք կոդավորման տիպը:" + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "Ֆայլի անունը հնարավոր չէ որոշվել:" + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "Ուղարկված ֆայլը դատարկ է:" + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "Համոզվեք, որ այս ֆայլի անունը ունի առավելագույնը {max_length} նիշ, (այն ունի {length})։" + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Վերբեռնեք վավեր նկար: Ձեր բեռնած ֆայլը կամ նկար չէ կամ վնասված նկար է:" + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "Այս ցանկը չի կարող դատարկ լինել:" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Ակնկալվում է տարրերի բառարան, բայց ստացել է \"{input_type}\" տիպ։" + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "Արժեքը պետք է լինի JSON:" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Որոնում" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Պատվիրել" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "աճման կարգով" + +#: filters.py:288 +msgid "descending" +msgstr "նվազման կարգով" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "Անվավեր էջ:" + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "Սխալ կուրսոր" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "Անվավեր pk \"{pk_value}\" օբյեկտը գոյություն չունի:" + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "Անհայտ տիպ: Ակնկալվում է pk արժեք, ստացված է {data_type}։" + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "Անվավեր հղում - Ոչ մի հղման համընկնում:" + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "Անվավեր հղում - սխալ հղման համընկնում:" + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "Անվավեր հղում - տվյալ օբյեկտը գոյություն չունի:" + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "Անվավեր տիպ: Սպասվում է հղման տողը, ստացել է {data_type}։" + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "{slug_name}={value} տվյալ պարունակությամբ օբյեկտ գոյություն չունի:" + +#: relations.py:449 +msgid "Invalid value." +msgstr "Անվավեր արժեք:" + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "Անվավեր տվյալներ: Սպասվում է բառարան, բայց ստացվել է {datatype}։" + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "Ֆիլտրեր" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "Ոչ մեկը" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "Ոչ մի տարր ընտրված չէ։" + +#: validators.py:39 +msgid "This field must be unique." +msgstr "Այս դաշտը պետք է լինի եզակի:" + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "{field_names} դաշտերը պետք է կազմեն եզակի հավաքածու:" + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "Այս դաշտը պետք է եզակի լինի \"{date_field}\" ամսաթվի համար:" + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "Այս դաշտը պետք է եզակի լինի \"{date_field}\" ամսվա համար:" + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "Այս դաշտը պետք է եզակի լինի \"{date_field}\" տարվա համար:" + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "\"Accept\" վերնագրի անվավեր տարբերակ:" + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "Անվավեր տարբերակ հղման ճանապարհի մեջ:" + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "Անվավեր տարբերակ հղման ճանապարհի մեջ: Չի համապատասխանում որեւէ անվանման տարբերակի:" + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "Անվավեր տարբերակ անվանման մեջ:" + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "Անվավեր տարբերակ `հարցման պարամետրում:" diff --git a/rest_framework/locale/id/LC_MESSAGES/django.mo b/rest_framework/locale/id/LC_MESSAGES/django.mo index 471d5a830..c67e2a1da 100644 Binary files a/rest_framework/locale/id/LC_MESSAGES/django.mo and b/rest_framework/locale/id/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/id/LC_MESSAGES/django.po b/rest_framework/locale/id/LC_MESSAGES/django.po index c84add0a4..b3d3c2e89 100644 --- a/rest_framework/locale/id/LC_MESSAGES/django.po +++ b/rest_framework/locale/id/LC_MESSAGES/django.po @@ -3,13 +3,17 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Aldiantoro Nugroho , 2017 +# aslam hadi , 2017 +# Joseph Aditya P G, 2019 +# Xavier Ordoquy , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 20:03+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Indonesian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,423 +21,556 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "Nama pengguna atau kata sandi salah." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "Pengguna tidak akfif atau telah dihapus." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "" #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Token Autentikasi" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" -msgstr "" +msgstr "Pengguna" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Token" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Nama pengguna" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Kata sandi" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "Tidak dapat masuk dengan data pengguna ini." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "Nama pengguna dan password harus diisi." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." +msgstr "Terjadi galat di server." + +#: exceptions.py:142 +msgid "Invalid input." msgstr "" -#: exceptions.py:84 +#: exceptions.py:161 msgid "Malformed request." msgstr "" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." -msgstr "" +msgstr "Data autentikasi salah." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." -msgstr "" +msgstr "Data autentikasi tidak diberikan." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "Anda tidak memiliki izin untuk melakukan tindakan ini." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "Data tidak ditemukan." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "Permintaan dengan header Accept ini tidak dapat dipenuhi." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "Jenis media \"{media_type}\" dalam permintaan ini tidak didukung." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." +msgstr "Permintaan ini telah dibatasi." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." -msgstr "" +msgstr "Bidang ini harus diisi." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." +msgstr "Bidang ini tidak boleh diisi dengan \"null\"." + +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:766 +msgid "Not a valid string." msgstr "" -#: fields.py:674 +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "Bidang ini tidak boleh kosong." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "Isi bidang ini tidak boleh melebihi {max_length} karakter." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "Isi bidang ini minimal {min_length} karakter." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "Masukkan alamat email dengan format yang benar." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." +msgstr "Karakter \"slug\" hanya dapat terdiri dari huruf, angka, underscore dan tanda hubung." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." msgstr "" -#: fields.py:747 +#: fields.py:854 msgid "Enter a valid URL." +msgstr "Masukkan URL dengan format yang benar." + +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "" - -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Masukkan alamat IPv4 atau IPv6 dengan format yang benar." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." -msgstr "" +msgstr "Nilai bidang ini harus berupa bilangan bulat." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "Isi bidang ini harus kurang atau sama dengan {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "Isi bidang ini harus lebih atau sama dengan {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "" +msgstr "Panjang angka tidak boleh lebih dari {max_digits}." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "Panjang angka di belakang koma tidak boleh lebih dari {max_decimal_places}." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "Panjang angka bulat tidak boleh lebih dari {max_whole_digits}." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Format tanggal dan waktu salah. Gunakan salah satu format berikut: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1103 -msgid "Date has wrong format. Use one of these formats instead: {format}." +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1104 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Format tanggal salah. Gunakan salah satu format berikut: {format}." + +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Format waktu salah. Gunakan salah satu format berikut: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Format durasi salah. Gunakan salah satu format berikut: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" tidak ada dalam daftar pilihan." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "Pilihan tidak boleh kosong." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "" +msgstr "Pilih berkas terlebih dahulu." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "" +msgstr "Berkas kosong." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "" +msgstr "Panjang nama berkas tidak boleh lebih dari {max_length}. Panjang nama berkas ini {length} karakter." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Isi bidang ini harus berupa dictionary, bukan \"{input_type}\"." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Isi bidang ini harus berupa JSON." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:336 +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "Objek dengan primary key \"{pk_value}\" tidak ditemukan." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/it/LC_MESSAGES/django.mo b/rest_framework/locale/it/LC_MESSAGES/django.mo index 1d4fd34c3..6c84273a9 100644 Binary files a/rest_framework/locale/it/LC_MESSAGES/django.mo and b/rest_framework/locale/it/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/it/LC_MESSAGES/django.po b/rest_framework/locale/it/LC_MESSAGES/django.po index a48f8645d..c44c6f257 100644 --- a/rest_framework/locale/it/LC_MESSAGES/django.po +++ b/rest_framework/locale/it/LC_MESSAGES/django.po @@ -4,16 +4,18 @@ # # Translators: # Antonio Mancina , 2015 +# Marco Ventura, 2019 # Mattia Procopio , 2015 +# Riccardo Magliocchetti , 2019 # Sergio Morstabilini , 2015 # Xavier Ordoquy , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Italian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,423 +23,556 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Header di base invalido. Credenziali non fornite." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Header di base invalido. Le credenziali non dovrebbero contenere spazi." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Credenziali non correttamente codificate in base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nome utente/password non validi" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Utente inattivo o eliminato." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Header del token non valido. Credenziali non fornite." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Header del token non valido. Il contenuto del token non dovrebbe contenere spazi." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Header del token invalido. La stringa del token non dovrebbe contenere caratteri illegali." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token invalido." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Auth Token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Key" + +#: authtoken/models.py:16 +msgid "User" +msgstr "User" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Creato" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "I Token" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Username" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Password" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "L'account dell'utente è disabilitato" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Impossibile eseguire il login con le credenziali immesse." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Deve includere \"nome utente\" e \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Errore del server." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Richiesta malformata." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Credenziali di autenticazione incorrette." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Non sono state immesse le credenziali di autenticazione." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Non hai l'autorizzazione per eseguire questa azione." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Non trovato." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metodo \"{method}\" non consentito" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Impossibile soddisfare l'header \"Accept\" presente nella richiesta." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Tipo di media \"{media_type}\"non supportato." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "La richiesta è stata limitata (throttled)." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Campo obbligatorio." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Il campo non può essere nullo." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" non è un valido valore booleano." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Questo campo non può essere omesso." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Assicurati che questo campo non abbia più di {max_length} caratteri." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Assicurati che questo campo abbia almeno {min_length} caratteri." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Inserisci un indirizzo email valido." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Questo valore non corrisponde alla sequenza richiesta." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Immetti uno \"slug\" valido che consista di lettere, numeri, underscore o trattini." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Inserisci un URL valido" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" non è un UUID valido." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Inserisci un indirizzo IPv4 o IPv6 valido." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "È richiesto un numero intero valido." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Assicurati che il valore sia minore o uguale a {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Assicurati che il valore sia maggiore o uguale a {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Stringa troppo lunga." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "È richiesto un numero valido." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Assicurati che non ci siano più di {max_digits} cifre in totale." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Assicurati che non ci siano più di {max_decimal_places} cifre decimali." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Assicurati che non ci siano più di {max_whole_digits} cifre prima del separatore decimale." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "L'oggetto di tipo datetime è in un formato errato. Usa uno dei seguenti formati: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Atteso un oggetto di tipo datetime ma l'oggetto ricevuto è di tipo date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "La data è in un formato errato. Usa uno dei seguenti formati: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Atteso un oggetto di tipo date ma l'oggetto ricevuto è di tipo datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "L'orario ha un formato errato. Usa uno dei seguenti formati: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "La durata è in un formato errato. Usa uno dei seguenti formati: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" non è una scelta valida." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Più di {count} oggetti..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Attesa una lista di oggetti ma l'oggetto ricevuto è di tipo \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "Questa selezione potrebbe non essere vuota." +msgstr "Questa selezione non può essere vuota." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" non è un percorso valido." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Non è stato inviato alcun file." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "I dati inviati non corrispondono ad un file. Si prega di controllare il tipo di codifica nel form." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Il nome del file non può essere determinato." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Il file inviato è vuoto." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Assicurati che il nome del file abbia, al più, {max_length} caratteri (attualmente ne ha {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Invia un'immagine valida. Il file che hai inviato non era un'immagine o era corrotto." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." -msgstr "Questa lista potrebbe non essere vuota." +msgstr "Questa lista non può essere vuota." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Era atteso un dizionario di oggetti ma il dato ricevuto è di tipo \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Il valore deve essere un JSON valido." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Invia" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Cerca" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordinamento" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "ascendente" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "discendente" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "Pagina non valida." + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Cursore non valido" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Pk \"{pk_value}\" non valido - l'oggetto non esiste." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tipo non corretto. Era atteso un valore pk, ma è stato ricevuto {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Collegamento non valido - Nessuna corrispondenza di URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Collegamento non valido - Corrispondenza di URL non corretta." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Collegamento non valido - L'oggetto non esiste." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tipo non corretto. Era attesa una stringa URL, ma è stato ricevuto {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'oggetto con {slug_name}={value} non esiste." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valore non valido." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Dati non validi. Era atteso un dizionario, ma si è ricevuto {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtri" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filtri per il campo" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordinamento" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Cerca" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Nessuno" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Nessun elemento da selezionare." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Questo campo deve essere unico." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "I campi {field_names} devono costituire un insieme unico." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Questo campo deve essere unico per la data \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Questo campo deve essere unico per il mese \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Questo campo deve essere unico per l'anno \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Versione non valida nell'header \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Versione non valida nella sequenza URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Versione non valida nell'URL path. Non corrisponde con nessun namespace di versione." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Versione non valida nel nome dell'host." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Versione non valida nel parametro della query." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permesso negato." diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.mo b/rest_framework/locale/ja/LC_MESSAGES/django.mo index 5b9dbd8da..e949a57f7 100644 Binary files a/rest_framework/locale/ja/LC_MESSAGES/django.mo and b/rest_framework/locale/ja/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.po b/rest_framework/locale/ja/LC_MESSAGES/django.po index a5e72d9a1..6b8d71429 100644 --- a/rest_framework/locale/ja/LC_MESSAGES/django.po +++ b/rest_framework/locale/ja/LC_MESSAGES/django.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Kouichi Nishizawa \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Japanese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,40 +19,40 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "不正な基本ヘッダです。認証情報が含まれていません。" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "不正な基本ヘッダです。認証情報文字列に空白を含めてはいけません。" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "不正な基本ヘッダです。認証情報がBASE64で正しくエンコードされていません。" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "ユーザ名かパスワードが違います。" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "ユーザが無効か削除されています。" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "不正なトークンヘッダです。認証情報が含まれていません。" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "不正なトークンヘッダです。トークン文字列に空白を含めてはいけません。" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "不正なトークンヘッダです。トークン文字列に不正な文字を含めてはいけません。" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "不正なトークンです。" @@ -60,382 +60,515 @@ msgstr "不正なトークンです。" msgid "Auth Token" msgstr "認証トークン" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "キー" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "ユーザ" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "作成された" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "トークン" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "トークン" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "ユーザ名" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "パスワード" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "ユーザアカウントが無効化されています。" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "提供された認証情報でログインできません。" -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "\"username\"と\"password\"を含まなければなりません。" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "サーバエラーが発生しました。" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "不正な形式のリクエストです。" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "認証情報が正しくありません。" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "認証情報が含まれていません。" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "このアクションを実行する権限がありません。" -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "見つかりませんでした。" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "メソッド \"{method}\" は許されていません。" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "リクエストのAcceptヘッダを満たすことができませんでした。" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "リクエストのメディアタイプ \"{media_type}\" はサポートされていません。" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "リクエストの処理は絞られました。" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "この項目は必須です。" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "この項目はnullにできません。" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" は有効なブーリアンではありません。" +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "この項目は空にできません。" -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "この項目が{max_length}文字より長くならないようにしてください。" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "この項目は少なくとも{min_length}文字以上にしてください。" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "有効なメールアドレスを入力してください。" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "この値は所要のパターンにマッチしません。" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "文字、数字、アンダースコア、またはハイフンから成る有効な \"slug\" を入力してください。" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "有効なURLを入力してください。" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" は有効なUUIDではありません。" +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "有効なIPv4またはIPv6アドレスを入力してください。" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "有効な整数を入力してください。" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "この値は{max_value}以下にしてください。" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "この値は{min_value}以上にしてください。" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "文字列が長過ぎます。" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "有効な数値を入力してください。" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "合計で最大{max_digits}桁以下になるようにしてください。" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "小数点以下の桁数を{max_decimal_places}を超えないようにしてください。" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "整数部の桁数を{max_whole_digits}を超えないようにしてください。" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "日時の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "日付ではなく日時を入力してください。" -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "日付の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "日時ではなく日付を入力してください。" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "時刻の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "機関の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\"は有効な選択肢ではありません。" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr " {count} 個より多い..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "\"{input_type}\" 型のデータではなく項目のリストを入力してください。" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "空でない項目を選択してください。" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\"は有効なパスの選択肢ではありません。" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "ファイルが添付されていません。" -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "添付されたデータはファイルではありません。フォームのエンコーディングタイプを確認してください。" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "ファイル名が取得できませんでした。" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "添付ファイルの中身が空でした。" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "ファイル名は最大{max_length}文字にしてください({length}文字でした)。" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "有効な画像をアップロードしてください。アップロードされたファイルは画像でないか壊れた画像です。" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "リストは空ではいけません。" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "\"{input_type}\" 型のデータではなく項目の辞書を入力してください。" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "値は有効なJSONでなければなりません。" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "提出" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "検索" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "順序" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "昇順" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "降順" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "不正なページです。" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "カーソルが不正です。" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "主キー \"{pk_value}\" は不正です - データが存在しません。" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "不正な型です。{data_type} 型ではなく主キーの値を入力してください。" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "ハイパーリンクが不正です - URLにマッチしません。" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "ハイパーリンクが不正です - 不正なURLにマッチします。" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "ハイパーリンクが不正です - リンク先が存在しません。" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "不正なデータ型です。{data_type} 型ではなくURL文字列を入力してください。" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} のデータが存在しません。" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "不正な値です。" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "不正なデータです。{datatype} 型ではなく辞書を入力してください。" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "フィルタ" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "フィールドフィルタ" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "順序" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "検索" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "なし" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "選択する項目がありません。" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "この項目は一意でなければなりません。" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "項目 {field_names} は一意な組でなければなりません。" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "この項目は \"{date_field}\" の日に対して一意でなければなりません。" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "この項目は \"{date_field}\" の月に対して一意でなければなりません。" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "この項目は \"{date_field}\" の年に対して一意でなければなりません。" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "\"Accept\" 内のバージョンが不正です。" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "URLパス内のバージョンが不正です。" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "不正なバージョンのURLのパスです。どのバージョンの名前空間にも一致しません。" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "ホスト名内のバージョンが不正です。" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "クエリパラメータ内のバージョンが不正です。" - -#: views.py:88 -msgid "Permission denied." -msgstr "権限がありません。" diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo b/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo index 570ff6f53..c3aeb27a9 100644 Binary files a/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo and b/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po index 43dbe0cdd..722dc2c82 100644 --- a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po +++ b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po @@ -4,15 +4,16 @@ # # Translators: # GarakdongBigBoy , 2017 +# Hochul Kwak , 2018 # Joon Hwan 김준환 , 2017 # SUN CHOI , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-09-28 09:41+0000\n" -"Last-Translator: GarakdongBigBoy \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Korean (Korea) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ko_KR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,423 +21,556 @@ msgstr "" "Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials)가 제공되지 않았습니다." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials) 문자열은 빈칸(spaces)을 포함하지 않아야 합니다." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials)가 base64로 적절히 부호화(encode)되지 않았습니다." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "아이디/비밀번호가 유효하지 않습니다." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "계정이 중지되었거나 삭제되었습니다." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "토큰 헤더가 유효하지 않습니다. 인증데이터(credentials)가 제공되지 않았습니다." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 빈칸(spaces)을 포함하지 않아야 합니다." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 유효하지 않은 문자를 포함하지 않아야 합니다." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "토큰이 유효하지 않습니다." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "인증 토큰" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "키" + +#: authtoken/models.py:16 +msgid "User" +msgstr "유저" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "생성됨" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "토큰" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "" -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" - #: authtoken/serializers.py:9 +msgid "Username" +msgstr "유저이름" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "비밀번호" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "사용자 계정을 사용할 수 없습니다." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "제공된 인증데이터(credentials)로는 로그인할 수 없습니다." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "\"아이디\"와 \"비밀번호\"를 포함해야 합니다." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "서버 장애가 발생했습니다." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "잘못된 요청입니다." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "자격 인증데이터(authentication credentials)가 정확하지 않습니다." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "자격 인증데이터(authentication credentials)가 제공되지 않았습니다." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "이 작업을 수행할 권한(permission)이 없습니다." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "찾을 수 없습니다." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "메소드(Method) \"{method}\"는 허용되지 않습니다." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Accept header 요청을 만족할 수 없습니다." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "요청된 \"{media_type}\"가 지원되지 않는 미디어 형태입니다." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "요청이 지연(throttled)되었습니다." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "이 필드는 필수 항목입니다." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "이 필드는 null일 수 없습니다." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\"이 유효하지 않은 부울(boolean)입니다." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "이 필드는 blank일 수 없습니다." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "이 필드의 글자 수가 {max_length} 이하인지 확인하십시오." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "이 필드의 글자 수가 적어도 {min_length} 이상인지 확인하십시오." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "유효한 이메일 주소를 입력하십시오." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "형식에 맞지 않는 값입니다." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "문자, 숫자, 밑줄( _ ) 또는 하이픈( - )으로 이루어진 유효한 \"slug\"를 입력하십시오." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "유효한 URL을 입력하십시오." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\"가 유효하지 않은 UUID 입니다." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "유효한 IPv4 또는 IPv6 주소를 입력하십시오." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "유효한 정수(integer)를 넣어주세요." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "이 값이 {max_value}보다 작거나 같은지 확인하십시오." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "이 값이 {min_value}보다 크거나 같은지 확인하십시오." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "문자열 값이 너무 큽니다." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "유효한 숫자를 넣어주세요." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "전체 숫자(digits)가 {max_digits} 이하인지 확인하십시오." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "소수점 자릿수가 {max_decimal_places} 이하인지 확인하십시오." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "소수점 자리 앞에 숫자(digits)가 {max_whole_digits} 이하인지 확인하십시오." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "예상된 datatime 대신 date를 받았습니다." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Date의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "예상된 date 대신 datetime을 받았습니다." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duration의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\"이 유효하지 않은 선택(choice)입니다." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "아이템 리스트가 예상되었으나 \"{input_type}\"를 받았습니다." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "이 선택 항목은 비워 둘 수 없습니다." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\"이 유효하지 않은 경로 선택입니다." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "파일이 제출되지 않았습니다." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "제출된 데이터는 파일이 아닙니다. 제출된 서식의 인코딩 형식을 확인하세요." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "파일명을 알 수 없습니다." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "제출한 파일이 비어있습니다." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "이 파일명의 글자수가 최대 {max_length}를 넘지 않는지 확인하십시오. (이것은 {length}가 있습니다)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "유효한 이미지 파일을 업로드 하십시오. 업로드 하신 파일은 이미지 파일이 아니거나 손상된 이미지 파일입니다." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "이 리스트는 비워 둘 수 없습니다." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "아이템 딕셔너리가 예상되었으나 \"{input_type}\" 타입을 받았습니다." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Value 는 유효한 JSON형식이어야 합니다." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "검색" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:336 +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "순서" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "오름차순" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "내림차순" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "페이지가 유효하지 않습니다." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "커서(cursor)가 유효하지 않습니다." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "유효하지 않은 pk \"{pk_value}\" - 객체가 존재하지 않습니다." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "잘못된 형식입니다. pk 값 대신 {data_type}를 받았습니다." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "유효하지 않은 하이퍼링크 - 일치하는 URL이 없습니다." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "유효하지 않은 하이퍼링크 - URL이 일치하지 않습니다." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "유효하지 않은 하이퍼링크 - 객체가 존재하지 않습니다." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "잘못된 형식입니다. URL 문자열을 예상했으나 {data_type}을 받았습니다." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} 객체가 존재하지 않습니다." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "값이 유효하지 않습니다." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "유효하지 않은 데이터. 딕셔너리(dictionary)대신 {datatype}를 받았습니다." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "필터" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "검색" +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "선택할 아이템이 없습니다." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "이 필드는 반드시 고유(unique)해야 합니다." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "필드 {field_names} 는 반드시 고유(unique)해야 합니다." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "이 필드는 고유(unique)한 \"{date_field}\" 날짜를 갖습니다." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "이 필드는 고유(unique)한 \"{date_field}\" 월을 갖습니다. " -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "이 필드는 고유(unique)한 \"{date_field}\" 년을 갖습니다. " -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "\"Accept\" 헤더(header)의 버전이 유효하지 않습니다." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "URL path의 버전이 유효하지 않습니다." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "URL 경로에 유효하지 않은 버전이 있습니다. 버전 네임 스페이스와 일치하지 않습니다." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "hostname내 버전이 유효하지 않습니다." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "쿼리 파라메터내 버전이 유효하지 않습니다." - -#: views.py:88 -msgid "Permission denied." -msgstr "사용 권한이 거부되었습니다." diff --git a/rest_framework/locale/lt/LC_MESSAGES/django.mo b/rest_framework/locale/lt/LC_MESSAGES/django.mo new file mode 100644 index 000000000..b43a6a8a4 Binary files /dev/null and b/rest_framework/locale/lt/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/lt/LC_MESSAGES/django.po b/rest_framework/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 000000000..1578e47b3 --- /dev/null +++ b/rest_framework/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,573 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# vytautas , 2019 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Lithuanian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "Vartotojas neaktyvus arba pašalintas." + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:203 +msgid "Invalid token." +msgstr "" + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "Raktas" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Vartotojas" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "Sukurta" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "Vartotojo vardas" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "Slaptažodis" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "Įvyko serverio klaida." + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "Netinkamai suformuota užklausa." + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "Neteisingi autentifikacijos duomenys." + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "Autentifikacijos duomenys nesuteikti." + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:185 +msgid "Not found." +msgstr "Nerasta." + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "Metodas \"{method}\" yra neleidžiamas." + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "Nepavyko patenkinti užklausos Accept antraštės." + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "Nepalaikomas duomenų formatas \"{media_type}\" užklausoje." + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "Užklausa pristabdyta." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "Šis laukas yra privalomas." + +#: fields.py:317 +msgid "This field may not be null." +msgstr "Šis laukas negali būti nustatytas kaip null." + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "Šis laukas negali būti tuščias." + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "Patikrinkite, ar šis laukas turi ne daugiau nei {max_length} simbolių." + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "Patikrinkite, ar šis laukas turi ne mažiau nei {min_length} simbolių." + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "Įveskite tinkamą el. pašto adresą." + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "Ši vertė neatitinka nustatyto šablono." + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "Įveskite tinkamą \"slug\" tekstą, turintį tik raidžių, skaičių, pabraukimų arba brūkšnelių." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "Įveskite tinkamą URL adresą." + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Įveskite tinkamą IPv4 arba IPv6 adresą." + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "Reikiama tinkama integer tipo reikšmė." + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "Patikrinkite, ar ši reikšmė yra mažesnė arba lygi {max_value}." + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "Patikrinkite, ar ši reikšmė yra didesnė arba lygi {min_value}." + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "String tipo reikšmė per ilga." + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "Reikiamas tinkamas skaičius." + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "Patikrinkite, ar nėra daugiau nei {max_digits} skaitmenų." + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "Patikrinkite, ar nėra daugiau nei {max_decimal_places} skaitmenų po kablelio." + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "Patikrinkite, ar nėra daugiau nei {max_whole_digits} skaitmenų priešais kablelį." + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "Datetime tipo reikšmė yra netinkamo formato. Naudokite vieną iš šių formatų: {format}." + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "Tikėtasi datetime, gauta date tipo reikšmė." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Date tipo reikšmė yra netinkamo formato. Naudokite vieną iš šių formatų: {format}." + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "Tikėtasi date, gauta datetime tipo reikšmė." + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "Time tipo reikšmė yra netinkamo formato. Naudokite vieną iš šių formatų: {format}." + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "Duration tipo reikšmė yra netinkamo formato. Naudokite vieną iš šių formatų: {format}." + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" nėra tinkamas pasirinkimas." + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "Šis pasirinkimas negali būti tuščias." + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "" + +#: filters.py:288 +msgid "descending" +msgstr "" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "Netinkamas puslapis." + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:449 +msgid "Invalid value." +msgstr "" + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "" + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "" + +#: validators.py:39 +msgid "This field must be unique." +msgstr "" + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "" + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "" diff --git a/rest_framework/locale/lv/LC_MESSAGES/django.mo b/rest_framework/locale/lv/LC_MESSAGES/django.mo index b4accc34e..7ee717240 100644 Binary files a/rest_framework/locale/lv/LC_MESSAGES/django.mo and b/rest_framework/locale/lv/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/lv/LC_MESSAGES/django.po b/rest_framework/locale/lv/LC_MESSAGES/django.po index 2bc978866..876f6f367 100644 --- a/rest_framework/locale/lv/LC_MESSAGES/django.po +++ b/rest_framework/locale/lv/LC_MESSAGES/django.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-05 12:13+0000\n" -"Last-Translator: peterisb \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Latvian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,40 +18,40 @@ msgstr "" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Nederīgs pieprasījuma sākums. Akreditācijas parametri nav nodrošināti." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Nederīgs pieprasījuma sākums. Akreditācijas parametriem jābūt bez atstarpēm." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Nederīgs pieprasījuma sākums. Akreditācijas parametri nav korekti base64 kodēti." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nederīgs lietotājvārds/parole." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Lietotājs neaktīvs vai dzēsts." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Nederīgs pilnvaras sākums. Akreditācijas parametri nav nodrošināti." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Nederīgs pilnvaras sākums. Pilnvaras parametros nevar būt tukšumi." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Nederīgs pilnvaras sākums. Pilnvaras parametros nevar būt nederīgas zīmes." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Nederīga pilnavara." @@ -59,382 +59,515 @@ msgstr "Nederīga pilnavara." msgid "Auth Token" msgstr "Autorizācijas pilnvara" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Atslēga" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Lietotājs" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Izveidots" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Pilnvara" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Pilnvaras" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Lietotājvārds" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Parole" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Lietotāja konts ir atslēgts." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Neiespējami pieteikties sistēmā ar nodrošinātajiem akreditācijas datiem." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Jābūt iekļautam \"username\" un \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Notikusi servera kļūda." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Nenoformēts pieprasījums." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Nekorekti autentifikācijas parametri." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Netika nodrošināti autorizācijas parametri." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Tev nav tiesību veikt šo darbību." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nav atrasts." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metode \"{method}\" nav atļauta." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Nevarēja apmierināt pieprasījuma Accept header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Pieprasījumā neatbalstīts datu tips \"{media_type}\" ." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Pieprasījums tika apturēts." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Šis lauks ir obligāts." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Šis lauks nevar būt null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" ir nederīga loģiskā vērtība." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Šis lauks nevar būt tukšs." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Pārliecinies, ka laukā nav vairāk par {max_length} zīmēm." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Pārliecinies, ka laukā ir vismaz {min_length} zīmes." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Ievadi derīgu e-pasta adresi." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Šī vērtība neatbilst prasītajam pierakstam." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Ievadi derīgu \"slug\" vērtību, kura sastāv no burtiem, skaitļiem, apakš-svītras vai defises." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Ievadi derīgu URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" ir nedrīgs UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Ievadi derīgu IPv4 vai IPv6 adresi." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Prasīta ir derīga skaitliska vērtība." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Pārliecinies, ka šī vērtība ir mazāka vai vienāda ar {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Pārliecinies, ka šī vērtība ir lielāka vai vienāda ar {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Teksta vērtība pārāk liela." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Derīgs skaitlis ir prasīts." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Pārliecinies, ka nav vairāk par {max_digits} zīmēm kopā." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Pārliecinies, ka nav vairāk par {max_decimal_places} decimālajām zīmēm." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Pārliecinies, ka nav vairāk par {max_whole_digits} zīmēm pirms komata." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datuma un laika formāts ir nepareizs. Lieto vienu no norādītajiem formātiem: \"{format}.\"" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Tika gaidīts datums un laiks, saņemts datums.." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Datumam ir nepareizs formāts. Lieto vienu no norādītajiem formātiem: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Tika gaidīts datums, saņemts datums un laiks." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Laikam ir nepareizs formāts. Lieto vienu no norādītajiem formātiem: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Ilgumam ir nepreizs formāts. Lieto vienu no norādītajiem formātiem: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ir nederīga izvēle." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Vairāk par {count} ierakstiem..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Tika gaidīts saraksts ar ierakstiem, bet tika saņemts \"{input_type}\" tips." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Šī daļa nevar būt tukša." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" ir nederīga ceļa izvēle." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Neviens fails netika pievienots." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Pievienotie dati nebija fails. Pārbaudi kodējuma tipu formā." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Faila nosaukums nevar tikt noteikts." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Pievienotais fails ir tukšs." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Pārliecinies, ka faila nosaukumā ir vismaz {max_length} zīmes (tajā ir {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Augšupielādē derīgu attēlu. Pievienotā datne nebija attēls vai bojāts attēls." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Šis saraksts nevar būt tukšs." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Tika gaidīta vārdnīca ar ierakstiem, bet tika saņemts \"{input_type}\" tips." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Vērtībai ir jābūt derīgam JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Iesniegt" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Meklēt" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Kārtošana" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "augoši" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "dilstoši" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Nederīga lapa." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Nederīgs kursors" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Nederīga pk \"{pk_value}\" - objekts neeksistē." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Nepareizs tips. Tika gaidīta pk vērtība, saņemts {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Nederīga hipersaite - Nav URL sakritība." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Nederīga hipersaite - Nederīga URL sakritība." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Nederīga hipersaite - Objekts neeksistē." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Nepareizs tips. Tika gaidīts URL teksts, saņemts {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekts ar {slug_name}={value} neeksistē." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Nedrīga vērtība." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Nederīgi dati. Tika gaidīta vārdnīca, saņemts {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtri" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Lauka filtri" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Kārtošana" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Meklēt" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Nekas" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Nav ierakstu, ko izvēlēties." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Šim laukam ir jābūt unikālam." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Laukiem {field_names} jāveido unikālas kombinācijas." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Šim laukam ir jābūt unikālam priekš \"{date_field}\" datuma." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Šim laukam ir jābūt unikālam priekš \"{date_field}\" mēneša." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Šim laukam ir jābūt unikālam priekš \"{date_field}\" gada." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Nederīga versija \"Accept\" galvenē." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Nederīga versija URL ceļā." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Nederīga versija URL ceļā. Nav atbilstības esošo versiju telpā." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Nederīga versija servera nosaukumā." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Nederīga versija pieprasījuma parametros." - -#: views.py:88 -msgid "Permission denied." -msgstr "Pieeja liegta." diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.mo b/rest_framework/locale/mk/LC_MESSAGES/django.mo index 752263456..4c13e5a3d 100644 Binary files a/rest_framework/locale/mk/LC_MESSAGES/django.mo and b/rest_framework/locale/mk/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.po b/rest_framework/locale/mk/LC_MESSAGES/django.po index 0e59663d0..03f313523 100644 --- a/rest_framework/locale/mk/LC_MESSAGES/django.po +++ b/rest_framework/locale/mk/LC_MESSAGES/django.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Filip Dimitrovski \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Macedonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,40 +18,40 @@ msgstr "" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Невалиден основен header. Не се внесени податоци за автентикација." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Невалиден основен header. Автентикационата низа не треба да содржи празни места." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Невалиден основен header. Податоците за автентикација не се енкодирани со base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Невалидно корисничко име/лозинка." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Корисникот е деактивиран или избришан." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Невалиден токен header. Не се внесени податоци за најава." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Невалиден токен во header. Токенот не треба да содржи празни места." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Невалиден токен." @@ -59,382 +59,515 @@ msgstr "Невалиден токен." msgid "Auth Token" msgstr "Автентикациски токен" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Корисник" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Токен" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Токени" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Корисничко име" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Лозинка" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Сметката на корисникот е деактивирана." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Не може да се најавите со податоците за најава." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Мора да се внесе „username“ и „password“." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Настана серверска грешка." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Неправилен request." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Неточни податоци за најава." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Не се внесени податоци за најава." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Немате дозвола да го сторите ова." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Не е пронајдено ништо." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Методата \"{method}\" не е дозволена." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Не може да се исполни барањето на Accept header-от." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Media типот „{media_type}“ не е поддржан." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Request-от е забранет заради ограничувања." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Ова поле е задолжително." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Ова поле не смее да биде недефинирано." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" не е валиден boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Ова поле не смее да биде празно." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Ова поле не смее да има повеќе од {max_length} знаци." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Ова поле мора да има барем {min_length} знаци." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Внесете валидна email адреса." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Ова поле не е по правилната шема/барање." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Внесете валидно име што содржи букви, бројки, долни црти или црти." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Внесете валиден URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" не е валиден UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Внеси валидна IPv4 или IPv6 адреса." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Задолжителен е валиден цел број." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Вредноста треба да биде помала или еднаква на {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Вредноста треба да биде поголема или еднаква на {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Вредноста е преголема." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Задолжителен е валиден број." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Не смее да има повеќе од {max_digits} цифри вкупно." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Не смее да има повеќе од {max_decimal_places} децимални места." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Не смее да има повеќе од {max_whole_digits} цифри пред децималната точка." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Датата и времето се со погрешен формат. Користете го овој формат: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Очекувано беше дата и време, а внесено беше само дата." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Датата е со погрешен формат. Користете го овој формат: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Очекувана беше дата, а внесени беа и дата и време." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Времето е со погрешен формат. Користете го овој формат: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "„{input}“ не е валиден избор." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Повеќе од {count} ставки..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Очекувана беше листа од ставки, а внесено беше „{input_type}“." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Ниеден фајл не е качен (upload-иран)." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Испратените податоци не се фајл. Проверете го encoding-от на формата." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Не може да се открие име на фајлот." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Качениот (upload-иран) фајл е празен." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Името на фајлот треба да има највеќе {max_length} знаци (а има {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Качете (upload-ирајте) валидна слика. Фајлот што го качивте не е валидна слика или е расипан." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Оваа листа не смее да биде празна." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Очекуван беше dictionary од ставки, a внесен беше тип \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Вредноста мора да биде валиден JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Испрати" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Пребарај" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Подредување" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "растечки" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "опаѓачки" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Невалидна вредност за страна." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Невалиден покажувач (cursor)" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Невалиден pk „{pk_value}“ - објектот не постои." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Неточен тип. Очекувано беше pk, а внесено {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Невалиден хиперлинк - не е внесен URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Невалиден хиперлинк - внесен е неправилен URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Невалиден хиперлинк - Објектот не постои." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Неточен тип. Очекувано беше URL, a внесено {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Објектот со {slug_name}={value} не постои." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Невалидна вредност." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Невалидни податоци. Очекуван беше dictionary, а внесен {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Филтри" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Филтри на полиња" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Подредување" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Пребарај" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ништо" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Нема ставки за избирање." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Ова поле мора да биде уникатно." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Полињата {field_names} заедно мора да формираат уникатен збир." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Ова поле мора да биде уникатно за „{date_field}“ датата." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Ова поле мора да биде уникатно за „{date_field}“ месецот." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Ова поле мора да биде уникатно за „{date_field}“ годината." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Невалидна верзија во „Accept“ header-от." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Невалидна верзија во URL патеката." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Верзијата во URL патеката не е валидна. Не се согласува со ниеден version namespace (именски простор за верзии)." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Невалидна верзија во hostname-от." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Невалидна верзија во query параметарот." - -#: views.py:88 -msgid "Permission denied." -msgstr "Барањето не е дозволено." diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.mo b/rest_framework/locale/nb/LC_MESSAGES/django.mo index fc57ebb9f..bd983b292 100644 Binary files a/rest_framework/locale/nb/LC_MESSAGES/django.mo and b/rest_framework/locale/nb/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.po b/rest_framework/locale/nb/LC_MESSAGES/django.po index f572f90be..9dbaf45de 100644 --- a/rest_framework/locale/nb/LC_MESSAGES/django.po +++ b/rest_framework/locale/nb/LC_MESSAGES/django.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-11-28 15:25+0000\n" -"Last-Translator: Håken Lid \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,40 +20,40 @@ msgstr "" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Ugyldig basic header. Ingen legitimasjon gitt." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Ugyldig basic header. Legitimasjonsstreng bør ikke inneholde mellomrom." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Ugyldig basic header. Legitimasjonen ikke riktig Base64 kodet." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Ugyldig brukernavn eller passord." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Bruker inaktiv eller slettet." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Ugyldig token header. Ingen legitimasjon gitt." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ugyldig token header. Token streng skal ikke inneholde mellomrom." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Ugyldig token header. Tokenstrengen skal ikke inneholde ugyldige tegn." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Ugyldig token." @@ -61,382 +61,515 @@ msgstr "Ugyldig token." msgid "Auth Token" msgstr "Auth Token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Nøkkel" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Bruker" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Opprettet" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokener" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Brukernavn" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Passord" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Brukerkonto er deaktivert." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Kan ikke logge inn med gitt legitimasjon." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Må inneholde \"username\" og \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "En serverfeil skjedde." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Misformet forespørsel." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Ugyldig autentiseringsinformasjon." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Manglende autentiseringsinformasjon." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Du har ikke tilgang til å utføre denne handlingen." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Ikke funnet." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoden \"{method}\" ikke gyldig." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Kunne ikke tilfredsstille request Accept header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Ugyldig media type \"{media_type}\" i request." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Forespørselen ble strupet." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Dette feltet er påkrevd." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Dette feltet må ikke være tomt." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" er ikke en gyldig bolsk verdi." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Dette feltet må ikke være blankt." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Forsikre deg om at dette feltet ikke har mer enn {max_length} tegn." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Forsikre deg at dette feltet har minst {min_length} tegn." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Oppgi en gyldig epost-adresse." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Denne verdien samsvarer ikke med de påkrevde mønsteret." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Skriv inn en gyldig \"slug\" som består av bokstaver, tall, understrek eller bindestrek." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Skriv inn en gyldig URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" er ikke en gyldig UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Skriv inn en gyldig IPv4 eller IPv6-adresse." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "En gyldig heltall er nødvendig." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Sikre denne verdien er mindre enn eller lik {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Sikre denne verdien er større enn eller lik {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Strengverdien for stor." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Et gyldig nummer er nødvendig." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Pass på at det ikke er flere enn {max_digits} siffer totalt." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Pass på at det ikke er flere enn {max_decimal_places} desimaler." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Pass på at det ikke er flere enn {max_whole_digits} siffer før komma." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Forventet en datetime, men fikk en date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Dato har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Forventet en date, men fikk en datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Tid har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Varighet har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" er ikke et gyldig valg." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Mer enn {count} elementer ..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Forventet en liste over elementer, men fikk type \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Dette valget kan ikke være tomt." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" er ikke en gyldig bane valg." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Ingen fil ble sendt." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "De innsendte data var ikke en fil. Kontroller kodingstypen på skjemaet." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Kunne ikke finne filnavn." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Den innsendte filen er tom." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Sikre dette filnavnet har på det meste {max_length} tegn (det har {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Last opp et gyldig bilde. Filen du lastet opp var enten ikke et bilde eller en ødelagt bilde." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Denne listen kan ikke være tom." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Forventet en dictionary av flere ting, men fikk typen \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Verdien må være gyldig JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Send inn" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Søk" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sortering" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "stigende" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "synkende" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Ugyldig side" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Ugyldig markør" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ugyldig pk \"{pk_value}\" - objektet eksisterer ikke." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Feil type. Forventet pk verdi, fikk {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Ugyldig hyperkobling - No URL match." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ugyldig hyperkobling - Incorrect URL match." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ugyldig hyperkobling - Objektet eksisterer ikke." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Feil type. Forventet URL streng, fikk {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt med {slug_name}={value} finnes ikke." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Ugyldig verdi." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Ugyldige data. Forventet en dictionary, men fikk {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtre" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Feltfiltre" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sortering" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Søk" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ingen" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Ingenting å velge." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Dette feltet må være unikt." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Feltene {field_names} må gjøre et unikt sett." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Dette feltet må være unikt for \"{date_field}\" dato." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Dette feltet må være unikt for \"{date_field}\" måned." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Dette feltet må være unikt for \"{date_field}\" år." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Ugyldig versjon på \"Accept\" header." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Ugyldig versjon i URL-banen." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Ugyldig versjon i URL. Passer ikke med noen eksisterende versjon." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Ugyldig versjon i vertsnavn." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Ugyldig versjon i søkeparameter." - -#: views.py:88 -msgid "Permission denied." -msgstr "Tillatelse avslått." diff --git a/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo b/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo new file mode 100644 index 000000000..a9071d09e Binary files /dev/null and b/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ne_NP/LC_MESSAGES/django.po b/rest_framework/locale/ne_NP/LC_MESSAGES/django.po new file mode 100644 index 000000000..74b56e47e --- /dev/null +++ b/rest_framework/locale/ne_NP/LC_MESSAGES/django.po @@ -0,0 +1,574 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Shrawan Poudel , 2018 +# Xavier Ordoquy , 2020 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:59+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Nepali (Nepal) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ne_NP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "अमान्य हेडरहरू, क्रेडेन्सियलहरू प्रदान गरिएको छैन |" + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "अमान्य हेडरहरू, क्रेडेन्सियलहरूमा स्पेस हुनु हुँदैन |" + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "अमान्य हेडरहरू, क्रेडेन्सियलहरूमा सही तरिकाले base64 एन्कोड गरिएको छैन |" + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "अमान्य प्रयोगकर्तानाम/पासवर्ड |" + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "प्रयोगकर्ता निष्क्रिय वा मेटायिएको छ |" + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "अमान्य टोकन हेडर । कुनै क्रेडेन्सियल प्रदान गरिएको छैन ।" + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "अमान्य टोकन हेडर | टोकनमा स्पेस हुनु हुँदैन |" + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "अमान्य टोकन हेडर | टोकनमा अवैध अक्षरहरू हुनु हुँदैन |" + +#: authentication.py:203 +msgid "Invalid token." +msgstr "अमान्य टोकन |" + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "प्रयोगकर्ता प्रमाणिकरण टोकन " + +#: authtoken/models.py:13 +msgid "Key" +msgstr "मूल" + +#: authtoken/models.py:16 +msgid "User" +msgstr "प्रयोगकर्ता" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "सिर्जना गरियो" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "टोकन" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "टोकेनहरु" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "प्रयोगकर्ताको नाम" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "पासवर्ड" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "प्रदान गरिएको क्रेडेन्सियलसँग लग इन गर्न सकिएन |" + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "\"प्रयोगकर्ताको नाम\" र \"पासवर्ड\" सामेल हुनु पर्छ |" + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "सर्भर त्रुटि देखापर्यो |" + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "विकृत अनुरोध |" + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "गलत प्रमाणीकरण क्रेडेन्सियलहरू |" + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "प्रमाणीकरण क्रेडेन्सियलहरू पयिएन | " + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "तपाइँसँग यो कार्य गर्न अनुमति छैन |" + +#: exceptions.py:185 +msgid "Not found." +msgstr "फेला परेन |" + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "\"{method}\" गर्ने अनुमती छैन |" + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "Accept Header अनुरोधलाई सन्तुष्ट गर्ने सकिएन |" + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "असमर्थित मिडिया टाईप \"{media_type}\" अनुरोधको | " + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "अनुरोध प्रतिबन्दित गरियो |" + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "यो फिल्ड आवश्यक छ |" + +#: fields.py:317 +msgid "This field may not be null." +msgstr "यो फिल्ड खाली हुनु हुँदैन |" + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "यो फिल्ड खाली हुन सक्दैन |" + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "यो फिल्डसँग {max_length} अक्षरहरू भन्दा बढी छ छैन सुनिश्चित गर्नुहोस् |" + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "यो फिल्डमा कम से कम {min_length} अक्षरहरू छ छैन सुनिश्चित गर्नुहोस् |" + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "मान्य इमेल ठेगाना प्रविष्ट गर्नुहोस् |" + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "यो परिमाण आवश्यक ढाँचा मेल खाँदैन ।" + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "अक्षरहरू, अङ्कहरू, अन्डरसेर्सहरू वा हाइफनहरू समावेश भएका एक मान्य \"slug\" प्रविष्टि गर्नुहोस् ।" + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "मान्य यूआरएल प्रविष्ट गर्नुहोस् ।" + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "मान्य IPv4 वा IPv6 ठेगाना प्रविष्टि गर्नुहोस् ।" + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "एक मान्य पूर्णांक आवश्यक छ ।" + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "यो परिमाण {max_value} को भन्दा कम वा बराबर छ सुनिश्चित गर्नुहोस् ।" + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "यो परिमाण {min_value} भन्दा बढी वा बराबर छ सुनिश्चित गर्नुहोस् ।" + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "स्ट्रिङ परिमाण धेरै ठूलो छ ।" + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "एउटा मान्य अङ्कहरू आवश्यक छ ।" + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "सुनिश्चित गर्नुहोस् कि {max_digits} अङ्कहरू भन्दा अधिक नहोस् ।" + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "सुनिश्चित गर्नुहोस् कि {max_decimal_places} दशमलव स्थानहरू भन्दा अधिक नहोस् ।" + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "सुनिश्चित गर्नुहोस् कि दशमलव बिन्दुभन्दा पहिले {max_whole_digits} अङ्कहरू भन्दा अधिक नहोस् ।" + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "डेटटाइममा गलत ढाँचा छ । यसको सट्टामा यी मध्ये एक ढाँचा प्रयोग गर्नुहोस्: {format} ।" + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "डेटटाइम अपेक्षित भए तर मिति प्राप्त भयो ।" + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "डेटमा गलत ढाँचा छ । यसको सट्टामा यी मध्ये एक ढाँचा प्रयोग गर्नुहोस्: {format} ।" + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "डेट अपेक्षित भए तर डेटाटाइम प्राप्त भयो ।" + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "समयमा गलत ढाँचा छ । यसको सट्टामा यी मध्ये एक ढाँचा प्रयोग गर्नुहोस्: {format} ।" + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "अवधिमा गलत ढाँचा छ । यसको सट्टामा यी मध्ये एक ढाँचा प्रयोग गर्नुहोस्: {format} ।" + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" मान्य छनौट छैन ।" + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "{count} वस्तुहरू भन्दा बढी ..." + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "वस्तुहरूको सूची अपेक्षित तर \"{input_type}\" टाइप प्राप्त भयो ।" + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "यो चयन रिक्त हुन सक्दैन ।" + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\" मान्य मार्गको विकल्प होइन ।" + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "कुनै फाइल पेश गरिएको छैन ।" + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "पेश गरिएको डेटा फाईल थिएन । एन्कोडिङ प्रकार फारममा जाँच्नुहोस् ।" + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "कुनै फाइल नाम निर्धारण गर्न सकिएन ।" + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "पेश गरिएको फाइल खाली छ ।" + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "यो फाइल नाममा अधिक {max_length} अक्षरहरू छ छैन (यसमा {length} छ) सुनिश्चित गर्नुहोस् ।" + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "मान्य चित्र अपलोड गर्नुहोस् । तपाईंले अपलोड गर्नुभएको फाइल होइन वा चित्र वा भ्रष्ट चित्र हो ।" + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "यो सूची खाली हुन सक्दैन ।" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "वस्तुहरूको शब्दकोशको अपेक्षित तर \"{input_type}\" टाइप प्राप्त भयो ।" + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "परिमाण मान्य JSON हुनु पर्छ ।" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "खोजी गर्नुहोस्" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "क्रम" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "आरोहण" + +#: filters.py:288 +msgid "descending" +msgstr "अवरोहण" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "अमान्य पृष्ठ ।" + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "अमान्य कर्सर" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "अमान्य pk \"{pk_value}\" - वस्तुको अस्तित्व छैन ।" + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "गलत प्रकार। अपेक्षित pk परिमाण, {data_type} प्राप्त भयो ।" + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "अमान्य हाइपरलिंक - कुनै यूआरएलको मेल छैन ।" + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "अमान्य हाइपरलिंक - गलत यूआरएलको मेल छ ।" + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "अमान्य हाइपरलिंक - वस्तुको अस्तित्व छैन ।" + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "गलत प्रकार। अपेक्षित यूआरएल स्ट्रिङ, {data_type} प्राप्त भयो ।" + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "वस्तु {slug_name} = {value} सँग अस्तित्व छैन ।" + +#: relations.py:449 +msgid "Invalid value." +msgstr "अमान्य परिमाण ।" + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "अमान्य डेटा । एक शब्दकोश अपेक्षित, तर {datatype} प्राप्त भयो ।" + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "फिल्टरहरू" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "कुनै पनि होइन" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "चयन गर्न वस्तुहरू छैनन् ।" + +#: validators.py:39 +msgid "This field must be unique." +msgstr "यो फिल्ड अद्वितीय हुनुपर्छ ।" + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "फिल्ड {field_names} ले एक अद्वितीय सेट गर्नु पर्छ ।" + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "यो फिल्ड \"{date_field}\" मितिको लागि अद्वितीय हुनुपर्छ ।" + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "यो फिल्ड \"{date_field}\" महिनाको लागि अद्वितीय हुनुपर्छ ।" + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "यो फिल्ड \"{date_field}\" वर्षको लागि अद्वितीय हुनुपर्छ ।" + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "\"Accept\" हेडरमा अमान्य संस्करण ।" + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "यूआरएल मार्गमा अमान्य संस्करण ।" + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "यूआरएल मार्गमा अमान्य संस्करण । कुनै पनि संस्करणको नामसँग मेल खाँदैन ।" + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "होस्ट नाममा अमान्य संस्करण ।" + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr " क्वेरी परिमितिमा अमान्य संस्करण ।" diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.mo b/rest_framework/locale/nl/LC_MESSAGES/django.mo index ed74bffa0..4691ca63f 100644 Binary files a/rest_framework/locale/nl/LC_MESSAGES/django.mo and b/rest_framework/locale/nl/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.po b/rest_framework/locale/nl/LC_MESSAGES/django.po index 370f3aa41..5f7ff05b4 100644 --- a/rest_framework/locale/nl/LC_MESSAGES/django.po +++ b/rest_framework/locale/nl/LC_MESSAGES/django.po @@ -8,13 +8,14 @@ # Mike Dingjan , 2017 # Mike Dingjan , 2015 # Hans van Luttikhuizen , 2016 +# Tom Hendrikx , 2017 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Mike Dingjan \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Dutch (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,40 +23,40 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Ongeldige basic header. Geen logingegevens opgegeven." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Ongeldige basic header. logingegevens kunnen geen spaties bevatten." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Ongeldige basic header. logingegevens zijn niet correct base64-versleuteld." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Ongeldige gebruikersnaam/wachtwoord." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Gebruiker inactief of verwijderd." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Ongeldige token header. Geen logingegevens opgegeven" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ongeldige token header. Token kan geen spaties bevatten." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Ongeldige token header. Token kan geen ongeldige karakters bevatten." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Ongeldige token." @@ -63,382 +64,515 @@ msgstr "Ongeldige token." msgid "Auth Token" msgstr "Autorisatietoken" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Key" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Gebruiker" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Aangemaakt" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Gebruikersnaam" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Wachtwoord" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Gebruikersaccount is gedeactiveerd." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Kan niet inloggen met opgegeven gegevens." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Moet \"username\" en \"password\" bevatten." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Er is een serverfout opgetreden." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Ongeldig samengestelde request." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Ongeldige authenticatiegegevens." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Authenticatiegegevens zijn niet opgegeven." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Je hebt geen toestemming om deze actie uit te voeren." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Niet gevonden." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Methode \"{method}\" niet toegestaan." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Kan niet voldoen aan de opgegeven Accept header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Ongeldige media type \"{media_type}\" in aanvraag." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Aanvraag was verstikt." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Dit veld is vereist." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Dit veld mag niet leeg zijn." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" is een ongeldige booleanwaarde." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Dit veld mag niet leeg zijn." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Zorg ervoor dat dit veld niet meer dan {max_length} karakters bevat." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Zorg ervoor dat dit veld minimaal {min_length} karakters bevat." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Voer een geldig e-mailadres in." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." -msgstr "Deze waarde voldoet niet aan het vereisde formaat." +msgstr "Deze waarde voldoet niet aan het vereiste formaat." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Voer een geldige \"slug\" in, bestaande uit letters, cijfers, lage streepjes of streepjes." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Voer een geldige URL in." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" is een ongeldige UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Voer een geldig IPv4- of IPv6-adres in." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Een geldig getal is vereist." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Zorg ervoor dat deze waarde kleiner is dan of gelijk is aan {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Zorg ervoor dat deze waarde groter is dan of gelijk is aan {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Tekstwaarde is te lang." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Een geldig nummer is vereist." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Zorg ervoor dat er in totaal niet meer dan {max_digits} cijfers zijn." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Zorg ervoor dat er niet meer dan {max_decimal_places} cijfers achter de komma zijn." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Zorg ervoor dat er niet meer dan {max_whole_digits} cijfers voor de komma zijn." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime heeft een ongeldig formaat, gebruik 1 van de volgende formaten: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Verwachtte een datetime, maar kreeg een date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Date heeft het verkeerde formaat, gebruik 1 van deze formaten: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Verwachtte een date, maar kreeg een datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time heeft het verkeerde formaat, gebruik 1 van onderstaande formaten: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Tijdsduur heeft een verkeerd formaat, gebruik 1 van onderstaande formaten: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" is een ongeldige keuze." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Meer dan {count} items..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Verwachtte een lijst met items, maar kreeg type \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Deze selectie mag niet leeg zijn." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" is niet een geldig pad." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Er is geen bestand opgestuurd." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "De verstuurde data was geen bestand. Controleer de encoding type op het formulier." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Bestandsnaam kon niet vastgesteld worden." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Het verstuurde bestand is leeg." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Zorg ervoor dat deze bestandsnaam hoogstens {max_length} karakters heeft (het heeft er {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Upload een geldige afbeelding, de geüploade afbeelding is geen afbeelding of is beschadigd geraakt," -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Deze lijst mag niet leeg zijn." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Verwachtte een dictionary van items, maar kreeg type \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Waarde moet valide JSON zijn." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Verzenden" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Zoek" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sorteer op" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "oplopend" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "aflopend" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Ongeldige pagina." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Ongeldige cursor." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ongeldige pk \"{pk_value}\" - object bestaat niet." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Ongeldig type. Verwacht een pk-waarde, ontving {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Ongeldige hyperlink - Geen overeenkomende URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ongeldige hyperlink - Ongeldige URL" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ongeldige hyperlink - Object bestaat niet." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Ongeldig type. Verwacht een URL, ontving {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object met {slug_name}={value} bestaat niet." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Ongeldige waarde." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Ongeldige data. Verwacht een dictionary, kreeg een {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filters" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Veldfilters" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sorteer op" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Zoek" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Geen" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Geen items geselecteerd." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Dit veld moet uniek zijn." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "De velden {field_names} moeten een unieke set zijn." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" datum." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" maand." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" year." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Ongeldige versie in \"Accept\" header." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Ongeldige versie in URL-pad." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Ongeldige versie in het URL pad, komt niet overeen met een geldige versie namespace" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Ongeldige versie in hostnaam." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Ongeldige versie in query parameter." - -#: views.py:88 -msgid "Permission denied." -msgstr "Toestemming geweigerd." diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.mo b/rest_framework/locale/pl/LC_MESSAGES/django.mo index 436580b35..f265186ae 100644 Binary files a/rest_framework/locale/pl/LC_MESSAGES/django.mo and b/rest_framework/locale/pl/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.po b/rest_framework/locale/pl/LC_MESSAGES/django.po index 611426556..9e8d3eac3 100644 --- a/rest_framework/locale/pl/LC_MESSAGES/django.po +++ b/rest_framework/locale/pl/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Janusz Harkot , 2015 +# Janusz Harkot , 2015 # Piotr Jakimiak , 2015 # m_aciek , 2016 # m_aciek , 2015-2016 @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: m_aciek \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Polish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,40 +21,40 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Niepoprawny podstawowy nagłówek. Brak danych uwierzytelniających." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Niepoprawny podstawowy nagłówek. Ciąg znaków danych uwierzytelniających nie powinien zawierać spacji." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Niepoprawny podstawowy nagłówek. Niewłaściwe kodowanie base64 danych uwierzytelniających." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Niepoprawna nazwa użytkownika lub hasło." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Użytkownik nieaktywny lub usunięty." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Niepoprawny nagłówek tokena. Brak danych uwierzytelniających." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Niepoprawny nagłówek tokena. Token nie może zawierać odstępów." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Błędny nagłówek z tokenem. Token nie może zawierać błędnych znaków." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Niepoprawny token." @@ -62,382 +62,515 @@ msgstr "Niepoprawny token." msgid "Auth Token" msgstr "Token uwierzytelniający" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Klucz" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Użytkownik" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Stworzono" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokeny" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Nazwa użytkownika" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Hasło" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Konto użytkownika jest nieaktywne." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Podane dane uwierzytelniające nie pozwalają na zalogowanie." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Musi zawierać \"username\" i \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Wystąpił błąd serwera." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Zniekształcone żądanie." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Błędne dane uwierzytelniające." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Nie podano danych uwierzytelniających." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Nie masz uprawnień, by wykonać tę czynność." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nie znaleziono." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Niedozwolona metoda \"{method}\"." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Nie można zaspokoić nagłówka Accept żądania." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Brak wsparcia dla żądanego typu danych \"{media_type}\"." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Żądanie zostało zdławione." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "To pole jest wymagane." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Pole nie może mieć wartości null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" nie jest poprawną wartością logiczną." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "To pole nie może być puste." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Upewnij się, że to pole ma nie więcej niż {max_length} znaków." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Upewnij się, że pole ma co najmniej {min_length} znaków." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Podaj poprawny adres e-mail." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Ta wartość nie pasuje do wymaganego wzorca." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Wprowadź poprawną wartość pola typu \"slug\", składającą się ze znaków łacińskich, cyfr, podkreślenia lub myślnika." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Wprowadź poprawny adres URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" nie jest poprawnym UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Wprowadź poprawny adres IPv4 lub IPv6." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Wymagana poprawna liczba całkowita." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Upewnij się, że ta wartość jest mniejsza lub równa {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Upewnij się, że ta wartość jest większa lub równa {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Za długi ciąg znaków." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Wymagana poprawna liczba." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Upewnij się, że liczba ma nie więcej niż {max_digits} cyfr." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Upewnij się, że liczba ma nie więcej niż {max_decimal_places} cyfr dziesiętnych." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Upewnij się, że liczba ma nie więcej niż {max_whole_digits} cyfr całkowitych." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Wartość daty z czasem ma zły format. Użyj jednego z dostępnych formatów: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Oczekiwano datę z czasem, otrzymano tylko datę." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Data ma zły format. Użyj jednego z tych formatów: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Oczekiwano daty a otrzymano datę z czasem." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Błędny format czasu. Użyj jednego z dostępnych formatów: {format}" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Czas trwania ma zły format. Użyj w zamian jednego z tych formatów: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" nie jest poprawnym wyborem." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Więcej niż {count} elementów..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Oczekiwano listy elementów, a otrzymano dane typu \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Zaznaczenie nie może być puste." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" nie jest poprawną ścieżką." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Nie przesłano pliku." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Przesłane dane nie były plikiem. Sprawdź typ kodowania formatki." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Nie można określić nazwy pliku." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Przesłany plik jest pusty." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Upewnij się, że nazwa pliku ma długość co najwyżej {max_length} znaków (aktualnie ma {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Prześlij poprawny plik graficzny. Przesłany plik albo nie jest grafiką lub jest uszkodzony." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Lista nie może być pusta." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Oczekiwano słownika, ale otrzymano \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Wartość musi być poprawnym ciągiem znaków JSON" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Wyślij" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Szukaj" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Kolejność" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "rosnąco" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "malejąco" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Niepoprawna strona." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Niepoprawny wskaźnik" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Błędny klucz główny \"{pk_value}\" - obiekt nie istnieje." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Błędny typ danych. Oczekiwano wartość klucza głównego, otrzymano {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Błędny hyperlink - nie znaleziono pasującego adresu URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Błędny hyperlink - błędne dopasowanie adresu URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Błędny hyperlink - obiekt nie istnieje." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Błędny typ danych. Oczekiwano adresu URL, otrzymano {data_type}" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Obiekt z polem {slug_name}={value} nie istnieje" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Niepoprawna wartość." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Niepoprawne dane. Oczekiwano słownika, otrzymano {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtry" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Pola filtrów" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Kolejność" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Szukaj" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Nie wybrano wartości." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Wartość dla tego pola musi być unikalna." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Pola {field_names} muszą tworzyć unikalny zestaw." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "To pole musi mieć unikalną wartość dla jednej daty z pola \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "To pole musi mieć unikalną wartość dla konkretnego miesiąca z pola \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "To pole musi mieć unikalną wartość dla konkretnego roku z pola \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Błędna wersja w nagłówku \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Błędna wersja w ścieżce URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Niepoprawna wersja w ścieżce URL. Nie pasuje do przestrzeni nazw żadnej wersji." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Błędna wersja w nazwie hosta." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Błędna wersja w parametrach zapytania." - -#: views.py:88 -msgid "Permission denied." -msgstr "Brak uprawnień." diff --git a/rest_framework/locale/pt/LC_MESSAGES/django.mo b/rest_framework/locale/pt/LC_MESSAGES/django.mo index c88991bfa..653cce97e 100644 Binary files a/rest_framework/locale/pt/LC_MESSAGES/django.mo and b/rest_framework/locale/pt/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/pt/LC_MESSAGES/django.po b/rest_framework/locale/pt/LC_MESSAGES/django.po index 9f1de1938..4cdf2bc4f 100644 --- a/rest_framework/locale/pt/LC_MESSAGES/django.po +++ b/rest_framework/locale/pt/LC_MESSAGES/django.po @@ -3,13 +3,18 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Craig Blaszczyk , 2015 +# Ederson Mota Pereira , 2015 +# Filipe Rinaldi , 2015 +# Hugo Leonardo Chalhoub Mendonça , 2015 +# Jonatas Baldin , 2017 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Portuguese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,423 +22,556 @@ msgstr "" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." -msgstr "" +msgstr "Cabeçalho básico inválido. Credenciais não fornecidas." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "" +msgstr "Cabeçalho básico inválido. String de credenciais não deve incluir espaços." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "" +msgstr "Cabeçalho básico inválido. Credenciais codificadas em base64 incorretamente." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "Usuário ou senha inválido." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "Usuário inativo ou removido." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "" +msgstr "Cabeçalho de token inválido. Credenciais não fornecidas." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "" +msgstr "Cabeçalho de token inválido. String de token não deve incluir espaços." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Cabeçalho de token inválido. String de token não deve possuir caracteres inválidos." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." -msgstr "" +msgstr "Token inválido." #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "Token de autenticação" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Chave" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Usuário" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Criado" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Tokens" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Nome do usuário" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Senha" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "Impossível fazer login com as credenciais fornecidas." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "Obrigatório incluir \"usuário\" e \"senha\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." +msgstr "Ocorreu um erro de servidor." + +#: exceptions.py:142 +msgid "Invalid input." msgstr "" -#: exceptions.py:84 +#: exceptions.py:161 msgid "Malformed request." -msgstr "" +msgstr "Pedido malformado." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." -msgstr "" +msgstr "Credenciais de autenticação incorretas." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." -msgstr "" +msgstr "As credenciais de autenticação não foram fornecidas." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "Você não tem permissão para executar essa ação." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "Não encontrado." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "Método \"{method}\" não é permitido." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "Não foi possível satisfazer a requisição do cabeçalho Accept." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "Tipo de mídia \"{media_type}\" no pedido não é suportado." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." +msgstr "Pedido foi limitado." + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." -msgstr "" +msgstr "Este campo é obrigatório." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." +msgstr "Este campo não pode ser nulo." + +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:766 +msgid "Not a valid string." msgstr "" -#: fields.py:674 +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "Este campo não pode ser em branco." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "Certifique-se de que este campo não tenha mais de {max_length} caracteres." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "Certifique-se de que este campo tenha mais de {min_length} caracteres." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "Insira um endereço de email válido." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." -msgstr "" +msgstr "Este valor não corresponde ao padrão exigido." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." +msgstr "Entrar um \"slug\" válido que consista de letras, números, sublinhados ou hífens." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." msgstr "" -#: fields.py:747 +#: fields.py:854 msgid "Enter a valid URL." +msgstr "Entrar um URL válido." + +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "" - -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Informe um endereço IPv4 ou IPv6 válido." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." -msgstr "" +msgstr "Um número inteiro válido é exigido." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "Certifique-se de que este valor seja inferior ou igual a {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "Certifque-se de que este valor seja maior ou igual a {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." -msgstr "" +msgstr "Valor da string é muito grande." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." -msgstr "" +msgstr "Um número válido é necessário." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "" +msgstr "Certifique-se de que não haja mais de {max_digits} dígitos no total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "Certifique-se de que não haja mais de {max_decimal_places} casas decimais." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "Certifique-se de que não haja mais de {max_whole_digits} dígitos antes do ponto decimal." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Formato inválido para data e hora. Use um dos formatos a seguir: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." +msgstr "Necessário uma data e hora mas recebeu uma data." + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1103 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Formato inválido para data. Use um dos formatos a seguir: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." -msgstr "" +msgstr "Necessário uma data mas recebeu uma data e hora." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Formato inválido para Tempo. Use um dos formatos a seguir: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Formato inválido para Duração. Use um dos formatos a seguir: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" não é um escolha válido." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Mais de {count} itens..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "Necessário uma lista de itens, mas recebeu tipo \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "Esta seleção não pode estar vazia." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" não é uma escolha válida para um caminho." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "" +msgstr "Nenhum arquivo foi submetido." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "O dado submetido não é um arquivo. Certifique-se do tipo de codificação no formulário." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." -msgstr "" +msgstr "Nome do arquivo não pode ser determinado." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "" +msgstr "O arquivo submetido está vázio." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "" +msgstr "Certifique-se de que o nome do arquivo tem menos de {max_length} caracteres (tem {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "Fazer upload de uma imagem válida. O arquivo enviado não é um arquivo de imagem ou está corrompido." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "Esta lista não pode estar vazia." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Esperado um dicionário de itens mas recebeu tipo \"{input_type}\"." + +#: fields.py:1683 +msgid "This dictionary may not be empty." msgstr "" -#: fields.py:1549 +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Valor devo ser JSON válido." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Buscar" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordenando" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "ascendente" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "descendente" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "Página inválida." + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" -msgstr "" +msgstr "Cursor inválido" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "Pk inválido \"{pk_value}\" - objeto não existe." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." -msgstr "" +msgstr "Tipo incorreto. Esperado valor pk, recebeu {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "Hyperlink inválido - Sem combinação para a URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "Hyperlink inválido - Combinação URL incorreta." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "Hyperlink inválido - Objeto não existe." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." -msgstr "" +msgstr "Tipo incorreto. Necessário string URL, recebeu {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." -msgstr "" +msgstr "Objeto com {slug_name}={value} não existe." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." +msgstr "Valor inválido." + +#: schemas/utils.py:32 +msgid "unique integer value" msgstr "" -#: serializers.py:326 -msgid "Invalid data. Expected a dictionary, but got {datatype}." +#: schemas/utils.py:34 +msgid "UUID string" msgstr "" +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "Dado inválido. Necessário um dicionário mas recebeu {datatype}." + #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "Filtra" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "Nenhum(a/as)" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "Nenhum item para escholher." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." -msgstr "" +msgstr "Esse campo deve ser único." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." +msgstr "Os campos {field_names} devem criar um set único." + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." msgstr "" -#: validators.py:245 +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "" +msgstr "O campo \"{date_field}\" deve ser único para a data." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "" +msgstr "O campo \"{date_field}\" deve ser único para o mês." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "" +msgstr "O campo \"{date_field}\" deve ser único para o ano." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "Versão inválida no cabeçalho \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." -msgstr "" +msgstr "Versão inválida no caminho de URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Versão inválida no caminho da URL. Não corresponde a nenhuma versão do namespace." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." -msgstr "" +msgstr "Versão inválida no hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." -msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" +msgstr "Versão inválida no parâmetro de query." diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo b/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo index 008629823..5a6e3788e 100644 Binary files a/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo and b/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.po b/rest_framework/locale/pt_BR/LC_MESSAGES/django.po index 9489f20a0..40651552d 100644 --- a/rest_framework/locale/pt_BR/LC_MESSAGES/django.po +++ b/rest_framework/locale/pt_BR/LC_MESSAGES/django.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cloves Oliveira , 2020 # Craig Blaszczyk , 2015 # Ederson Mota Pereira , 2015 # Filipe Rinaldi , 2015 @@ -12,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-12-06 09:53+0000\n" -"Last-Translator: Jonatas Baldin \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,40 +23,40 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Cabeçalho básico inválido. Credenciais não fornecidas." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Cabeçalho básico inválido. String de credenciais não deve incluir espaços." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Cabeçalho básico inválido. Credenciais codificadas em base64 incorretamente." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Usuário ou senha inválido." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Usuário inativo ou removido." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Cabeçalho de token inválido. Credenciais não fornecidas." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Cabeçalho de token inválido. String de token não deve incluir espaços." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Cabeçalho de token inválido. String de token não deve possuir caracteres inválidos." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token inválido." @@ -63,382 +64,515 @@ msgstr "Token inválido." msgid "Auth Token" msgstr "Token de autenticação" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Chave" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Usuário" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Criado" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Nome do usuário" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Senha" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Conta de usuário desabilitada." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Impossível fazer login com as credenciais fornecidas." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Obrigatório incluir \"usuário\" e \"senha\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Ocorreu um erro de servidor." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Pedido malformado." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Credenciais de autenticação incorretas." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "As credenciais de autenticação não foram fornecidas." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Você não tem permissão para executar essa ação." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Não encontrado." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Método \"{method}\" não é permitido." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Não foi possível satisfazer a requisição do cabeçalho Accept." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Tipo de mídia \"{media_type}\" no pedido não é suportado." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Pedido foi limitado." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Este campo é obrigatório." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Este campo não pode ser nulo." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" não é um valor boleano válido." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Este campo não pode ser em branco." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Certifique-se de que este campo não tenha mais de {max_length} caracteres." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Certifique-se de que este campo tenha mais de {min_length} caracteres." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Insira um endereço de email válido." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Este valor não corresponde ao padrão exigido." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Entrar um \"slug\" válido que consista de letras, números, sublinhados ou hífens." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Entrar um URL válido." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" não é um UUID válido." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Informe um endereço IPv4 ou IPv6 válido." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Um número inteiro válido é exigido." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Certifique-se de que este valor seja inferior ou igual a {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Certifque-se de que este valor seja maior ou igual a {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Valor da string é muito grande." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Um número válido é necessário." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Certifique-se de que não haja mais de {max_digits} dígitos no total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Certifique-se de que não haja mais de {max_decimal_places} casas decimais." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Certifique-se de que não haja mais de {max_whole_digits} dígitos antes do ponto decimal." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Formato inválido para data e hora. Use um dos formatos a seguir: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Necessário uma data e hora mas recebeu uma data." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Formato inválido para data. Use um dos formatos a seguir: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Necessário uma data mas recebeu uma data e hora." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Formato inválido para Tempo. Use um dos formatos a seguir: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Formato inválido para Duração. Use um dos formatos a seguir: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" não é um escolha válido." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Mais de {count} itens..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Necessário uma lista de itens, mas recebeu tipo \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Esta seleção não pode estar vazia." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" não é uma escolha válida para um caminho." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Nenhum arquivo foi submetido." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "O dado submetido não é um arquivo. Certifique-se do tipo de codificação no formulário." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Nome do arquivo não pode ser determinado." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "O arquivo submetido está vázio." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Certifique-se de que o nome do arquivo tem menos de {max_length} caracteres (tem {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Fazer upload de uma imagem válida. O arquivo enviado não é um arquivo de imagem ou está corrompido." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Esta lista não pode estar vazia." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Esperado um dicionário de itens mas recebeu tipo \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Valor devo ser JSON válido." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Enviar" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Buscar" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordenando" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "ascendente" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "descendente" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Página inválida." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Cursor inválido" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Pk inválido \"{pk_value}\" - objeto não existe." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tipo incorreto. Esperado valor pk, recebeu {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Hyperlink inválido - Sem combinação para a URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hyperlink inválido - Combinação URL incorreta." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Hyperlink inválido - Objeto não existe." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tipo incorreto. Necessário string URL, recebeu {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objeto com {slug_name}={value} não existe." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valor inválido." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Dado inválido. Necessário um dicionário mas recebeu {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" -msgstr "Filtra" +msgstr "Filtros" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filtra de campo" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordenando" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Buscar" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Nenhum(a/as)" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Nenhum item para escholher." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Esse campo deve ser único." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Os campos {field_names} devem criar um set único." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "O campo \"{date_field}\" deve ser único para a data." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "O campo \"{date_field}\" deve ser único para o mês." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "O campo \"{date_field}\" deve ser único para o ano." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Versão inválida no cabeçalho \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Versão inválida no caminho de URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Versão inválida no caminho da URL. Não corresponde a nenhuma versão do namespace." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Versão inválida no hostname." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Versão inválida no parâmetro de query." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permissão negada." diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.mo b/rest_framework/locale/ro/LC_MESSAGES/django.mo index 0d6f6f942..0c9fb9c56 100644 Binary files a/rest_framework/locale/ro/LC_MESSAGES/django.mo and b/rest_framework/locale/ro/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.po b/rest_framework/locale/ro/LC_MESSAGES/django.po index d144d847e..0c9e900e3 100644 --- a/rest_framework/locale/ro/LC_MESSAGES/django.po +++ b/rest_framework/locale/ro/LC_MESSAGES/django.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Bogdan Mateescu, 2019 # Elena-Adela Neacsu , 2016 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Romanian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,40 +19,40 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Antet de bază invalid. Datele de autentificare nu au fost furnizate." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Antet de bază invalid. Şirul de caractere cu datele de autentificare nu trebuie să conțină spații." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Antet de bază invalid. Datele de autentificare nu au fost corect codificate în base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nume utilizator / Parolă invalid(ă)." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Utilizator inactiv sau șters." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Antet token invalid. Datele de autentificare nu au fost furnizate." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Antet token invalid. Şirul de caractere pentru token nu trebuie să conțină spații." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Antet token invalid. Şirul de caractere pentru token nu trebuie să conțină caractere nevalide." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Token nevalid." @@ -59,382 +60,515 @@ msgstr "Token nevalid." msgid "Auth Token" msgstr "Token de autentificare" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Cheie" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Utilizator" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Creat" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokenuri" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Nume de utilizator" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Parola" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Contul de utilizator este dezactivat." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Nu se poate conecta cu datele de conectare furnizate." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Trebuie să includă \"numele de utilizator\" și \"parola\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "A apărut o eroare pe server." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Cerere incorectă." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Date de autentificare incorecte." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Datele de autentificare nu au fost furnizate." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Nu aveți permisiunea de a efectua această acțiune." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nu a fost găsit(ă)." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoda \"{method}\" nu este permisa." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Antetul Accept al cererii nu a putut fi îndeplinit." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Cererea conține tipul media neacceptat \"{media_type}\"" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Cererea a fost gâtuită." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Acest câmp este obligatoriu." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Acest câmp nu poate fi nul." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" nu este un boolean valid." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Acest câmp nu poate fi gol." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Asigurați-vă că acest câmp nu are mai mult de {max_length} caractere." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Asigurați-vă că acest câmp are cel puțin{min_length} caractere." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Introduceți o adresă de email validă." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Această valoare nu se potrivește cu şablonul cerut." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Introduceți un \"slug\" valid format din litere, numere, caractere de subliniere sau cratime." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Introduceți un URL valid." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" nu este un UUID valid." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Introduceți o adresă IPv4 sau IPv6 validă." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Este necesar un întreg valid." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Asigurați-vă că această valoare este mai mică sau egală cu {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Asigurați-vă că această valoare este mai mare sau egală cu {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Valoare șir de caractere prea mare." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Este necesar un număr valid." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Asigurați-vă că nu există mai mult de {max_digits} cifre în total." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Asigurați-vă că nu există mai mult de {max_decimal_places} zecimale." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Asigurați-vă că nu există mai mult de {max_whole_digits} cifre înainte de punctul zecimal." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Câmpul datetime are format greșit. Utilizați unul dintre aceste formate în loc: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Se aștepta un câmp datetime, dar s-a primit o dată." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Data are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Se aștepta o dată, dar s-a primit un câmp datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Timpul are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Durata are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" nu este o opțiune validă." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Mai mult de {count} articole ..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Se aștepta o listă de elemente, dar s-a primit tip \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Această selecție nu poate fi goală." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" nu este o cale validă." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "Nici un fișier nu a fost sumis." +msgstr "Nu a fost trimis nici un fișier." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Datele prezentate nu sunt un fișier. Verificați tipul de codificare de pe formular." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Numele fișierului nu a putut fi determinat." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "Fișierul sumis este gol." +msgstr "Fișierul trimis este gol." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Asigurați-vă că acest nume de fișier are cel mult {max_length} caractere (momentan are {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Încărcați o imagine validă. Fișierul încărcat a fost fie nu o imagine sau o imagine coruptă." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Această listă nu poate fi goală." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Se aștepta un dicționar de obiecte, dar s-a primit tipul \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Valoarea trebuie să fie JSON valid." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Sumiteţi" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Căutare" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordonare" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "ascendent" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "descendent" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Pagină nevalidă." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Cursor nevalid" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Pk \"{pk_value}\" nevalid - obiectul nu există." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tip incorect. Se aștepta un pk, dar s-a primit \"{data_type}\"." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Hyperlink nevalid - Nici un URL nu se potrivește." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hyperlink nevalid - Potrivire URL incorectă." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Hyperlink nevalid - Obiectul nu există." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tip incorect. Se aștepta un URL, dar s-a primit \"{data_type}\"." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Obiectul cu {slug_name}={value} nu există." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Valoare nevalidă." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Date nevalide. Se aștepta un dicționar de obiecte, dar s-a primit \"{datatype}\"." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtre" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filtre câmpuri" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordonare" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Căutare" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Nici unul/una" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Nu există elemente pentru a fi selectate." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Acest câmp trebuie să fie unic." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Câmpurile {field_names} trebuie să formeze un set unic." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Acest câmp trebuie să fie unic pentru data \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Acest câmp trebuie să fie unic pentru luna \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Acest câmp trebuie să fie unic pentru anul \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Versiune nevalidă în antetul \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Versiune nevalidă în calea URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Versiune nevalidă în calea URL. Nu se potrivește cu niciun spațiu de nume al versiunii." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Versiune nevalidă în numele de gazdă." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." -msgstr "Versiune nevalid în parametrul de interogare." - -#: views.py:88 -msgid "Permission denied." -msgstr "Permisiune refuzată." +msgstr "Versiune nevalidă în parametrul de interogare." diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.mo b/rest_framework/locale/ru/LC_MESSAGES/django.mo index 85918d65a..82688a412 100644 Binary files a/rest_framework/locale/ru/LC_MESSAGES/django.mo and b/rest_framework/locale/ru/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.po b/rest_framework/locale/ru/LC_MESSAGES/django.po index 7e09b227e..30df5d496 100644 --- a/rest_framework/locale/ru/LC_MESSAGES/django.po +++ b/rest_framework/locale/ru/LC_MESSAGES/django.po @@ -3,18 +3,20 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Anton Bazhanov , 2018 # Grigory Mishchenko , 2017 # Kirill Tarasenko, 2015 # koodjo , 2015 # Mike TUMS , 2015 # Sergei Sinitsyn , 2016 +# Val Grom , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Grigory Mishchenko \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Russian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,40 +24,40 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Недопустимый заголовок. Не предоставлены учетные данные." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Недопустимый заголовок. Учетные данные не должны содержать пробелов." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Недопустимый заголовок. Учетные данные некорректно закодированны в base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Недопустимые имя пользователя или пароль." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Пользователь неактивен или удален." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Недопустимый заголовок токена. Не предоставлены учетные данные." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Недопустимый заголовок токена. Токен не должен содержать пробелов." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Недопустимый заголовок токена. Токен не должен содержать недопустимые символы." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Недопустимый токен." @@ -63,382 +65,515 @@ msgstr "Недопустимый токен." msgid "Auth Token" msgstr "Токен аутентификации" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Ключ" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Пользователь" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Создан" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Токен" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Токены" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Имя пользователя" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Пароль" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Учетная запись пользователя отключена." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Невозможно войти с предоставленными учетными данными." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Должен включать \"username\" и \"password\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Произошла ошибка сервера." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Искаженный запрос." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Некорректные учетные данные." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Учетные данные не были предоставлены." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "У вас нет прав для выполнения этой операции." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Не найдено." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Метод \"{method}\" не разрешен." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Невозможно удовлетворить \"Accept\" заголовок запроса." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Неподдерживаемый тип данных \"{media_type}\" в запросе." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Запрос был проигнорирован." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Это поле обязательно." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Это поле не может быть null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" не является корректным булевым значением." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Это поле не может быть пустым." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Убедитесь, что в этом поле не больше {max_length} символов." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Убедитесь, что в этом поле как минимум {min_length} символов." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Введите корректный адрес электронной почты." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Значение не соответствует требуемому паттерну." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Введите корректный \"slug\", состоящий из букв, цифр, знаков подчеркивания или дефисов." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Введите корректный URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" не является корректным UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Введите действительный адрес IPv4 или IPv6." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Требуется целочисленное значение." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Убедитесь, что значение меньше или равно {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Убедитесь, что значение больше или равно {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Слишком длинное значение." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Требуется численное значение." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Убедитесь, что в числе не больше {max_digits} знаков." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Убедитесь, что в числе не больше {max_decimal_places} знаков в дробной части." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Убедитесь, что в числе не больше {max_whole_digits} знаков в целой части." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат datetime. Используйте один из этих форматов: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Ожидался datetime, но был получен date." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат date. Используйте один из этих форматов: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Ожидался date, но был получен datetime." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат времени. Используйте один из этих форматов: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат. Используйте один из этих форматов: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" не является корректным значением." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Элементов больше чем {count}" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Ожидался list со значениями, но был получен \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Выбор не может быть пустым." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" не является корректным путем до файла" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Не был загружен файл." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Загруженный файл не является корректным файлом." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Невозможно определить имя файла." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Загруженный файл пуст." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Убедитесь, что имя файла меньше {max_length} символов (сейчас {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Загрузите корректное изображение. Загруженный файл не является изображением, либо является испорченным." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Этот список не может быть пустым." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Ожидался словарь со значениями, но был получен \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Значение должно быть правильным JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Отправить" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Поиск" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Порядок сортировки" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "по возрастанию" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "по убыванию" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Неправильная страница" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Не корректный курсор" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Недопустимый первичный ключ \"{pk_value}\" - объект не существует." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Некорректный тип. Ожидалось значение первичного ключа, получен {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Недопустимая ссылка - нет совпадения по URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Недопустимая ссылка - некорректное совпадение по URL," -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Недопустимая ссылка - объект не существует." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Некорректный тип. Ожидался URL, получен {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Объект с {slug_name}={value} не существует." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Недопустимое значение." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Недопустимые данные. Ожидался dictionary, но был получен {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Фильтры" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Фильтры полей" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Порядок сортировки" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Поиск" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Ничего" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Нет элементов для выбора" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Это поле должно быть уникально." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Поля {field_names} должны производить массив с уникальными значениями." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Это поле должно быть уникально для даты \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Это поле должно быть уникально для месяца \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Это поле должно быть уникально для года \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Недопустимая версия в заголовке \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Недопустимая версия в пути URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Недопустимая версия в пути URL. Не соответствует ни одному version namespace." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Недопустимая версия в имени хоста." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Недопустимая версия в параметре запроса." - -#: views.py:88 -msgid "Permission denied." -msgstr "Доступ запрещен" diff --git a/rest_framework/locale/ru_RU/LC_MESSAGES/django.mo b/rest_framework/locale/ru_RU/LC_MESSAGES/django.mo new file mode 100644 index 000000000..d6da8f432 Binary files /dev/null and b/rest_framework/locale/ru_RU/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/ru_RU/LC_MESSAGES/django.po b/rest_framework/locale/ru_RU/LC_MESSAGES/django.po new file mode 100644 index 000000000..9fb926a85 --- /dev/null +++ b/rest_framework/locale/ru_RU/LC_MESSAGES/django.po @@ -0,0 +1,573 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Anton Bazhanov , 2018-2019 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Russian (Russia) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "Пожалуйста, введите корректные имя пользователя и пароль учётной записи. Оба поля могут быть чувствительны к регистру." + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "Пользователь неактивен или удален." + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:203 +msgid "Invalid token." +msgstr "" + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "Ключ" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Пользователь" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "Имя пользователя" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "Пароль" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "Ошибка сервера." + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "У вас недостаточно прав для выполнения данного действия." + +#: exceptions.py:185 +msgid "Not found." +msgstr "Страница не найдена." + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "" + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "Обязательное поле." + +#: fields.py:317 +msgid "This field may not be null." +msgstr "Это поле не может быть пустым." + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "Это поле не может быть пустым." + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "Убедитесь, что это значение содержит не более {max_length} символов." + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "Убедитесь, что это значение содержит не менее {min_length} символов." + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "Введите правильный адрес электронной почты." + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "Значение должно состоять только из букв, цифр, символов подчёркивания или дефисов, входящих в стандарт Юникод." + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "Введите правильный URL." + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Введите действительный IPv4 или IPv6 адрес." + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "Введите правильное число." + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "Убедитесь, что это значение меньше либо равно {max_value}." + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "Убедитесь, что это значение больше либо равно {min_value}." + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "" + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "" + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "Убедитесь, что вы ввели не более {max_digits} цифры." + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "Убедитесь, что вы ввели не более {max_decimal_places} цифры после запятой." + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "Убедитесь, что вы ввели не более {max_whole_digits} цифры перед запятой." + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "Значения {input} нет среди допустимых вариантов." + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "Ни одного файла не было отправлено." + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "Отправленный файл пуст." + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "Убедитесь, что это имя файла содержит не более {max_length} символов (сейчас {length})." + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Загрузите правильное изображение. Файл, который вы загрузили, поврежден или не является изображением." + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Сортировка" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "по возрастанию" + +#: filters.py:288 +msgid "descending" +msgstr "по убыванию" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "" + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:449 +msgid "Invalid value." +msgstr "Введите правильное значение." + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "" + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "Фильтры" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "" + +#: validators.py:39 +msgid "This field must be unique." +msgstr "Значения поля должны быть уникальны." + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "" + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "" diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.mo b/rest_framework/locale/sk/LC_MESSAGES/django.mo index c82ae3e09..561c98e98 100644 Binary files a/rest_framework/locale/sk/LC_MESSAGES/django.mo and b/rest_framework/locale/sk/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.po b/rest_framework/locale/sk/LC_MESSAGES/django.po index 119430e90..d44e936d6 100644 --- a/rest_framework/locale/sk/LC_MESSAGES/django.po +++ b/rest_framework/locale/sk/LC_MESSAGES/django.po @@ -8,50 +8,50 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Slovak (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Nesprávna hlavička. Neboli poskytnuté prihlasovacie údaje." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Nesprávna hlavička. Prihlasovacie údaje nesmú obsahovať medzery." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Nesprávna hlavička. Prihlasovacie údaje nie sú správne zakódované pomocou metódy base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Nesprávne prihlasovacie údaje." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Daný používateľ je neaktívny, alebo zmazaný." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Nesprávna token hlavička. Neboli poskytnuté prihlasovacie údaje." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Nesprávna token hlavička. Token hlavička nesmie obsahovať medzery." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Nesprávny token." @@ -59,382 +59,515 @@ msgstr "Nesprávny token." msgid "Auth Token" msgstr "" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Daný používateľ je zablokovaný." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "S danými prihlasovacími údajmi nebolo možné sa prihlásiť." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Musí obsahovať parametre \"používateľské meno\" a \"heslo\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Vyskytla sa chyba na strane servera." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Požiadavok má nesprávny formát, alebo je poškodený." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Nesprávne prihlasovacie údaje." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Prihlasovacie údaje neboli zadané." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "K danej akcii nemáte oprávnenie." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Nebolo nájdené." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metóda \"{method}\" nie je povolená." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Nie je možné vyhovieť požiadavku v hlavičke \"Accept\"." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Požiadavok obsahuje nepodporovaný media type: \"{media_type}\"." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Požiadavok bol obmedzený, z dôvodu prekročenia limitu." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Toto pole je povinné." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Toto pole nemôže byť nulové." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" je validný boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Toto pole nemože byť prázdne." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Uistite sa, že toto pole nemá viac ako {max_length} znakov." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Uistite sa, že toto pole má viac ako {min_length} znakov." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Vložte správnu emailovú adresu." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Toto pole nezodpovedá požadovanému formátu." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Zadajte platný \"slug\", ktorý obsahuje len malé písmená, čísla, spojovník alebopodtržítko." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Zadajte platnú URL adresu." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" nie je platné UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Je vyžadované celé číslo." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Uistite sa, že hodnota je menšia alebo rovná {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Uistite sa, že hodnota je väčšia alebo rovná {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Zadaný textový reťazec je príliš dlhý." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Je vyžadované číslo." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_digits} cifier." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_decimal_places} desatinných miest." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_whole_digits} cifier pred desatinnou čiarkou." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Nesprávny formát dátumu a času. Prosím použite jeden z nasledujúcich formátov: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Vložený len dátum - date namiesto dátumu a času - datetime." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Nesprávny formát dátumu. Prosím použite jeden z nasledujúcich formátov: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Vložený dátum a čas - datetime namiesto jednoduchého dátumu - date." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Nesprávny formát času. Prosím použite jeden z nasledujúcich formátov: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" je nesprávny výber z daných možností." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Bol očakávaný zoznam položiek, no namiesto toho bol nájdený \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Nebol odoslaný žiadny súbor." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Odoslané dáta neobsahujú súbor. Prosím skontrolujte kódovanie - encoding type daného formuláru." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Nebolo možné určiť meno súboru." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Odoslaný súbor je prázdny." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Uistite sa, že meno súboru neobsahuje viac ako {max_length} znakov. (V skutočnosti ich má {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Uploadujte prosím obrázok. Súbor, ktorý ste uploadovali buď nie je obrázok, alebo daný obrázok je poškodený." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Bol očakávaný slovník položiek, no namiesto toho bol nájdený \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" msgstr "" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Nesprávny kurzor." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Nesprávny primárny kľúč \"{pk_value}\" - objekt s daným primárnym kľúčom neexistuje." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Nesprávny typ. Bol prijatý {data_type} namiesto primárneho kľúča." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Nesprávny hypertextový odkaz - žiadna zhoda." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Nesprávny hypertextový odkaz - chybná URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Nesprávny hypertextový odkaz - požadovný objekt neexistuje." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Nesprávny typ {data_type}. Požadovaný typ: hypertextový odkaz." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt, ktorého atribút \"{slug_name}\" je \"{value}\" neexistuje." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Nesprávna hodnota." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Bol očakávaný slovník položiek, no namiesto toho bol nájdený \"{datatype}\"." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Táto položka musí byť unikátna." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Dané položky: {field_names} musia tvoriť musia spolu tvoriť unikátnu množinu." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Položka musí byť pre špecifický deň \"{date_field}\" unikátna." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Položka musí byť pre mesiac \"{date_field}\" unikátna." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Položka musí byť pre rok \"{date_field}\" unikátna." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Nesprávna verzia v \"Accept\" hlavičke." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Nesprávna verzia v URL adrese." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Nesprávna verzia v \"hostname\"." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Nesprávna verzia v parametri požiadavku." - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/sl/LC_MESSAGES/django.mo b/rest_framework/locale/sl/LC_MESSAGES/django.mo index 33aba7cf4..7ec83f821 100644 Binary files a/rest_framework/locale/sl/LC_MESSAGES/django.mo and b/rest_framework/locale/sl/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/sl/LC_MESSAGES/django.po b/rest_framework/locale/sl/LC_MESSAGES/django.po index 9af0fc8fc..205190383 100644 --- a/rest_framework/locale/sl/LC_MESSAGES/django.po +++ b/rest_framework/locale/sl/LC_MESSAGES/django.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Gregor Cimerman\n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Slovenian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,40 +18,40 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Napačno enostavno zagalvje. Ni podanih poverilnic." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Napačno enostavno zaglavje. Poverilniški niz ne sme vsebovati presledkov." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Napačno enostavno zaglavje. Poverilnice niso pravilno base64 kodirane." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Napačno uporabniško ime ali geslo." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Uporabnik neaktiven ali izbrisan." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Neveljaven žeton v zaglavju. Ni vsebovanih poverilnic." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Neveljaven žeton v zaglavju. Žeton ne sme vsebovati presledkov." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Neveljaven žeton v zaglavju. Žeton ne sme vsebovati napačnih znakov." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Neveljaven žeton." @@ -59,382 +59,515 @@ msgstr "Neveljaven žeton." msgid "Auth Token" msgstr "Prijavni žeton" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Ključ" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Uporabnik" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Ustvarjen" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Žeton" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Žetoni" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Uporabniško ime" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Geslo" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Uporabniški račun je onemogočen." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Neuspešna prijava s podanimi poverilnicami." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Mora vsebovati \"uporabniško ime\" in \"geslo\"." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Napaka na strežniku." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Okvarjen zahtevek." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Napačni avtentikacijski podatki." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Avtentikacijski podatki niso bili podani." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Nimate dovoljenj za izvedbo te akcije." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Ni najdeno" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoda \"{method}\" ni dovoljena" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Ni bilo mogoče zagotoviti zaglavja Accept zahtevka." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Nepodprt medijski tip \"{media_type}\" v zahtevku." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Zahtevek je bil pridržan." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "To polje je obvezno." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "To polje ne sme biti null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" ni veljaven boolean." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "To polje ne sme biti prazno." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "To polje ne sme biti daljše od {max_length} znakov." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "To polje mora vsebovati vsaj {min_length} znakov." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Vnesite veljaven elektronski naslov." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Ta vrednost ne ustreza zahtevanemu vzorcu." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Vnesite veljaven \"slug\", ki vsebuje črke, številke, podčrtaje ali vezaje." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Vnesite veljaven URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" ni veljaven UUID" +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Vnesite veljaven IPv4 ali IPv6 naslov." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Zahtevano je veljavno celo število." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Vrednost mora biti manjša ali enaka {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Vrednost mora biti večija ali enaka {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Niz je prevelik." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Zahtevano je veljavno število." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Vnesete lahko največ {max_digits} števk." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Vnesete lahko največ {max_decimal_places} decimalnih mest." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Vnesete lahko največ {max_whole_digits} števk pred decimalno piko." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datim in čas v napačnem formatu. Uporabite eno izmed naslednjih formatov: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Pričakovan datum in čas, prejet le datum." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Datum je v napačnem formatu. Uporabnite enega izmed naslednjih: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Pričakovan datum vendar prejet datum in čas." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Čas je v napačnem formatu. Uporabite enega izmed naslednjih: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Trajanje je v napačnem formatu. Uporabite enega izmed naslednjih: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ni veljavna izbira." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Več kot {count} elementov..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Pričakovan seznam elementov vendar prejet tip \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Ta izbria ne sme ostati prazna." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" ni veljavna izbira poti." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Datoteka ni bila oddana." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Oddani podatki niso datoteka. Preverite vrsto kodiranja na formi." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Imena datoteke ni bilo mogoče določiti." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Oddana datoteka je prazna." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Ime datoteke lahko vsebuje največ {max_length} znakov (ta jih ima {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Naložite veljavno sliko. Naložena datoteka ni bila slika ali pa je okvarjena." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Seznam ne sme biti prazen." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Pričakovan je slovar elementov, prejet element je tipa \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Vrednost mora biti veljaven JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Potrdi" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Iskanje" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Razvrščanje" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "naraščujoče" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "padajoče" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Neveljavna stran." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Neveljaven kazalec" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Neveljaven pk \"{pk_value}\" - objekt ne obstaja." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Neveljaven tip. Pričakovana vrednost pk, prejet {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Neveljavna povezava - Ni URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ni veljavna povezava - Napačen URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ni veljavna povezava - Objekt ne obstaja." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Napačen tip. Pričakovan URL niz, prejet {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt z {slug_name}={value} ne obstaja." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Neveljavna vrednost." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Napačni podatki. Pričakovan slovar, prejet {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtri" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Filter polj" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Razvrščanje" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Iskanje" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "None" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Ni elementov za izbiro." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "To polje mora biti unikatno." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Polja {field_names} morajo skupaj sestavljati unikaten niz." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Polje mora biti unikatno za \"{date_field}\" dan." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Polje mora biti unikatno za \"{date_field} mesec.\"" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Polje mora biti unikatno za \"{date_field}\" leto." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Neveljavna verzija v \"Accept\" zaglavju." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Neveljavna različca v poti URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Neveljavna različica v poti URL. Se ne ujema z nobeno različico imenskega prostora." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Neveljavna različica v imenu gostitelja." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Neveljavna verzija v poizvedbenem parametru." - -#: views.py:88 -msgid "Permission denied." -msgstr "Dovoljenje zavrnjeno." diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.mo b/rest_framework/locale/sv/LC_MESSAGES/django.mo index 7abf311b9..fb1a9f6f9 100644 Binary files a/rest_framework/locale/sv/LC_MESSAGES/django.mo and b/rest_framework/locale/sv/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.po b/rest_framework/locale/sv/LC_MESSAGES/django.po index 00acf5644..d2373618e 100644 --- a/rest_framework/locale/sv/LC_MESSAGES/django.po +++ b/rest_framework/locale/sv/LC_MESSAGES/django.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Joakim Soderlund\n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Swedish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,40 +19,40 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Ogiltig \"basic\"-header. Inga användaruppgifter tillhandahölls." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Ogiltig \"basic\"-header. Strängen för användaruppgifterna ska inte innehålla mellanslag." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Ogiltig \"basic\"-header. Användaruppgifterna är inte korrekt base64-kodade." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Ogiltigt användarnamn/lösenord." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Användaren borttagen eller inaktiv." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Ogiltig \"token\"-header. Inga användaruppgifter tillhandahölls." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ogiltig \"token\"-header. Strängen ska inte innehålla mellanslag." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Ogiltig \"token\"-header. Strängen ska inte innehålla ogiltiga tecken." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Ogiltig \"token\"." @@ -60,382 +60,515 @@ msgstr "Ogiltig \"token\"." msgid "Auth Token" msgstr "Autentiseringstoken" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Nyckel" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Användare" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Skapad" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Tokens" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Användarnamn" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Lösenord" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Användarkontot är borttaget." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Kunde inte logga in med de angivna inloggningsuppgifterna." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Användarnamn och lösenord måste anges." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Ett serverfel inträffade." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Ogiltig förfrågan." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Ogiltiga inloggningsuppgifter. " -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Autentiseringsuppgifter ej tillhandahållna." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Du har inte tillåtelse att utföra denna förfrågan." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Hittades inte." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Metoden \"{method}\" tillåts inte." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "Kunde inte tillfredsställa förfrågans \"Accept\"-header." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Medietypen \"{media_type}\" stöds inte." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Förfrågan stoppades eftersom du har skickat för många." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Det här fältet är obligatoriskt." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Det här fältet får inte vara null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" är inte ett giltigt booleskt värde." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Det här fältet får inte vara blankt." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Se till att detta fält inte har fler än {max_length} tecken." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Se till att detta fält har minst {min_length} tecken." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Ange en giltig mejladress." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Det här värdet matchar inte mallen." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Ange en giltig \"slug\" bestående av bokstäver, nummer, understreck eller bindestreck." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Ange en giltig URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value} är inte ett giltigt UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Ange en giltig IPv4- eller IPv6-adress." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Ett giltigt heltal krävs." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Se till att detta värde är mindre än eller lika med {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Se till att detta värde är större än eller lika med {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Textvärdet är för långt." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Ett giltigt nummer krävs." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Se till att det inte finns fler än totalt {max_digits} siffror." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Se till att det inte finns fler än {max_decimal_places} decimaler." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Se till att det inte finns fler än {max_whole_digits} siffror före decimalpunkten." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datumtiden har fel format. Använd ett av dessa format istället: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Förväntade en datumtid men fick ett datum." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Datumet har fel format. Använde ett av dessa format istället: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Förväntade ett datum men fick en datumtid." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Tiden har fel format. Använd ett av dessa format istället: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Perioden har fel format. Använd ett av dessa format istället: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" är inte ett giltigt val." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Fler än {count} objekt..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Förväntade en lista med element men fick typen \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Det här valet får inte vara tomt." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" är inte ett giltigt val för en sökväg." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Ingen fil skickades." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Den skickade informationen var inte en fil. Kontrollera formulärets kodningstyp." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Inget filnamn kunde bestämmas." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Den skickade filen var tom." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Se till att det här filnamnet har högst {max_length} tecken (det har {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Ladda upp en giltig bild. Filen du laddade upp var antingen inte en bild eller en skadad bild." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Den här listan får inte vara tom." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Förväntade en \"dictionary\" med element men fick typen \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Värdet måste vara giltig JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Skicka" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Sök" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordning" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "stigande" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "fallande" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Ogiltig sida." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Ogiltig cursor." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ogiltigt pk \"{pk_value}\" - Objektet finns inte." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Felaktig typ. Förväntade pk-värde, fick {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Ogiltig hyperlänk - Ingen URL matchade." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ogiltig hyperlänk - Felaktig URL-matching." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Ogiltig hyperlänk - Objektet finns inte." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Felaktig typ. Förväntade URL-sträng, fick {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt med {slug_name}={value} finns inte." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Ogiltigt värde." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Ogiltig data. Förväntade en dictionary, men fick {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filter" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Fältfilter" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Ordning" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Sök" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Inget" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Inga valbara objekt." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Det här fältet måste vara unikt." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Fälten {field_names} måste skapa ett unikt set." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Det här fältet måste vara unikt för datumet \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Det här fältet måste vara unikt för månaden \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Det här fältet måste vara unikt för året \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Ogiltig version i \"Accept\"-headern." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Ogiltig version i URL-resursen." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "Ogiltig version i URL-resursen. Matchar inget versions-namespace." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Ogiltig version i värdnamnet." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Ogiltig version i förfrågningsparametern." - -#: views.py:88 -msgid "Permission denied." -msgstr "Åtkomst nekad." diff --git a/rest_framework/locale/th/LC_MESSAGES/django.mo b/rest_framework/locale/th/LC_MESSAGES/django.mo new file mode 100644 index 000000000..4a2b85a9b Binary files /dev/null and b/rest_framework/locale/th/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/th/LC_MESSAGES/django.po b/rest_framework/locale/th/LC_MESSAGES/django.po new file mode 100644 index 000000000..353244db9 --- /dev/null +++ b/rest_framework/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,573 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Preeti Yuankrathok , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" +"Language-Team: Thai (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: authentication.py:70 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:73 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:83 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:101 +msgid "Invalid username/password." +msgstr "ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง" + +#: authentication.py:104 authentication.py:206 +msgid "User inactive or deleted." +msgstr "ผู้ใช้ไม่ได้เปิดใช้งานหรือถูกลบ" + +#: authentication.py:184 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:187 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:193 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:203 +msgid "Invalid token." +msgstr "Token ไม่ถูกต้อง" + +#: authtoken/apps.py:7 +msgid "Auth Token" +msgstr "Auth Token" + +#: authtoken/models.py:13 +msgid "Key" +msgstr "คีย์" + +#: authtoken/models.py:16 +msgid "User" +msgstr "ผู้ใช้" + +#: authtoken/models.py:18 +msgid "Created" +msgstr "" + +#: authtoken/models.py:27 authtoken/serializers.py:19 +msgid "Token" +msgstr "Token" + +#: authtoken/models.py:28 +msgid "Tokens" +msgstr "Token" + +#: authtoken/serializers.py:9 +msgid "Username" +msgstr "ชื่อผู้ใช้งาน" + +#: authtoken/serializers.py:13 +msgid "Password" +msgstr "รหัสผ่าน" + +#: authtoken/serializers.py:35 +msgid "Unable to log in with provided credentials." +msgstr "ไม่สามารถเข้าสู่ระบบได้" + +#: authtoken/serializers.py:38 +msgid "Must include \"username\" and \"password\"." +msgstr "จำเป็นต้องใส่ชื่อผู้ใช้งานและรหัสผ่าน" + +#: exceptions.py:102 +msgid "A server error occurred." +msgstr "เซิร์ฟเวอร์เกิดข้อผิดพลาด" + +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:167 +msgid "Incorrect authentication credentials." +msgstr "ข้อมูลการเข้าสู่ระบบไม่ถูกต้อง" + +#: exceptions.py:173 +msgid "Authentication credentials were not provided." +msgstr "ไม่พบข้อมูลการเข้าสู่ระบบ" + +#: exceptions.py:179 +msgid "You do not have permission to perform this action." +msgstr "คุณไม่มีสิทธิ์ที่จะดำเนินการ" + +#: exceptions.py:185 +msgid "Not found." +msgstr "ไม่พบ" + +#: exceptions.py:191 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "ไม่ใช่อนุญาติให้ใช้ Method \"{method}\"" + +#: exceptions.py:202 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:212 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "ไม่รองรับมีเดียประเภท \"{media_type}\" ใน Request" + +#: exceptions.py:223 +msgid "Request was throttled." +msgstr "" + +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 +msgid "This field is required." +msgstr "ฟิลด์นี้จำเป็น" + +#: fields.py:317 +msgid "This field may not be null." +msgstr "ฟิลด์นี้จำเป็นต้องมีค่า" + +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" + +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 +msgid "This field may not be blank." +msgstr "ฟิลด์นี้ไม่สามารถเว้นว่างได้" + +#: fields.py:768 fields.py:1881 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "ตรวจสอบฟิลด์ว่ามีความยาวไม่เกิน {max_length} ตัวอักษร" + +#: fields.py:769 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "ตรวตสอบฟิลด์ว่ามีความยาวอย่างน้อย {min_length} ตัวอักษร" + +#: fields.py:816 +msgid "Enter a valid email address." +msgstr "กรอกอีเมลให้ถูกต้อง" + +#: fields.py:827 +msgid "This value does not match the required pattern." +msgstr "ค่านี้ไม่ตรงกับรูปแบบที่ต้องการ" + +#: fields.py:838 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "กรอกข้อมูลที่ประกอบด้วยตัวอักษร ตัวเลข สัญประกาศ และยัติภังค์เท่านั้น" + +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 +msgid "Enter a valid URL." +msgstr "กรอก URL ให้ถูกต้อง" + +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" + +#: fields.py:903 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "กรอก IPv4 หรือ IPv6 ให้ถูกต้อง" + +#: fields.py:931 +msgid "A valid integer is required." +msgstr "ต้องการค่าจำนวนเต็มที่ถูกต้อง" + +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format +msgid "Ensure this value is less than or equal to {max_value}." +msgstr "ตรวจสอบว่าค่านี้น้อยกว่าหรือเท่ากับ {max_value}" + +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "ตรวจสอบว่าค่านี้มากกว่าหรือเท่ากับ {min_value}" + +#: fields.py:934 fields.py:971 fields.py:1010 +msgid "String value too large." +msgstr "ข้อความยาวเกินไป" + +#: fields.py:968 fields.py:1004 +msgid "A valid number is required." +msgstr "ต้องการตัวเลขที่ถูกต้อง" + +#: fields.py:1007 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "ตรวจสอบตัวเลขว่ามีไม่เกิน {max_digits} ตัว" + +#: fields.py:1008 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "ตรวจสอบทศนิยมว่ามีไม่เกิน {max_decimal_places} หลัก" + +#: fields.py:1009 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "ตรวจสอบตัวเลขและทศนิยมรวมกันว่ามีไม่เกิน {max_whole_digits} ตัว" + +#: fields.py:1148 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "รูปแบบวันที่และเวลาไม่ถูกต้อง โปรดใช้รูปแบบใดรูปแบบหนึ่งจาก: {format}" + +#: fields.py:1149 +msgid "Expected a datetime but got a date." +msgstr "ต้องการวันที่และเวลา แต่ได้รับเพียงวันที่" + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "รูปแบบวันที่ไม่ถูกต้อง โปรดใช้รูปแบบใดรูปแบบหนึ่งจาก: {format}" + +#: fields.py:1237 +msgid "Expected a date but got a datetime." +msgstr "ต้องการวันที่ แต่ได้รับวันที่และเวลา" + +#: fields.py:1303 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "รูปแบบเวลาไม่ถูกต้อง โปรดใช้รูปแบบใดรูปแบบหนึ่งจาก: {format}" + +#: fields.py:1365 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "รูปแบบระยะเวลาไม่ถูกต้อง โปรดใช้รูปแบบใดรูปแบบหนึ่งจาก: {format}" + +#: fields.py:1399 fields.py:1456 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" ไม่ใช่ตัวเลือกที่ถูกต้อง" + +#: fields.py:1402 +#, python-brace-format +msgid "More than {count} items..." +msgstr "มีมากกว่า {count} ไอเทม..." + +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "ต้องการ List ของข้อมูล แต่ได้รับ \"{input_type}\"" + +#: fields.py:1458 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1495 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1514 +msgid "No file was submitted." +msgstr "ไม่พบไฟล์" + +#: fields.py:1515 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "ข้อมูลที่ส่งไม่ใช่ไฟล์ โปรดตรวจสอบการเข้ารหัสของฟอร์ม" + +#: fields.py:1516 +msgid "No filename could be determined." +msgstr "ไม่สามารถระบุชื่อไฟล์ได้" + +#: fields.py:1517 +msgid "The submitted file is empty." +msgstr "ไฟล์ที่ส่งว่างเปล่า" + +#: fields.py:1518 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1566 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1604 relations.py:486 serializers.py:571 +msgid "This list may not be empty." +msgstr "List นี้ไม่สามารถว่างได้" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "ต้องการ Dictionary แต่ได้รับ \"{input_type}\"" + +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 +msgid "Value must be valid JSON." +msgstr "ค่าจะต้องเป็น JSON ที่ถูกต้อง" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "ค้นหา" + +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "การเรียงลำดับ" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 +msgid "ascending" +msgstr "น้อยไปมาก" + +#: filters.py:288 +msgid "descending" +msgstr "มากไปน้อย" + +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 +msgid "Invalid page." +msgstr "หน้าไม่ถูกต้อง" + +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 +msgid "Invalid cursor" +msgstr "เคอร์เซอร์ไม่ถูกต้อง" + +#: relations.py:246 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:247 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:280 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:281 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:282 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:283 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:448 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:449 +msgid "Invalid value." +msgstr "ค่าไม่ถูกต้อง" + +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "ข้อมูลไม่ถูกต้อง ต้องการ Dictionary แต่ได้รับ {datatype}" + +#: templates/rest_framework/admin.html:116 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 +msgid "Filters" +msgstr "การกรองข้อมูล" + +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" + +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" + +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" + +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 +msgid "None" +msgstr "ไม่มี" + +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 +msgid "No items to select." +msgstr "" + +#: validators.py:39 +msgid "This field must be unique." +msgstr "" + +#: validators.py:89 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:258 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:271 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:40 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:71 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:116 +msgid "Invalid version in URL path. Does not match any version namespace." +msgstr "" + +#: versioning.py:148 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:170 +msgid "Invalid version in query parameter." +msgstr "" diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.mo b/rest_framework/locale/tr/LC_MESSAGES/django.mo index fcdff0a98..6386aab52 100644 Binary files a/rest_framework/locale/tr/LC_MESSAGES/django.mo and b/rest_framework/locale/tr/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.po b/rest_framework/locale/tr/LC_MESSAGES/django.po index d327ab9e2..106fe7177 100644 --- a/rest_framework/locale/tr/LC_MESSAGES/django.po +++ b/rest_framework/locale/tr/LC_MESSAGES/django.po @@ -8,16 +8,16 @@ # Ertaç Paprat , 2015 # José Luis , 2016 # Mesut Can Gürle , 2015 -# Murat Çorlu , 2015 +# Murat Çorlu , 2015 # Recep KIRMIZI , 2015 # Ülgen Sarıkavak , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Turkish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,40 +25,40 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Geçersiz yetkilendirme başlığı. Gerekli uygunluk kriterleri sağlanmamış." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterine ait veri boşluk karakteri içermemeli." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterleri base64 formatına uygun olarak kodlanmamış." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Geçersiz kullanıcı adı/parola" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Kullanıcı aktif değil ya da silinmiş." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Geçersiz token başlığı. Kimlik bilgileri eksik." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Geçersiz token başlığı. Token'da boşluk olmamalı." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Geçersiz token başlığı. Token geçersiz karakter içermemeli." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Geçersiz token." @@ -66,382 +66,515 @@ msgstr "Geçersiz token." msgid "Auth Token" msgstr "Kimlik doğrulama belirteci" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Anahtar" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Kullanan" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Oluşturulan" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "İşaret" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "İşaretler" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Kullanıcı adı" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Şifre" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Kullanıcı hesabı devre dışı bırakılmış." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Verilen bilgiler ile giriş sağlanamadı." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "\"Kullanıcı Adı\" ve \"Parola\" eklenmeli." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Sunucu hatası oluştu." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Bozuk istek." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Giriş bilgileri hatalı." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Giriş bilgileri verilmedi." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Bu işlemi yapmak için izniniz bulunmuyor." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Bulunamadı." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "\"{method}\" metoduna izin verilmiyor." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "İsteğe ait Accept başlık bilgisi yanıt verilecek başlık bilgileri arasında değil." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Üst üste çok fazla istek yapıldı." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Bu alan zorunlu." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" geçerli bir boolean değil." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Bu alanın {max_length} karakterden fazla karakter barındırmadığından emin olun." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Bu alanın en az {min_length} karakter barındırdığından emin olun." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Geçerli bir e-posta adresi girin." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Bu değer gereken düzenli ifade deseni ile uyuşmuyor." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Harf, rakam, altçizgi veya tireden oluşan geçerli bir \"slug\" giriniz." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Geçerli bir URL girin." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" geçerli bir UUID değil." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Geçerli bir IPv4 ya da IPv6 adresi girin." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Geçerli bir tam sayı girin." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Değerin {max_value} değerinden küçük ya da eşit olduğundan emin olun." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Değerin {min_value} değerinden büyük ya da eşit olduğundan emin olun." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "String değeri çok uzun." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Geçerli bir numara gerekiyor." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Toplamda {max_digits} haneden fazla hane olmadığından emin olun." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Ondalık basamak değerinin {max_decimal_places} haneden fazla olmadığından emin olun." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Ondalık ayracından önce {max_whole_digits} basamaktan fazla olmadığından emin olun." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime alanı yanlış biçimde. {format} biçimlerinden birini kullanın." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Datetime değeri bekleniyor, ama date değeri geldi." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Tarih biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Date tipi beklenmekteydi, fakat datetime tipi geldi." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duration biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" geçerli bir seçim değil." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "{count} elemandan daha fazla..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Elemanların listesi beklenirken \"{input_type}\" alındı." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Bu seçim boş bırakılmamalı." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" geçerli bir yol seçimi değil." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Hiçbir dosya verilmedi." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Gönderilen veri dosya değil. Formdaki kodlama tipini kontrol edin." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Hiçbir dosya adı belirlenemedi." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Gönderilen dosya boş." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Bu dosya adının en fazla {max_length} karakter uzunluğunda olduğundan emin olun. (şu anda {length} karakter)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Geçerli bir resim yükleyin. Yüklediğiniz dosya resim değil ya da bozuk." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Bu liste boş olmamalı." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Sözlük tipi bir değişken beklenirken \"{input_type}\" tipi bir değişken alındı." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Değer geçerli bir JSON olmalı." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Gönder" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Arama" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sıralama" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Geçersiz sayfa." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Sayfalandırma imleci geçersiz" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Geçersiz pk \"{pk_value}\" - obje bulunamadı." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Hatalı tip. Pk değeri beklenirken, alınan {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Geçersiz bağlantı - Hiçbir URL eşleşmedi." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Geçersiz bağlantı - Yanlış URL eşleşmesi." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Geçersiz bağlantı - Obje bulunamadı." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Hatalı tip. URL metni bekleniyor, {data_type} alındı." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} değerini taşıyan obje bulunamadı." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Geçersiz değer." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Geçersiz veri. Sözlük bekleniyordu fakat {datatype} geldi. " #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtreler" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Alan filtreleri" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sıralama" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Arama" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Hiçbiri" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Seçenek yok." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Bu alan eşsiz olmalı." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "{field_names} hep birlikte eşsiz bir küme oluşturmalılar." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Bu alan \"{date_field}\" tarihine göre eşsiz olmalı." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Bu alan \"{date_field}\" ayına göre eşsiz olmalı." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "\"Accept\" başlığındaki sürüm geçersiz." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "URL dizininde geçersiz versiyon." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Host adında geçersiz versiyon." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Sorgu parametresinde geçersiz versiyon." - -#: views.py:88 -msgid "Permission denied." -msgstr "Erişim engellendi." diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo b/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo index 2999352a2..3751732be 100644 Binary files a/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo and b/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po index 94856c70f..b0c96ddd1 100644 --- a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po +++ b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po @@ -3,55 +3,56 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Deniz , 2019 # José Luis , 2015-2016 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Geçersiz yetkilendirme başlığı. Gerekli uygunluk kriterleri sağlanmamış." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterine ait veri boşluk karakteri içermemeli." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterleri base64 formatına uygun olarak kodlanmamış." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Geçersiz kullanıcı adı / şifre." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Kullanıcı aktif değil ya da silinmiş" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "Geçersiz token başlığı. Kimlik bilgileri eksik." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "Geçersiz token başlığı. Token'da boşluk olmamalı." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Geçersiz token başlığı. Token geçersiz karakter içermemeli." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Geçersiz simge." @@ -59,382 +60,515 @@ msgstr "Geçersiz simge." msgid "Auth Token" msgstr "Kimlik doğrulama belirteci" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Anahtar" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Kullanan" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Oluşturulan" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "İşaret" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "İşaretler" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Kullanıcı adı" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Şifre" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Kullanıcı hesabı devre dışı bırakılmış." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Verilen bilgiler ile giriş sağlanamadı." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "\"Kullanıcı Adı\" ve \"Parola\" eklenmeli." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Sunucu hatası oluştu." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Bozuk istek." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Giriş bilgileri hatalı." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Giriş bilgileri verilmedi." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "Bu işlemi yapmak için izniniz bulunmuyor." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Bulunamadı." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "\"{method}\" metoduna izin verilmiyor." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "İsteğe ait Accept başlık bilgisi yanıt verilecek başlık bilgileri arasında değil." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Üst üste çok fazla istek yapıldı." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Bu alan zorunlu." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" geçerli bir boolean değil." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Bu alanın {max_length} karakterden fazla karakter barındırmadığından emin olun." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Bu alanın en az {min_length} karakter barındırdığından emin olun." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Geçerli bir e-posta adresi girin." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Bu değer gereken düzenli ifade deseni ile uyuşmuyor." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Harf, rakam, altçizgi veya tireden oluşan geçerli bir \"slug\" giriniz." -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Geçerli bir URL girin." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" geçerli bir UUID değil." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Geçerli bir IPv4 ya da IPv6 adresi girin." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Geçerli bir tam sayı girin." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Değerin {max_value} değerinden küçük ya da eşit olduğundan emin olun." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Değerin {min_value} değerinden büyük ya da eşit olduğundan emin olun." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "String değeri çok uzun." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Geçerli bir numara gerekiyor." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Toplamda {max_digits} haneden fazla hane olmadığından emin olun." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Ondalık basamak değerinin {max_decimal_places} haneden fazla olmadığından emin olun." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Ondalık ayracından önce {max_whole_digits} basamaktan fazla olmadığından emin olun." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime alanı yanlış biçimde. {format} biçimlerinden birini kullanın." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Datetime değeri bekleniyor, ama date değeri geldi." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Tarih biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Date tipi beklenmekteydi, fakat datetime tipi geldi." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Duration biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" geçerli bir seçim değil." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "{count} elemandan daha fazla..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Elemanların listesi beklenirken \"{input_type}\" alındı." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Bu seçim boş bırakılmamalı." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" geçerli bir yol seçimi değil." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Hiçbir dosya verilmedi." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Gönderilen veri dosya değil. Formdaki kodlama tipini kontrol edin." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Hiçbir dosya adı belirlenemedi." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Gönderilen dosya boş." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Bu dosya adının en fazla {max_length} karakter uzunluğunda olduğundan emin olun. (şu anda {length} karakter)." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Geçerli bir resim yükleyin. Yüklediğiniz dosya resim değil ya da bozuk." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Bu liste boş olmamalı." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Sözlük tipi bir değişken beklenirken \"{input_type}\" tipi bir değişken alındı." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Değer geçerli bir JSON olmalı." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Gönder" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Arama" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sıralama" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "artan" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "azalan" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Geçersiz sayfa." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Geçersiz imleç." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Geçersiz pk \"{pk_value}\" - obje bulunamadı." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Hatalı tip. Pk değeri beklenirken, alınan {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Geçersiz hyper link - URL maçı yok." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Geçersiz hyper link - Yanlış URL maçı." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Geçersiz hyper link - Nesne yok.." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Hatalı tip. URL metni bekleniyor, {data_type} alındı." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} değerini taşıyan obje bulunamadı." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Geçersiz değer." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Geçersiz veri. Bir sözlük bekleniyor, ama var {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Filtreler" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Alan filtreleri" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Sıralama" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Arama" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Hiç kimse" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Seçenek yok." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Bu alan benzersiz olmalıdır." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "{field_names} alanları benzersiz bir set yapmak gerekir." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Bu alan \"{date_field}\" tarihine göre eşsiz olmalı." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Bu alan \"{date_field}\" ayına göre eşsiz olmalı." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "\"Kabul et\" başlığında geçersiz sürümü." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." -msgstr "URL yolu geçersiz sürümü." +msgstr "URL yolunda geçersiz sürüm." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "URL yolunda geçersiz sürüm. Sürüm adlarında eşleşen bulunamadı." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Hostname geçersiz sürümü." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Sorgu parametresi geçersiz sürümü." - -#: views.py:88 -msgid "Permission denied." -msgstr "İzin reddedildi." diff --git a/rest_framework/locale/uk/LC_MESSAGES/django.mo b/rest_framework/locale/uk/LC_MESSAGES/django.mo index 9772bedc5..18c3242bb 100644 Binary files a/rest_framework/locale/uk/LC_MESSAGES/django.mo and b/rest_framework/locale/uk/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/uk/LC_MESSAGES/django.po b/rest_framework/locale/uk/LC_MESSAGES/django.po index 2bd4369f8..0106cc051 100644 --- a/rest_framework/locale/uk/LC_MESSAGES/django.po +++ b/rest_framework/locale/uk/LC_MESSAGES/django.po @@ -3,58 +3,58 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Денис Подлесный , 2016 +# Denis Podlesniy , 2016 # Illarion , 2016 -# Kirill Tarasenko, 2016 +# Kirill Tarasenko, 2016,2018 # Victor Mireyev , 2017 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Victor Mireyev \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Ukrainian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "Недійсний основний заголовок. Облікові дані відсутні." -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "Недійсний основний заголовок. Облікові дані мають бути без пробілів." +msgstr "Недійсний основний заголовок. Строка з обліковими даними має бути без пробілів." -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "Недійсний основний заголовок. Облікові дані невірно закодовані у Base64." +msgstr "Недійсний основний заголовок. Облікові дані невірно закодовані у base64." -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "Недійсне iм'я користувача/пароль." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "Користувач неактивний або видалений." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." -msgstr "Недійсний заголовок токена. Облікові дані відсутні." +msgstr "Недійсний токен. Облікові дані відсутні." -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." -msgstr "Недійсний заголовок токена. Значення токена не повинне містити пробіли." +msgstr "Недійсний токен. Значення токена не повинне містити пробіли." -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "Недійсний заголовок токена. Значення токена не повинне містити некоректні символи." +msgstr "Недійсний токен. Значення токена не повинне містити некоректні символи." -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "Недійсний токен." @@ -62,382 +62,515 @@ msgstr "Недійсний токен." msgid "Auth Token" msgstr "Авторизаційний токен" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "Ключ" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "Користувач" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "Створено" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "Токен" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "Токени" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "Ім'я користувача" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "Пароль" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "Обліковий запис деактивований." - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "Неможливо зайти з введеними даними." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "Має включати iм'я користувача та пароль" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "Помилка сервера." -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "Некоректний запит." -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "Некоректні реквізити перевірки достовірності." -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "Реквізити перевірки достовірності не надані." -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "У вас нема дозволу робити цю дію." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "Не знайдено." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "Метод \"{method}\" не дозволений." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." -msgstr "Неможливо виконати запит прийняття заголовку." +msgstr "Неможливо виконати запит заголовку Accept." -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "Непідтримуваний тип даних \"{media_type}\" в запиті." -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "Запит було проігноровано." -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "Це поле обов'язкове." -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "Це поле не може бути null." -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "\"{input}\" не є коректним бульовим значенням." +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "Це поле не може бути порожнім." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Переконайтесь, що кількість символів в цьому полі не перевищує {max_length}." -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Переконайтесь, що в цьому полі мінімум {min_length} символів." -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "Введіть коректну адресу електронної пошти." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "Значення не відповідає необхідному патерну." -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Введіть коректний \"slug\", що складається із букв, цифр, нижніх підкреслень або дефісів. " -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "Введіть коректний URL." -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "\"{value}\" не є коректним UUID." +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Введіть дійсну IPv4 або IPv6 адресу." +msgstr "Введіть коректну IPv4 або IPv6 адресу." -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "Необхідне цілочисельне значення." -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Переконайтесь, що значення менше або дорівнює {max_value}." -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Переконайтесь, що значення більше або дорівнює {min_value}." -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "Строкове значення занадто велике." -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "Необхідне чисельне значення." -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Переконайтесь, що в числі не більше {max_digits} знаків." -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Переконайтесь, що в числі не більше {max_decimal_places} знаків у дробовій частині." -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Переконайтесь, що в числі не більше {max_whole_digits} знаків у цілій частині." -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Невірний формат дата з часом. Використайте один з цих форматів: {format}." -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "Очікувалась дата з часом, але було отримано дату." -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Невірний формат дати. Використайте один з цих форматів: {format}." -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "Очікувалась дата, але було отримано дату з часом." -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Неправильний формат часу. Використайте один з цих форматів: {format}." -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "Невірний формат тривалості. Використайте один з цих форматів: {format}." -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" не є коректним вибором." -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "Елементів більше, ніж {count}..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Очікувався список елементів, але було отримано \"{input_type}\"." -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "Вибір не може бути порожнім." -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" вибраний шлях не є коректним." -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "Файл не було відправленно." -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Відправленні дані не є файл. Перевірте тип кодування у формі." -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "Неможливо визначити ім'я файлу." -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "Відправленний файл порожній." -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Переконайтесь, що ім'я файлу становить менше {max_length} символів (зараз {length})." -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Завантажте коректне зображення. Завантажений файл або не є зображенням, або пошкоджений." -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "Цей список не може бути порожнім." -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Очікувався словник зі елементами, але було отримано \"{input_type}\"." -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "Значення повинно бути коректним JSON." -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "Відправити" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Пошук" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Впорядкування" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" -msgstr "в порядку зростання" +msgstr "у порядку зростання" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "у порядку зменшення" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "Недійсна сторінка." -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "Недійсний курсор." -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Недопустимий первинний ключ \"{pk_value}\" - об'єкт не існує." -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Некоректний тип. Очікувалось значення первинного ключа, отримано {data_type}." -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "Недійсне посилання - немає збігу за URL." -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Недійсне посилання - некоректний збіг за URL." -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "Недійсне посилання - об'єкт не існує." -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Некоректний тип. Очікувався URL, отримано {data_type}." -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Об'єкт із {slug_name}={value} не існує." -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "Недійсне значення." -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "Недопустимі дані. Очікувався словник, але було отримано {datatype}." #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "Фільтри" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "Фільтри поля" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "Впорядкування" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "Пошук" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "Нічого" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "Немає елементів для вибору." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "Це поле повинне бути унікальним." -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "Поля {field_names} повинні створювати унікальний масив значень." -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "Це поле повинне бути унікальним для дати \"{date_field}\"." -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "Це поле повинне бути унікальним для місяця \"{date_field}\"." -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "Це поле повинне бути унікальним для року \"{date_field}\"." -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "Недопустима версія в загаловку \"Accept\"." -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "Недопустима версія в шляху URL." -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." -msgstr "" +msgstr "Недопустима версія в шляху URL. Не співпадає з будь-яким простором версій." -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "Недопустима версія в імені хоста." -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "Недопустима версія в параметрі запиту." - -#: views.py:88 -msgid "Permission denied." -msgstr "Доступ заборонено." diff --git a/rest_framework/locale/vi/LC_MESSAGES/django.mo b/rest_framework/locale/vi/LC_MESSAGES/django.mo index c76cfe595..6809b650c 100644 Binary files a/rest_framework/locale/vi/LC_MESSAGES/django.mo and b/rest_framework/locale/vi/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/vi/LC_MESSAGES/django.po b/rest_framework/locale/vi/LC_MESSAGES/django.po index ea43efb95..8054fb880 100644 --- a/rest_framework/locale/vi/LC_MESSAGES/django.po +++ b/rest_framework/locale/vi/LC_MESSAGES/django.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nguyen Tuan Anh , 2019 +# Xavier Ordoquy , 2020 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 20:02+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Vietnamese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,40 +19,40 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "Sai tên đăng nhập hoặc mật khẩu." -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "Người dùng không còn hoạt động, hoặc đã bị xoá." -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "" @@ -58,382 +60,515 @@ msgstr "" msgid "Auth Token" msgstr "" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "Khoá" + +#: authtoken/models.py:16 +msgid "User" +msgstr "Người dùng" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "Đã tạo" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "" -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" - #: authtoken/serializers.py:9 +msgid "Username" +msgstr "Tên người dùng" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "Mật khẩu" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "Không thể đăng nhập với thông tin đã nhập." -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "Bắt buộc phải có “tên người dùng” và “mật khẩu”." -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "Bạn không được cấp quyền để thực hiện hành động này." -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "Không tìm thấy." -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "Phương thức “{method}” không được chấp nhận." -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "Trường này không được bỏ trống." -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "Nhập một địa chỉ email hợp lệ." -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1103 -msgid "Date has wrong format. Use one of these formats instead: {format}." +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1104 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "Ngày sai định dạng. Dùng một trong những định dạng sau để thay thế: {format}." + +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "" -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr " Danh sách này không thể để trống." + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "Giá trị bắt buộc phải là định dạng JSON." + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Tìm kiếm" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sắp xếp" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" msgstr "" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." -msgstr "" +msgstr "Không có gì để chọn." -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo b/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo index f30b04ea1..3bd1fd3ef 100644 Binary files a/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po index 345bcfac8..7e131db42 100644 --- a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po +++ b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: Lele Long \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Chinese (China) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,40 +20,40 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "无效的Basic认证头,没有提供认证信息。" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "认证字符串不应该包含空格(基本认证HTTP头无效)。" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "用户名或者密码错误。" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "用户未激活或者已删除。" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "没有提供认证信息(认证令牌HTTP头无效)。" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "无效的Token。Token字符串不能包含非法的字符。" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "认证令牌无效。" @@ -61,382 +61,515 @@ msgstr "认证令牌无效。" msgid "Auth Token" msgstr "认证令牌" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "键" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "用户" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "已创建" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "令牌" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "令牌" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "用户名" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "密码" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "用户账户已禁用。" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "无法使用提供的认证信息登录。" -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "必须包含 “用户名” 和 “密码”。" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "服务器出现了错误。" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "错误的请求。" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "不正确的身份认证信息。" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "身份认证信息未提供。" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "您没有执行该操作的权限。" -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "未找到。" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "方法 “{method}” 不被允许。" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "无法满足Accept HTTP头的请求。" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "不支持请求中的媒体类型 “{media_type}”。" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "请求超过了限速。" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "该字段是必填项。" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "该字段不能为 null。" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "“{input}” 不是合法的布尔值。" +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "该字段不能为空。" -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "请确保这个字段不能超过 {max_length} 个字符。" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "请确保这个字段至少包含 {min_length} 个字符。" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "请输入合法的邮件地址。" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "输入值不匹配要求的模式。" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "请输入合法的URL。" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "“{value}”不是合法的UUID。" +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "请输入一个有效的IPv4或IPv6地址。" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "请填写合法的整数值。" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "请确保该值小于或者等于 {max_value}。" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "请确保该值大于或者等于 {min_value}。" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "字符串值太长。" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "请填写合法的数字。" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "请确保总计不超过 {max_digits} 个数字。" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "请确保总计不超过 {max_decimal_places} 个小数位。" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "请确保小数点前不超过 {max_whole_digits} 个数字。" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "日期时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "期望为日期时间,得到的是日期。" -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "日期格式错误。请从这些格式中选择:{format}。" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "期望为日期,得到的是日期时间。" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "“{input}” 不是合法选项。" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "多于{count}条记录。" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "这项选择不能为空。" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "“{input}” 不是有效路径选项。" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "没有提交任何文件。" -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "提交的数据不是一个文件。请检查表单的编码类型。" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "无法检测到文件名。" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "提交的是空文件。" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "列表字段不能为空值。" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "值必须是有效的 JSON 数据。" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "保存" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "查找" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "排序" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "升序" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "降序" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "无效页。" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "无效游标" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "无效主键 “{pk_value}” - 对象不存在。" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "类型错误。期望为主键,得到的类型为 {data_type}。" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "无效超链接 -没有匹配的URL。" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "无效超链接 -错误的URL匹配。" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "无效超链接 -对象不存在。" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "属性 {slug_name} 为 {value} 的对象不存在。" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "无效值。" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "无效数据。期待为字典类型,得到的是 {datatype} 。" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "过滤器" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "过滤器字段" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "排序" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr "查找" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "无" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "没有可选项。" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "该字段必须唯一。" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "字段 {field_names} 必须能构成唯一集合。" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "该字段必须在日期 “{date_field}” 唯一。" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "该字段必须在月份 “{date_field}” 唯一。" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "该字段必须在年 “{date_field}” 唯一。" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "“Accept” HTTP头包含无效版本。" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "URL路径包含无效版本。" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "URL路径中存在无效版本。版本空间中无法匹配上。" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "主机名包含无效版本。" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "请求参数里包含无效版本。" - -#: views.py:88 -msgid "Permission denied." -msgstr "没有权限。" diff --git a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo index d85317ebc..670228a83 100644 Binary files a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po index aa56ccc45..ce85b52c7 100644 --- a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po +++ b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po @@ -5,15 +5,15 @@ # Translators: # cokky , 2015 # hunter007 , 2015 -# nypisces , 2015 +# 3eb8e7e672c2428f1223e00920bfd2b3, 2015 # ppppfly , 2017 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2017-08-03 14:58+0000\n" -"Last-Translator: ppppfly \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Chinese Simplified (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh-Hans/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,40 +21,40 @@ msgstr "" "Language: zh-Hans\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "无效的Basic认证头,没有提供认证信息。" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "认证字符串不应该包含空格(基本认证HTTP头无效)。" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." msgstr "用户名或者密码错误。" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." msgstr "用户未激活或者已删除。" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "没有提供认证信息(认证令牌HTTP头无效)。" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "无效的Token。Token字符串不能包含非法的字符。" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." msgstr "认证令牌无效。" @@ -62,382 +62,515 @@ msgstr "认证令牌无效。" msgid "Auth Token" msgstr "认证令牌" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" msgstr "键" -#: authtoken/models.py:18 +#: authtoken/models.py:16 msgid "User" msgstr "用户" -#: authtoken/models.py:20 +#: authtoken/models.py:18 msgid "Created" msgstr "已创建" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" msgstr "令牌" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" msgstr "令牌" -#: authtoken/serializers.py:8 +#: authtoken/serializers.py:9 msgid "Username" msgstr "用户名" -#: authtoken/serializers.py:9 +#: authtoken/serializers.py:13 msgid "Password" msgstr "密码" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "用户账户已禁用。" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "无法使用提供的认证信息登录。" -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." msgstr "必须包含 “用户名” 和 “密码”。" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "服务器出现了错误。" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "错误的请求。" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "不正确的身份认证信息。" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "身份认证信息未提供。" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." msgstr "您没有执行该操作的权限。" -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." msgstr "未找到。" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." msgstr "方法 “{method}” 不被允许。" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "无法满足Accept HTTP头的请求。" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "不支持请求中的媒体类型 “{media_type}”。" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "请求超过了限速。" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." msgstr "该字段是必填项。" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." msgstr "该字段不能为 null。" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." -msgstr "“{input}” 不是合法的布尔值。" +#: fields.py:701 +msgid "Must be a valid boolean." +msgstr "" -#: fields.py:674 +#: fields.py:766 +msgid "Not a valid string." +msgstr "" + +#: fields.py:767 msgid "This field may not be blank." msgstr "该字段不能为空。" -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "请确保这个字段不能超过 {max_length} 个字符。" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "请确保这个字段至少包含 {min_length} 个字符。" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." msgstr "请输入合法的邮件地址。" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "输入值不匹配要求的模式。" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." msgstr "请输入合法的URL。" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "“{value}”不是合法的UUID。" +#: fields.py:867 +msgid "Must be a valid UUID." +msgstr "" -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." msgstr "请输入一个有效的IPv4或IPv6地址。" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." msgstr "请填写合法的整数值。" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "请确保该值小于或者等于 {max_value}。" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "请确保该值大于或者等于 {min_value}。" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." msgstr "字符串值太长。" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." msgstr "请填写合法的数字。" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "请确保总计不超过 {max_digits} 个数字。" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "请确保总计不超过 {max_decimal_places} 个小数位。" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "请确保小数点前不超过 {max_whole_digits} 个数字。" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "日期时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." msgstr "期望为日期时间,获得的是日期。" -#: fields.py:1103 +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." +msgstr "" + +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "日期格式错误。请从这些格式中选择:{format}。" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." msgstr "期望为日期,获得的是日期时间。" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "“{input}” 不是合法选项。" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." msgstr "多于{count}条记录。" -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." msgstr "这项选择不能为空。" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\"不是一个有效路径选项。" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." msgstr "没有提交任何文件。" -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "提交的数据不是一个文件。请检查表单的编码类型。" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "无法检测到文件名。" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." msgstr "提交的是空文件。" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." msgstr "列表不能为空。" -#: fields.py:1502 +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." +msgstr "" + +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." msgstr "值必须是有效的 JSON 数据。" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" -msgstr "提交" +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr " 搜索" -#: filters.py:336 +#: filters.py:50 +msgid "A search term." +msgstr "" + +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "排序" + +#: filters.py:181 +msgid "Which field to use when ordering the results." +msgstr "" + +#: filters.py:287 msgid "ascending" msgstr "正排序" -#: filters.py:337 +#: filters.py:288 msgid "descending" msgstr "倒排序" -#: pagination.py:193 +#: pagination.py:174 +msgid "A page number within the paginated result set." +msgstr "" + +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." msgstr "无效页面。" -#: pagination.py:427 +#: pagination.py:374 +msgid "The initial index from which to return the results." +msgstr "" + +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "无效游标" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "无效主键 “{pk_value}” - 对象不存在。" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "类型错误。期望为主键,获得的类型为 {data_type}。" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." msgstr "无效超链接 -没有匹配的URL。" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." msgstr "无效超链接 -错误的URL匹配。" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." msgstr "无效超链接 -对象不存在。" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "属性 {slug_name} 为 {value} 的对象不存在。" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." msgstr "无效值。" -#: serializers.py:326 +#: schemas/utils.py:32 +msgid "unique integer value" +msgstr "" + +#: schemas/utils.py:34 +msgid "UUID string" +msgstr "" + +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." msgstr "无效数据。期待为字典类型,得到的是 {datatype} 。" #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" msgstr "过滤器" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" -msgstr "过滤器字段" +#: templates/rest_framework/base.html:37 +msgid "navbar" +msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" -msgstr "排序" +#: templates/rest_framework/base.html:75 +msgid "content" +msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" -msgstr " 搜索" +#: templates/rest_framework/base.html:78 +msgid "request form" +msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:157 +msgid "main content" +msgstr "" + +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" msgstr "无" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "没有可选项。" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." msgstr "该字段必须唯一。" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "字段 {field_names} 必须能构成唯一集合。" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "该字段必须在日期 “{date_field}” 唯一。" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "该字段必须在月份 “{date_field}” 唯一。" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "该字段必须在年 “{date_field}” 唯一。" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "“Accept” HTTP头包含无效版本。" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "URL路径包含无效版本。" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "在URL路径中发现无效的版本。无法匹配任何的版本命名空间。" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "主机名包含无效版本。" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "请求参数里包含无效版本。" - -#: views.py:88 -msgid "Permission denied." -msgstr "没有权限。" diff --git a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo index 0d8ccaa55..26ea0cee9 100644 Binary files a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po index 1960f1f5d..6d2630f31 100644 --- a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po +++ b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Matsui Lin , 2019 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-12 16:13+0100\n" -"PO-Revision-Date: 2016-07-12 15:14+0000\n" -"Last-Translator: Thomas Christie \n" +"POT-Creation-Date: 2020-10-13 21:45+0200\n" +"PO-Revision-Date: 2020-10-13 19:45+0000\n" +"Last-Translator: Xavier Ordoquy \n" "Language-Team: Chinese Traditional (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh-Hant/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,423 +18,556 @@ msgstr "" "Language: zh-Hant\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: authentication.py:73 +#: authentication.py:70 msgid "Invalid basic header. No credentials provided." msgstr "" -#: authentication.py:76 +#: authentication.py:73 msgid "Invalid basic header. Credentials string should not contain spaces." msgstr "" -#: authentication.py:82 +#: authentication.py:83 msgid "Invalid basic header. Credentials not correctly base64 encoded." msgstr "" -#: authentication.py:99 +#: authentication.py:101 msgid "Invalid username/password." -msgstr "" +msgstr "無效的使用者名稱及密碼。" -#: authentication.py:102 authentication.py:198 +#: authentication.py:104 authentication.py:206 msgid "User inactive or deleted." -msgstr "" +msgstr "帳號未啟用或已被刪除。" -#: authentication.py:176 +#: authentication.py:184 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:179 +#: authentication.py:187 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:185 +#: authentication.py:193 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:195 +#: authentication.py:203 msgid "Invalid token." -msgstr "" +msgstr "無效的token。" #: authtoken/apps.py:7 msgid "Auth Token" -msgstr "" +msgstr "驗證 Token" -#: authtoken/models.py:15 +#: authtoken/models.py:13 msgid "Key" -msgstr "" +msgstr "金鑰" + +#: authtoken/models.py:16 +msgid "User" +msgstr "使用者" #: authtoken/models.py:18 -msgid "User" -msgstr "" - -#: authtoken/models.py:20 msgid "Created" -msgstr "" +msgstr "建立者" -#: authtoken/models.py:29 +#: authtoken/models.py:27 authtoken/serializers.py:19 msgid "Token" -msgstr "" +msgstr "Token" -#: authtoken/models.py:30 +#: authtoken/models.py:28 msgid "Tokens" -msgstr "" - -#: authtoken/serializers.py:8 -msgid "Username" -msgstr "" +msgstr "Tokens" #: authtoken/serializers.py:9 +msgid "Username" +msgstr "使用者名稱" + +#: authtoken/serializers.py:13 msgid "Password" -msgstr "" +msgstr "密碼" -#: authtoken/serializers.py:20 -msgid "User account is disabled." -msgstr "" - -#: authtoken/serializers.py:23 +#: authtoken/serializers.py:35 msgid "Unable to log in with provided credentials." msgstr "" -#: authtoken/serializers.py:26 +#: authtoken/serializers.py:38 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "必須包含使用者名稱及密碼。" -#: exceptions.py:49 +#: exceptions.py:102 msgid "A server error occurred." msgstr "" -#: exceptions.py:84 +#: exceptions.py:142 +msgid "Invalid input." +msgstr "" + +#: exceptions.py:161 msgid "Malformed request." msgstr "" -#: exceptions.py:89 +#: exceptions.py:167 msgid "Incorrect authentication credentials." msgstr "" -#: exceptions.py:94 +#: exceptions.py:173 msgid "Authentication credentials were not provided." msgstr "" -#: exceptions.py:99 +#: exceptions.py:179 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "你沒有執行此操作的權限。" -#: exceptions.py:104 views.py:81 +#: exceptions.py:185 msgid "Not found." -msgstr "" +msgstr "找不到資源。" -#: exceptions.py:109 +#: exceptions.py:191 +#, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "不被允許的方法 \"{method}\"。" -#: exceptions.py:120 +#: exceptions.py:202 msgid "Could not satisfy the request Accept header." msgstr "" -#: exceptions.py:132 +#: exceptions.py:212 +#, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." msgstr "" -#: exceptions.py:145 +#: exceptions.py:223 msgid "Request was throttled." msgstr "" -#: fields.py:269 relations.py:206 relations.py:239 validators.py:98 -#: validators.py:181 +#: exceptions.py:224 +#, python-brace-format +msgid "Expected available in {wait} second." +msgstr "" + +#: exceptions.py:225 +#, python-brace-format +msgid "Expected available in {wait} seconds." +msgstr "" + +#: fields.py:316 relations.py:245 relations.py:279 validators.py:90 +#: validators.py:183 msgid "This field is required." -msgstr "" +msgstr "此為必需欄位。" -#: fields.py:270 +#: fields.py:317 msgid "This field may not be null." +msgstr "此欄位不可為null。" + +#: fields.py:701 +msgid "Must be a valid boolean." msgstr "" -#: fields.py:608 fields.py:639 -msgid "\"{input}\" is not a valid boolean." +#: fields.py:766 +msgid "Not a valid string." msgstr "" -#: fields.py:674 +#: fields.py:767 msgid "This field may not be blank." -msgstr "" +msgstr "此欄位不可為空白。" -#: fields.py:675 fields.py:1675 +#: fields.py:768 fields.py:1881 +#, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "請確認此欄位字元長度不超過 {max_length}。" -#: fields.py:676 +#: fields.py:769 +#, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "請確認此欄位字元長度最少超過 {min_length}。" -#: fields.py:713 +#: fields.py:816 msgid "Enter a valid email address." -msgstr "" +msgstr "請輸入有效的電子郵件地址。" -#: fields.py:724 +#: fields.py:827 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:735 +#: fields.py:838 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:747 +#: fields.py:839 +msgid "" +"Enter a valid \"slug\" consisting of Unicode letters, numbers, underscores, " +"or hyphens." +msgstr "" + +#: fields.py:854 msgid "Enter a valid URL." +msgstr "請輸入有效的URL。" + +#: fields.py:867 +msgid "Must be a valid UUID." msgstr "" -#: fields.py:760 -msgid "\"{value}\" is not a valid UUID." -msgstr "" - -#: fields.py:796 +#: fields.py:903 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "請輸入有效的 IPv4 或 IPv6 地址。" -#: fields.py:821 +#: fields.py:931 msgid "A valid integer is required." -msgstr "" +msgstr "請輸入有效的整數值。" -#: fields.py:822 fields.py:857 fields.py:891 +#: fields.py:932 fields.py:969 fields.py:1005 fields.py:1366 +#, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "請確認輸入值小於或等於 {max_value}。" -#: fields.py:823 fields.py:858 fields.py:892 +#: fields.py:933 fields.py:970 fields.py:1006 fields.py:1367 +#, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "請確認輸入值大於或等於 {min_value}。" -#: fields.py:824 fields.py:859 fields.py:896 +#: fields.py:934 fields.py:971 fields.py:1010 msgid "String value too large." -msgstr "" +msgstr "字串長度太長。" -#: fields.py:856 fields.py:890 +#: fields.py:968 fields.py:1004 msgid "A valid number is required." -msgstr "" +msgstr "請輸入有效的數字。" -#: fields.py:893 +#: fields.py:1007 +#, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:894 +#: fields.py:1008 +#, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:895 +#: fields.py:1009 +#, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:1025 +#: fields.py:1148 +#, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1026 +#: fields.py:1149 msgid "Expected a datetime but got a date." +msgstr "應該為日期時間格式,並非日期格式。" + +#: fields.py:1150 +#, python-brace-format +msgid "Invalid datetime for the timezone \"{timezone}\"." msgstr "" -#: fields.py:1103 +#: fields.py:1151 +msgid "Datetime value out of range." +msgstr "" + +#: fields.py:1236 +#, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1104 +#: fields.py:1237 msgid "Expected a date but got a datetime." -msgstr "" +msgstr "應該為日期格式,並非日期時間格式。" -#: fields.py:1170 +#: fields.py:1303 +#, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "時間格式錯誤,請在下列格式中擇一取代:{format}。" -#: fields.py:1232 +#: fields.py:1365 +#, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1251 fields.py:1300 +#: fields.py:1399 fields.py:1456 +#, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" 不是有效的選擇。" -#: fields.py:1254 relations.py:71 relations.py:441 +#: fields.py:1402 +#, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "超過 {count} 個項目..." -#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524 +#: fields.py:1457 fields.py:1603 relations.py:485 serializers.py:570 +#, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "應該為項目組成的列表,並非 \"{input_type}\" 類型。" -#: fields.py:1302 +#: fields.py:1458 msgid "This selection may not be empty." -msgstr "" +msgstr "此選項不可為空。" -#: fields.py:1339 +#: fields.py:1495 +#, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1358 +#: fields.py:1514 msgid "No file was submitted." -msgstr "" +msgstr "沒有任何檔案被提交。" -#: fields.py:1359 +#: fields.py:1515 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "提交的資料並不是檔案格式,請確認表單的編碼類型。" -#: fields.py:1360 +#: fields.py:1516 msgid "No filename could be determined." msgstr "" -#: fields.py:1361 +#: fields.py:1517 msgid "The submitted file is empty." -msgstr "" +msgstr "沒有任何檔案被提交。" -#: fields.py:1362 +#: fields.py:1518 +#, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1410 +#: fields.py:1566 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1449 relations.py:438 serializers.py:525 +#: fields.py:1604 relations.py:486 serializers.py:571 msgid "This list may not be empty." +msgstr "此列表不可為空。" + +#: fields.py:1605 +#, python-brace-format +msgid "Ensure this field has at least {min_length} elements." msgstr "" -#: fields.py:1502 +#: fields.py:1606 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} elements." +msgstr "" + +#: fields.py:1682 +#, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1549 +#: fields.py:1683 +msgid "This dictionary may not be empty." +msgstr "" + +#: fields.py:1755 msgid "Value must be valid JSON." +msgstr "輸入值必須為有效的JSON。" + +#: filters.py:49 templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "搜尋" + +#: filters.py:50 +msgid "A search term." msgstr "" -#: filters.py:36 templates/rest_framework/filters/django_filter.html:5 -msgid "Submit" +#: filters.py:180 templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "排序" + +#: filters.py:181 +msgid "Which field to use when ordering the results." msgstr "" -#: filters.py:336 +#: filters.py:287 msgid "ascending" -msgstr "" +msgstr "升序排列" -#: filters.py:337 +#: filters.py:288 msgid "descending" +msgstr "降序排列" + +#: pagination.py:174 +msgid "A page number within the paginated result set." msgstr "" -#: pagination.py:193 +#: pagination.py:179 pagination.py:372 pagination.py:590 +msgid "Number of results to return per page." +msgstr "" + +#: pagination.py:189 msgid "Invalid page." +msgstr "無效的頁面。" + +#: pagination.py:374 +msgid "The initial index from which to return the results." msgstr "" -#: pagination.py:427 +#: pagination.py:581 +msgid "The pagination cursor value." +msgstr "" + +#: pagination.py:583 msgid "Invalid cursor" msgstr "" -#: relations.py:207 +#: relations.py:246 +#, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "無效的主鍵 \"{pk_value}\" - 物件不存在。" -#: relations.py:208 +#: relations.py:247 +#, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:240 +#: relations.py:280 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "無效的超連結 - 沒有匹配的URL。" -#: relations.py:241 +#: relations.py:281 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "無效的超連結 - 匹配的URL不正確。" -#: relations.py:242 +#: relations.py:282 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "無效的超連結 - 物件不存在。" -#: relations.py:243 +#: relations.py:283 +#, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:401 +#: relations.py:448 +#, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:402 +#: relations.py:449 msgid "Invalid value." +msgstr "無效值。" + +#: schemas/utils.py:32 +msgid "unique integer value" msgstr "" -#: serializers.py:326 -msgid "Invalid data. Expected a dictionary, but got {datatype}." +#: schemas/utils.py:34 +msgid "UUID string" msgstr "" +#: schemas/utils.py:36 +msgid "unique value" +msgstr "" + +#: schemas/utils.py:38 +#, python-brace-format +msgid "A {value_type} identifying this {name}." +msgstr "" + +#: serializers.py:337 +#, python-brace-format +msgid "Invalid data. Expected a dictionary, but got {datatype}." +msgstr "無效的資料,應該為字典類型,並非 {datatype}。" + #: templates/rest_framework/admin.html:116 -#: templates/rest_framework/base.html:128 +#: templates/rest_framework/base.html:136 +msgid "Extra Actions" +msgstr "" + +#: templates/rest_framework/admin.html:130 +#: templates/rest_framework/base.html:150 msgid "Filters" +msgstr "篩選" + +#: templates/rest_framework/base.html:37 +msgid "navbar" msgstr "" -#: templates/rest_framework/filters/django_filter.html:2 -#: templates/rest_framework/filters/django_filter_crispyforms.html:4 -msgid "Field filters" +#: templates/rest_framework/base.html:75 +msgid "content" msgstr "" -#: templates/rest_framework/filters/ordering.html:3 -msgid "Ordering" +#: templates/rest_framework/base.html:78 +msgid "request form" msgstr "" -#: templates/rest_framework/filters/search.html:2 -msgid "Search" +#: templates/rest_framework/base.html:157 +msgid "main content" msgstr "" -#: templates/rest_framework/horizontal/radio.html:2 -#: templates/rest_framework/inline/radio.html:2 -#: templates/rest_framework/vertical/radio.html:2 +#: templates/rest_framework/base.html:173 +msgid "request info" +msgstr "" + +#: templates/rest_framework/base.html:177 +msgid "response info" +msgstr "" + +#: templates/rest_framework/horizontal/radio.html:4 +#: templates/rest_framework/inline/radio.html:3 +#: templates/rest_framework/vertical/radio.html:3 msgid "None" -msgstr "" +msgstr "無" -#: templates/rest_framework/horizontal/select_multiple.html:2 -#: templates/rest_framework/inline/select_multiple.html:2 -#: templates/rest_framework/vertical/select_multiple.html:2 +#: templates/rest_framework/horizontal/select_multiple.html:4 +#: templates/rest_framework/inline/select_multiple.html:3 +#: templates/rest_framework/vertical/select_multiple.html:3 msgid "No items to select." msgstr "" -#: validators.py:43 +#: validators.py:39 msgid "This field must be unique." -msgstr "" +msgstr "此欄位必須唯一。" -#: validators.py:97 +#: validators.py:89 +#, python-brace-format msgid "The fields {field_names} must make a unique set." msgstr "" -#: validators.py:245 +#: validators.py:171 +#, python-brace-format +msgid "Surrogate characters are not allowed: U+{code_point:X}." +msgstr "" + +#: validators.py:243 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." msgstr "" -#: validators.py:260 +#: validators.py:258 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." msgstr "" -#: validators.py:273 +#: validators.py:271 +#, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." msgstr "" -#: versioning.py:42 +#: versioning.py:40 msgid "Invalid version in \"Accept\" header." msgstr "" -#: versioning.py:73 +#: versioning.py:71 msgid "Invalid version in URL path." msgstr "" -#: versioning.py:115 +#: versioning.py:116 msgid "Invalid version in URL path. Does not match any version namespace." msgstr "" -#: versioning.py:147 +#: versioning.py:148 msgid "Invalid version in hostname." msgstr "" -#: versioning.py:169 +#: versioning.py:170 msgid "Invalid version in query parameter." msgstr "" - -#: views.py:88 -msgid "Permission denied." -msgstr "" diff --git a/rest_framework/management/commands/generateschema.py b/rest_framework/management/commands/generateschema.py index 024306b65..8c73e4b9c 100644 --- a/rest_framework/management/commands/generateschema.py +++ b/rest_framework/management/commands/generateschema.py @@ -26,6 +26,7 @@ class Command(BaseCommand): parser.add_argument('--urlconf', dest="urlconf", default=None, type=str) parser.add_argument('--generator_class', dest="generator_class", default=None, type=str) parser.add_argument('--file', dest="file", default=None, type=str) + parser.add_argument('--api_version', dest="api_version", default='', type=str) def handle(self, *args, **options): if options['generator_class']: @@ -37,6 +38,7 @@ class Command(BaseCommand): title=options['title'], description=options['description'], urlconf=options['urlconf'], + version=options['api_version'], ) schema = generator.get_schema(request=None, public=True) renderer = self.get_renderer(options['format']) diff --git a/rest_framework/metadata.py b/rest_framework/metadata.py index 8a44f2aad..015587897 100644 --- a/rest_framework/metadata.py +++ b/rest_framework/metadata.py @@ -36,7 +36,6 @@ class SimpleMetadata(BaseMetadata): label_lookup = ClassLookupDict({ serializers.Field: 'field', serializers.BooleanField: 'boolean', - serializers.NullBooleanField: 'boolean', serializers.CharField: 'string', serializers.UUIDField: 'string', serializers.URLField: 'url', @@ -49,6 +48,7 @@ class SimpleMetadata(BaseMetadata): serializers.DateField: 'date', serializers.DateTimeField: 'datetime', serializers.TimeField: 'time', + serializers.DurationField: 'duration', serializers.ChoiceField: 'choice', serializers.MultipleChoiceField: 'multiple choice', serializers.FileField: 'file upload', diff --git a/rest_framework/negotiation.py b/rest_framework/negotiation.py index 76113a827..b4bbfa1f5 100644 --- a/rest_framework/negotiation.py +++ b/rest_framework/negotiation.py @@ -4,7 +4,7 @@ incoming request. Typically this will be based on the request's Accept header. """ from django.http import Http404 -from rest_framework import HTTP_HEADER_ENCODING, exceptions +from rest_framework import exceptions from rest_framework.settings import api_settings from rest_framework.utils.mediatypes import ( _MediaType, media_type_matches, order_by_precedence @@ -64,9 +64,11 @@ class DefaultContentNegotiation(BaseContentNegotiation): # Accepted media type is 'application/json' full_media_type = ';'.join( (renderer.media_type,) + - tuple('{}={}'.format( - key, value.decode(HTTP_HEADER_ENCODING)) - for key, value in media_type_wrapper.params.items())) + tuple( + '{}={}'.format(key, value) + for key, value in media_type_wrapper.params.items() + ) + ) return renderer, full_media_type else: # Eg client requests 'application/json; indent=8' diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 0b09d12e5..346d3b3c9 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -2,7 +2,10 @@ Pagination serializers determine the structure of the output that should be used for paginated responses. """ + +import contextlib import warnings + from base64 import b64decode, b64encode from collections import OrderedDict, namedtuple from urllib import parse @@ -197,14 +200,13 @@ class PageNumberPagination(BasePagination): Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ + self.request = request page_size = self.get_page_size(request) if not page_size: return None paginator = self.django_paginator_class(queryset, page_size) - page_number = request.query_params.get(self.page_query_param, 1) - if page_number in self.last_page_strings: - page_number = paginator.num_pages + page_number = self.get_page_number(request, paginator) try: self.page = paginator.page(page_number) @@ -218,9 +220,14 @@ class PageNumberPagination(BasePagination): # The browsable API should display pagination controls. self.display_page_controls = True - self.request = request return list(self.page) + def get_page_number(self, request, paginator): + page_number = request.query_params.get(self.page_query_param) or 1 + if page_number in self.last_page_strings: + page_number = paginator.num_pages + return page_number + def get_paginated_response(self, data): return Response(OrderedDict([ ('count', self.page.paginator.count), @@ -257,15 +264,12 @@ class PageNumberPagination(BasePagination): def get_page_size(self, request): if self.page_size_query_param: - try: + with contextlib.suppress(KeyError, ValueError): return _positive_int( request.query_params[self.page_size_query_param], strict=True, cutoff=self.max_page_size ) - except (KeyError, ValueError): - pass - return self.page_size def get_next_link(self): @@ -382,13 +386,13 @@ class LimitOffsetPagination(BasePagination): template = 'rest_framework/pagination/numbers.html' def paginate_queryset(self, queryset, request, view=None): - self.count = self.get_count(queryset) + self.request = request self.limit = self.get_limit(request) if self.limit is None: return None + self.count = self.get_count(queryset) self.offset = self.get_offset(request) - self.request = request if self.count > self.limit and self.template is not None: self.display_page_controls = True @@ -432,15 +436,12 @@ class LimitOffsetPagination(BasePagination): def get_limit(self, request): if self.limit_query_param: - try: + with contextlib.suppress(KeyError, ValueError): return _positive_int( request.query_params[self.limit_query_param], strict=True, cutoff=self.max_limit ) - except (KeyError, ValueError): - pass - return self.default_limit def get_offset(self, request): @@ -490,8 +491,7 @@ class LimitOffsetPagination(BasePagination): _divide_with_ceil(self.offset, self.limit) ) - if final < 1: - final = 1 + final = max(final, 1) else: current = 1 final = 1 @@ -608,6 +608,7 @@ class CursorPagination(BasePagination): offset_cutoff = 1000 def paginate_queryset(self, queryset, request, view=None): + self.request = request self.page_size = self.get_page_size(request) if not self.page_size: return None @@ -685,15 +686,12 @@ class CursorPagination(BasePagination): def get_page_size(self, request): if self.page_size_query_param: - try: + with contextlib.suppress(KeyError, ValueError): return _positive_int( request.query_params[self.page_size_query_param], strict=True, cutoff=self.max_page_size ) - except (KeyError, ValueError): - pass - return self.page_size def get_next_link(self): @@ -910,10 +908,16 @@ class CursorPagination(BasePagination): 'next': { 'type': 'string', 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D"'.format( + cursor_query_param=self.cursor_query_param) }, 'previous': { 'type': 'string', 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3'.format( + cursor_query_param=self.cursor_query_param) }, 'results': schema, }, @@ -968,7 +972,7 @@ class CursorPagination(BasePagination): 'in': 'query', 'description': force_str(self.cursor_query_description), 'schema': { - 'type': 'integer', + 'type': 'string', }, } ] diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py index fc4eb1428..f0fd2b884 100644 --- a/rest_framework/parsers.py +++ b/rest_framework/parsers.py @@ -4,8 +4,9 @@ Parsers are used to parse the content of incoming HTTP requests. They give us a generic way of being able to handle various media types on the request, such as form content or json encoded data. """ + import codecs -from urllib import parse +import contextlib from django.conf import settings from django.core.files.uploadhandler import StopFutureHandlers @@ -13,10 +14,10 @@ from django.http import QueryDict from django.http.multipartparser import ChunkIter from django.http.multipartparser import \ MultiPartParser as DjangoMultiPartParser -from django.http.multipartparser import MultiPartParserError, parse_header -from django.utils.encoding import force_str +from django.http.multipartparser import MultiPartParserError from rest_framework import renderers +from rest_framework.compat import parse_header_parameters from rest_framework.exceptions import ParseError from rest_framework.settings import api_settings from rest_framework.utils import json @@ -194,30 +195,12 @@ class FileUploadParser(BaseParser): Detects the uploaded file name. First searches a 'filename' url kwarg. Then tries to parse Content-Disposition header. """ - try: + with contextlib.suppress(KeyError): return parser_context['kwargs']['filename'] - except KeyError: - pass - try: + with contextlib.suppress(AttributeError, KeyError, ValueError): meta = parser_context['request'].META - disposition = parse_header(meta['HTTP_CONTENT_DISPOSITION'].encode()) - filename_parm = disposition[1] - if 'filename*' in filename_parm: - return self.get_encoded_filename(filename_parm) - return force_str(filename_parm['filename']) - except (AttributeError, KeyError, ValueError): - pass - - def get_encoded_filename(self, filename_parm): - """ - Handle encoded filenames per RFC6266. See also: - https://tools.ietf.org/html/rfc2231#section-4 - """ - encoded_filename = force_str(filename_parm['filename*']) - try: - charset, lang, filename = encoded_filename.split('\'', 2) - filename = parse.unquote(filename) - except (ValueError, LookupError): - filename = force_str(filename_parm['filename']) - return filename + disposition, params = parse_header_parameters(meta['HTTP_CONTENT_DISPOSITION']) + if 'filename*' in params: + return params['filename*'] + return params['filename'] diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 3a8c58064..71de226f9 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -46,6 +46,14 @@ class OperandHolder(OperationHolderMixin): op2 = self.op2_class(*args, **kwargs) return self.operator_class(op1, op2) + def __eq__(self, other): + return ( + isinstance(other, OperandHolder) and + self.operator_class == other.operator_class and + self.op1_class == other.op1_class and + self.op2_class == other.op2_class + ) + class AND: def __init__(self, op1, op2): @@ -78,8 +86,11 @@ class OR: def has_object_permission(self, request, view, obj): return ( - self.op1.has_object_permission(request, view, obj) or - self.op2.has_object_permission(request, view, obj) + self.op1.has_permission(request, view) + and self.op1.has_object_permission(request, view, obj) + ) or ( + self.op2.has_permission(request, view) + and self.op2.has_object_permission(request, view, obj) ) @@ -217,15 +228,15 @@ class DjangoModelPermissions(BasePermission): return view.queryset def has_permission(self, request, view): + if not request.user or ( + not request.user.is_authenticated and self.authenticated_users_only): + return False + # Workaround to ensure DjangoModelPermissions are not applied # to the root view when using DefaultRouter. if getattr(view, '_ignore_model_permissions', False): return True - if not request.user or ( - not request.user.is_authenticated and self.authenticated_users_only): - return False - queryset = self._queryset(view) perms = self.get_required_permissions(request.method, queryset.model) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index eaf27e1d9..62da685fb 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -1,3 +1,4 @@ +import contextlib import sys from collections import OrderedDict from urllib import parse @@ -10,7 +11,7 @@ from django.utils.encoding import smart_str, uri_to_iri from django.utils.translation import gettext_lazy as _ from rest_framework.fields import ( - Field, empty, get_attribute, is_simple_callable, iter_options + Field, SkipField, empty, get_attribute, is_simple_callable, iter_options ) from rest_framework.reverse import reverse from rest_framework.settings import api_settings @@ -104,11 +105,11 @@ class RelatedField(Field): self.html_cutoff_text or _(api_settings.HTML_SELECT_CUTOFF_TEXT) ) if not method_overridden('get_queryset', RelatedField, self): - assert self.queryset is not None or kwargs.get('read_only', None), ( + assert self.queryset is not None or kwargs.get('read_only'), ( 'Relational field must provide a `queryset` argument, ' 'override `get_queryset`, or set read_only=`True`.' ) - assert not (self.queryset is not None and kwargs.get('read_only', None)), ( + assert not (self.queryset is not None and kwargs.get('read_only')), ( 'Relational fields should not provide a `queryset` argument, ' 'when setting read_only=`True`.' ) @@ -170,7 +171,7 @@ class RelatedField(Field): def get_attribute(self, instance): if self.use_pk_only_optimization() and self.source_attrs: # Optimized case, return a mock object only containing the pk attribute. - try: + with contextlib.suppress(AttributeError): attribute_instance = get_attribute(instance, self.source_attrs[:-1]) value = attribute_instance.serializable_value(self.source_attrs[-1]) if is_simple_callable(value): @@ -183,9 +184,6 @@ class RelatedField(Field): value = getattr(value, 'pk', value) return PKOnlyObject(pk=value) - except AttributeError: - pass - # Standard case, return the object instance. return super().get_attribute(instance) @@ -259,6 +257,8 @@ class PrimaryKeyRelatedField(RelatedField): data = self.pk_field.to_internal_value(data) queryset = self.get_queryset() try: + if isinstance(data, bool): + raise TypeError return queryset.get(pk=data) except ObjectDoesNotExist: self.fail('does_not_exist', pk_value=data) @@ -337,7 +337,7 @@ class HyperlinkedRelatedField(RelatedField): return self.reverse(view_name, kwargs=kwargs, request=request, format=format) def to_internal_value(self, data): - request = self.context.get('request', None) + request = self.context.get('request') try: http_prefix = data.startswith(('http:', 'https:')) except AttributeError: @@ -380,7 +380,7 @@ class HyperlinkedRelatedField(RelatedField): ) request = self.context['request'] - format = self.context.get('format', None) + format = self.context.get('format') # By default use whatever format is given for the current context # unless the target is a different type to the source. @@ -533,7 +533,30 @@ class ManyRelatedField(Field): if hasattr(instance, 'pk') and instance.pk is None: return [] - relationship = get_attribute(instance, self.source_attrs) + try: + relationship = get_attribute(instance, self.source_attrs) + except (KeyError, AttributeError) as exc: + if self.default is not empty: + return self.get_default() + if self.allow_null: + return None + if not self.required: + raise SkipField() + msg = ( + 'Got {exc_type} when attempting to get a value for field ' + '`{field}` on serializer `{serializer}`.\nThe serializer ' + 'field might be named incorrectly and not match ' + 'any attribute or key on the `{instance}` instance.\n' + 'Original exception text was: {exc}.'.format( + exc_type=type(exc).__name__, + field=self.field_name, + serializer=self.parent.__class__.__name__, + instance=instance.__class__.__name__, + exc=exc + ) + ) + raise type(exc)(msg) + return relationship.all() if hasattr(relationship, 'all') else relationship def to_representation(self, iterable): diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 3c4be8aeb..8de0a77a1 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -6,7 +6,9 @@ on the response, such as JSON encoded data or HTML output. REST framework also provides an HTML renderer that renders the browsable API. """ + import base64 +import contextlib from collections import OrderedDict from urllib import parse @@ -14,15 +16,15 @@ from django import forms from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.core.paginator import Page -from django.http.multipartparser import parse_header from django.template import engines, loader from django.urls import NoReverseMatch from django.utils.html import mark_safe +from django.utils.safestring import SafeString from rest_framework import VERSION, exceptions, serializers, status from rest_framework.compat import ( INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema, - pygments_css, yaml + parse_header_parameters, pygments_css, yaml ) from rest_framework.exceptions import ParseError from rest_framework.request import is_form_media_type, override_method @@ -72,12 +74,9 @@ class JSONRenderer(BaseRenderer): # If the media type looks like 'application/json; indent=4', # then pretty print the result. # Note that we coerce `indent=0` into `indent=None`. - base_media_type, params = parse_header(accepted_media_type.encode('ascii')) - try: + base_media_type, params = parse_header_parameters(accepted_media_type) + with contextlib.suppress(KeyError, ValueError, TypeError): return zero_as_none(max(min(int(params['indent']), 8), 0)) - except (KeyError, ValueError, TypeError): - pass - # If 'indent' is provided in the context, then pretty print the result. # E.g. If we're being called by the BrowsableAPIRenderer. return renderer_context.get('indent', None) @@ -105,7 +104,7 @@ class JSONRenderer(BaseRenderer): # We always fully escape \u2028 and \u2029 to ensure we output JSON # that is a strict javascript subset. - # See: http://timelessrepo.com/json-isnt-a-javascript-subset + # See: https://gist.github.com/damncabbage/623b879af56f850a6ddc ret = ret.replace('\u2028', '\\u2028').replace('\u2029', '\\u2029') return ret.encode() @@ -489,11 +488,8 @@ class BrowsableAPIRenderer(BaseRenderer): return if existing_serializer is not None: - try: + with contextlib.suppress(TypeError): return self.render_form_for_serializer(existing_serializer) - except TypeError: - pass - if has_serializer: if method in ('PUT', 'PATCH'): serializer = view.get_serializer(instance=instance, **kwargs) @@ -1035,13 +1031,16 @@ class CoreAPIJSONOpenAPIRenderer(_BaseOpenAPIRenderer): media_type = 'application/vnd.oai.openapi+json' charset = None format = 'openapi-json' + ensure_ascii = not api_settings.UNICODE_JSON def __init__(self): assert coreapi, 'Using CoreAPIJSONOpenAPIRenderer, but `coreapi` is not installed.' def render(self, data, media_type=None, renderer_context=None): structure = self.get_structure(data) - return json.dumps(structure, indent=4).encode('utf-8') + return json.dumps( + structure, indent=4, + ensure_ascii=self.ensure_ascii).encode('utf-8') class OpenAPIRenderer(BaseRenderer): @@ -1057,13 +1056,18 @@ class OpenAPIRenderer(BaseRenderer): class Dumper(yaml.Dumper): def ignore_aliases(self, data): return True + Dumper.add_representer(SafeString, Dumper.represent_str) return yaml.dump(data, default_flow_style=False, sort_keys=False, Dumper=Dumper).encode('utf-8') class JSONOpenAPIRenderer(BaseRenderer): media_type = 'application/vnd.oai.openapi+json' charset = None + encoder_class = encoders.JSONEncoder format = 'openapi-json' + ensure_ascii = not api_settings.UNICODE_JSON def render(self, data, media_type=None, renderer_context=None): - return json.dumps(data, indent=2).encode('utf-8') + return json.dumps( + data, cls=self.encoder_class, indent=2, + ensure_ascii=self.ensure_ascii).encode('utf-8') diff --git a/rest_framework/request.py b/rest_framework/request.py index 2a007cd2b..194be5f6d 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -14,11 +14,11 @@ from contextlib import contextmanager from django.conf import settings from django.http import HttpRequest, QueryDict -from django.http.multipartparser import parse_header from django.http.request import RawPostDataException from django.utils.datastructures import MultiValueDict -from rest_framework import HTTP_HEADER_ENCODING, exceptions +from rest_framework import exceptions +from rest_framework.compat import parse_header_parameters from rest_framework.settings import api_settings @@ -26,7 +26,7 @@ def is_form_media_type(media_type): """ Return True if the media type is a valid form media type. """ - base_media_type, params = parse_header(media_type.encode(HTTP_HEADER_ENCODING)) + base_media_type, params = parse_header_parameters(media_type) return (base_media_type == 'application/x-www-form-urlencoded' or base_media_type == 'multipart/form-data') @@ -316,7 +316,7 @@ class Request: 'application/x-www-form-urlencoded', 'multipart/form-data' ) - return any([parser.media_type in form_media for parser in self.parsers]) + return any(parser.media_type in form_media for parser in self.parsers) def _parse(self): """ @@ -413,7 +413,8 @@ class Request: to proxy it to the underlying HttpRequest object. """ try: - return getattr(self._request, attr) + _request = self.__getattribute__("_request") + return getattr(_request, attr) except AttributeError: return self.__getattribute__(attr) diff --git a/rest_framework/routers.py b/rest_framework/routers.py index e2afa573f..e0ae24b95 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -290,7 +290,7 @@ class APIRootView(views.APIView): args=args, kwargs=kwargs, request=request, - format=kwargs.get('format', None) + format=kwargs.get('format') ) except NoReverseMatch: # Don't bail out if eg. no list routes exist, only detail routes. diff --git a/rest_framework/schemas/coreapi.py b/rest_framework/schemas/coreapi.py index d8c6e55bb..570278cda 100644 --- a/rest_framework/schemas/coreapi.py +++ b/rest_framework/schemas/coreapi.py @@ -58,7 +58,7 @@ class LinkNode(OrderedDict): def __init__(self): self.links = [] self.methods_counter = Counter() - super(LinkNode, self).__init__() + super().__init__() def get_available_key(self, preferred_key): if preferred_key not in self: @@ -122,7 +122,7 @@ class SchemaGenerator(BaseSchemaGenerator): warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.15', RemovedInDRF315Warning) assert coreschema, '`coreschema` must be installed for schema support.' - super(SchemaGenerator, self).__init__(title, url, description, patterns, urlconf) + super().__init__(title, url, description, patterns, urlconf) self.coerce_method_names = api_settings.SCHEMA_COERCE_METHOD_NAMES def get_links(self, request=None): @@ -200,7 +200,11 @@ class SchemaGenerator(BaseSchemaGenerator): if is_custom_action(action): # Custom action, eg "/users/{pk}/activate/", "/users/active/" - if len(view.action_map) > 1: + mapped_methods = { + # Don't count head mapping, e.g. not part of the schema + method for method in view.action_map if method != 'head' + } + if len(mapped_methods) > 1: action = self.default_mapping[method.lower()] if action in self.coerce_method_names: action = self.coerce_method_names[action] @@ -348,9 +352,10 @@ class AutoSchema(ViewInspector): * `manual_fields`: list of `coreapi.Field` instances that will be added to auto-generated fields, overwriting on `Field.name` """ - super(AutoSchema, self).__init__() + super().__init__() if coreapi is not None: warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.15', RemovedInDRF315Warning) + if manual_fields is None: manual_fields = [] self._manual_fields = manual_fields @@ -591,9 +596,10 @@ class ManualSchema(ViewInspector): * `fields`: list of `coreapi.Field` instances. * `description`: String description for view. Optional. """ - super(ManualSchema, self).__init__() + super().__init__() if coreapi is not None: warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.15', RemovedInDRF315Warning) + assert all(isinstance(f, coreapi.Field) for f in fields), "`fields` must be a list of coreapi.Field instances" self._fields = fields self._description = description diff --git a/rest_framework/schemas/inspectors.py b/rest_framework/schemas/inspectors.py index 027472db1..cb880e79d 100644 --- a/rest_framework/schemas/inspectors.py +++ b/rest_framework/schemas/inspectors.py @@ -88,7 +88,7 @@ class ViewInspector: view.get_view_description()) def _get_description_section(self, view, header, description): - lines = [line for line in description.splitlines()] + lines = description.splitlines() current_section = '' sections = {'': ''} diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index 8a8e267e0..840f6977e 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -13,7 +13,7 @@ from django.db import models from django.utils.encoding import force_str from rest_framework import ( - RemovedInDRF314Warning, exceptions, renderers, serializers + RemovedInDRF315Warning, exceptions, renderers, serializers ) from rest_framework.compat import uritemplate from rest_framework.fields import _UnvalidatedField, empty @@ -192,15 +192,22 @@ class AutoSchema(ViewInspector): if method.lower() == 'delete': return {} - serializer = self.get_serializer(path, method) + request_serializer = self.get_request_serializer(path, method) + response_serializer = self.get_response_serializer(path, method) - if not isinstance(serializer, serializers.Serializer): - return {} + components = {} - component_name = self.get_component_name(serializer) + if isinstance(request_serializer, serializers.Serializer): + component_name = self.get_component_name(request_serializer) + content = self.map_serializer(request_serializer) + components.setdefault(component_name, content) - content = self.map_serializer(serializer) - return {component_name: content} + if isinstance(response_serializer, serializers.Serializer): + component_name = self.get_component_name(response_serializer) + content = self.map_serializer(response_serializer) + components.setdefault(component_name, content) + + return components def _to_camel_case(self, snake_str): components = snake_str.split('_') @@ -240,8 +247,10 @@ class AutoSchema(ViewInspector): if name.endswith(action.title()): # ListView, UpdateAPIView, ThingDelete ... name = name[:-len(action)] - if action == 'list' and not name.endswith('s'): # listThings instead of listThing - name += 's' + if action == 'list': + from inflection import pluralize + + name = pluralize(name) return name @@ -516,7 +525,7 @@ class AutoSchema(ViewInspector): continue if field.required: - required.append(field.field_name) + required.append(self.get_field_name(field)) schema = self.map_field(field) if field.read_only: @@ -531,7 +540,7 @@ class AutoSchema(ViewInspector): schema['description'] = str(field.help_text) self.map_field_validators(field, schema) - properties[field.field_name] = schema + properties[self.get_field_name(field)] = schema result = { 'type': 'object', @@ -582,6 +591,13 @@ class AutoSchema(ViewInspector): schema['maximum'] = int(digits * '9') + 1 schema['minimum'] = -schema['maximum'] + def get_field_name(self, field): + """ + Override this method if you want to change schema field name. + For example, convert snake_case field name to camelCase. + """ + return field.field_name + def get_paginator(self): pagination_class = getattr(self.view, 'pagination_class', None) if pagination_class: @@ -595,7 +611,7 @@ class AutoSchema(ViewInspector): media_types = [] for renderer in self.view.renderer_classes: # BrowsableAPIRenderer not relevant to OpenAPI spec - if renderer == renderers.BrowsableAPIRenderer: + if issubclass(renderer, renderers.BrowsableAPIRenderer): continue media_types.append(renderer.media_type) return media_types @@ -615,7 +631,21 @@ class AutoSchema(ViewInspector): .format(view.__class__.__name__, method, path)) return None - def _get_reference(self, serializer): + def get_request_serializer(self, path, method): + """ + Override this method if your view uses a different serializer for + handling request body. + """ + return self.get_serializer(path, method) + + def get_response_serializer(self, path, method): + """ + Override this method if your view uses a different serializer for + populating response data. + """ + return self.get_serializer(path, method) + + def get_reference(self, serializer): return {'$ref': '#/components/schemas/{}'.format(self.get_component_name(serializer))} def get_request_body(self, path, method): @@ -624,12 +654,12 @@ class AutoSchema(ViewInspector): self.request_media_types = self.map_parsers(path, method) - serializer = self.get_serializer(path, method) + serializer = self.get_request_serializer(path, method) if not isinstance(serializer, serializers.Serializer): item_schema = {} else: - item_schema = self._get_reference(serializer) + item_schema = self.get_reference(serializer) return { 'content': { @@ -648,12 +678,12 @@ class AutoSchema(ViewInspector): self.response_media_types = self.map_renderers(path, method) - serializer = self.get_serializer(path, method) + serializer = self.get_response_serializer(path, method) if not isinstance(serializer, serializers.Serializer): item_schema = {} else: - item_schema = self._get_reference(serializer) + item_schema = self.get_reference(serializer) if is_list_view(path, method, self.view): response_schema = { @@ -692,98 +722,10 @@ class AutoSchema(ViewInspector): return [path.split('/')[0].replace('_', '-')] - def _get_path_parameters(self, path, method): + def _get_reference(self, serializer): warnings.warn( - "Method `_get_path_parameters()` has been renamed to `get_path_parameters()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 + "Method `_get_reference()` has been renamed to `get_reference()`. " + "The old name will be removed in DRF v3.15.", + RemovedInDRF315Warning, stacklevel=2 ) - return self.get_path_parameters(path, method) - - def _get_filter_parameters(self, path, method): - warnings.warn( - "Method `_get_filter_parameters()` has been renamed to `get_filter_parameters()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_filter_parameters(path, method) - - def _get_responses(self, path, method): - warnings.warn( - "Method `_get_responses()` has been renamed to `get_responses()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_responses(path, method) - - def _get_request_body(self, path, method): - warnings.warn( - "Method `_get_request_body()` has been renamed to `get_request_body()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_request_body(path, method) - - def _get_serializer(self, path, method): - warnings.warn( - "Method `_get_serializer()` has been renamed to `get_serializer()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_serializer(path, method) - - def _get_paginator(self): - warnings.warn( - "Method `_get_paginator()` has been renamed to `get_paginator()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_paginator() - - def _map_field_validators(self, field, schema): - warnings.warn( - "Method `_map_field_validators()` has been renamed to `map_field_validators()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.map_field_validators(field, schema) - - def _map_serializer(self, serializer): - warnings.warn( - "Method `_map_serializer()` has been renamed to `map_serializer()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.map_serializer(serializer) - - def _map_field(self, field): - warnings.warn( - "Method `_map_field()` has been renamed to `map_field()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.map_field(field) - - def _map_choicefield(self, field): - warnings.warn( - "Method `_map_choicefield()` has been renamed to `map_choicefield()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.map_choicefield(field) - - def _get_pagination_parameters(self, path, method): - warnings.warn( - "Method `_get_pagination_parameters()` has been renamed to `get_pagination_parameters()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.get_pagination_parameters(path, method) - - def _allows_filters(self, path, method): - warnings.warn( - "Method `_allows_filters()` has been renamed to `allows_filters()`. " - "The old name will be removed in DRF v3.14.", - RemovedInDRF314Warning, stacklevel=2 - ) - return self.allows_filters(path, method) + return self.get_reference(serializer) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 49eec8259..eae6a0b2e 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -10,6 +10,8 @@ python primitives. 2. The process of marshalling between python primitives and request and response content is handled by parsers and renderers. """ + +import contextlib import copy import inspect import traceback @@ -52,7 +54,7 @@ from rest_framework.fields import ( # NOQA # isort:skip BooleanField, CharField, ChoiceField, DateField, DateTimeField, DecimalField, DictField, DurationField, EmailField, Field, FileField, FilePathField, FloatField, HiddenField, HStoreField, IPAddressField, ImageField, IntegerField, JSONField, - ListField, ModelField, MultipleChoiceField, NullBooleanField, ReadOnlyField, + ListField, ModelField, MultipleChoiceField, ReadOnlyField, RegexField, SerializerMethodField, SlugField, TimeField, URLField, UUIDField, ) from rest_framework.relations import ( # NOQA # isort:skip @@ -71,7 +73,8 @@ from rest_framework.relations import Hyperlink, PKOnlyObject # NOQA # isort:ski LIST_SERIALIZER_KWARGS = ( 'read_only', 'write_only', 'required', 'default', 'initial', 'source', 'label', 'help_text', 'style', 'error_messages', 'allow_empty', - 'instance', 'data', 'partial', 'context', 'allow_null' + 'instance', 'data', 'partial', 'context', 'allow_null', + 'max_length', 'min_length' ) ALL_FIELDS = '__all__' @@ -143,12 +146,18 @@ class BaseSerializer(Field): return CustomListSerializer(*args, **kwargs) """ allow_empty = kwargs.pop('allow_empty', None) + max_length = kwargs.pop('max_length', None) + min_length = kwargs.pop('min_length', None) child_serializer = cls(*args, **kwargs) list_kwargs = { 'child': child_serializer, } if allow_empty is not None: list_kwargs['allow_empty'] = allow_empty + if max_length is not None: + list_kwargs['max_length'] = max_length + if min_length is not None: + list_kwargs['min_length'] = min_length list_kwargs.update({ key: value for key, value in kwargs.items() if key in LIST_SERIALIZER_KWARGS @@ -209,7 +218,7 @@ class BaseSerializer(Field): return self.instance - def is_valid(self, raise_exception=False): + def is_valid(self, *, raise_exception=False): assert hasattr(self, 'initial_data'), ( 'Cannot call `.is_valid()` as no `data=` keyword argument was ' 'passed when instantiating the serializer instance.' @@ -568,12 +577,16 @@ class ListSerializer(BaseSerializer): default_error_messages = { 'not_a_list': _('Expected a list of items but got type "{input_type}".'), - 'empty': _('This list may not be empty.') + 'empty': _('This list may not be empty.'), + 'max_length': _('Ensure this field has no more than {max_length} elements.'), + 'min_length': _('Ensure this field has at least {min_length} elements.') } def __init__(self, *args, **kwargs): self.child = kwargs.pop('child', copy.deepcopy(self.child)) self.allow_empty = kwargs.pop('allow_empty', True) + self.max_length = kwargs.pop('max_length', None) + self.min_length = kwargs.pop('min_length', None) assert self.child is not None, '`child` is a required argument.' assert not inspect.isclass(self.child), '`child` has not been instantiated.' super().__init__(*args, **kwargs) @@ -635,6 +648,18 @@ class ListSerializer(BaseSerializer): api_settings.NON_FIELD_ERRORS_KEY: [message] }, code='empty') + if self.max_length is not None and len(data) > self.max_length: + message = self.error_messages['max_length'].format(max_length=self.max_length) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='max_length') + + if self.min_length is not None and len(data) < self.min_length: + message = self.error_messages['min_length'].format(min_length=self.min_length) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='min_length') + ret = [] errors = [] @@ -658,7 +683,7 @@ class ListSerializer(BaseSerializer): """ # Dealing with nested relationships, data can be a Manager, # so, first get a queryset from the Manager if needed - iterable = data.all() if isinstance(data, models.Manager) else data + iterable = data.all() if isinstance(data, models.manager.BaseManager) else data return [ self.child.to_representation(item) for item in iterable @@ -712,7 +737,7 @@ class ListSerializer(BaseSerializer): return self.instance - def is_valid(self, raise_exception=False): + def is_valid(self, *, raise_exception=False): # This implementation is the same as the default, # except that we use lists, rather than dicts, as the empty case. assert hasattr(self, 'initial_data'), ( @@ -1326,9 +1351,8 @@ class ModelSerializer(Serializer): """ if extra_kwargs.get('read_only', False): for attr in [ - 'required', 'default', 'allow_blank', 'allow_null', - 'min_length', 'max_length', 'min_value', 'max_value', - 'validators', 'queryset' + 'required', 'default', 'allow_blank', 'min_length', + 'max_length', 'min_value', 'max_value', 'validators', 'queryset' ]: kwargs.pop(attr, None) @@ -1474,12 +1498,10 @@ class ModelSerializer(Serializer): # they can't be nested attribute lookups. continue - try: + with contextlib.suppress(FieldDoesNotExist): field = model._meta.get_field(source) if isinstance(field, DjangoModelField): model_fields[source] = field - except FieldDoesNotExist: - pass return model_fields diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9eb4c5653..96b664574 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -19,7 +19,9 @@ REST framework settings, checking for user settings first, then falling back to the defaults. """ from django.conf import settings -from django.test.signals import setting_changed +# Import from `django.core.signals` instead of the official location +# `django.test.signals` to avoid importing the test module unnecessarily. +from django.core.signals import setting_changed from django.utils.module_loading import import_string from rest_framework import ISO_8601 diff --git a/rest_framework/static/rest_framework/css/bootstrap-theme.min.css b/rest_framework/static/rest_framework/css/bootstrap-theme.min.css index 30c85f627..2a69f48c7 100644 --- a/rest_framework/static/rest_framework/css/bootstrap-theme.min.css +++ b/rest_framework/static/rest_framework/css/bootstrap-theme.min.css @@ -1,6 +1,6 @@ /*! - * Bootstrap v3.4.0 (https://getbootstrap.com/) - * Copyright 2011-2018 Twitter, Inc. + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} /*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map b/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map new file mode 100644 index 000000000..5d75106e0 --- /dev/null +++ b/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;ACUA,YCWA,aDbA,UAFA,aACA,aAEA,aCkBE,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBF7CV,mBANA,mBACA,oBCWE,oBDRF,iBANA,iBAIA,oBANA,oBAOA,oBANA,oBAQA,oBANA,oBEmDE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBFpCV,qBAMA,sBCJE,sBDDF,uBAHA,mBAMA,oBARA,sBAMA,uBALA,sBAMA,uBAJA,sBAMA,uBAOA,+BALA,gCAGA,6BAFA,gCACA,gCAEA,gCEwBE,mBAAA,KACQ,WAAA,KFfV,mBCnCA,oBDiCA,iBAFA,oBACA,oBAEA,oBCXI,YAAA,KDgBJ,YCyBE,YAEE,iBAAA,KAKJ,aEvEI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QAyCA,YAAA,EAAA,IAAA,EAAA,KACA,aAAA,KDnBF,mBCrBE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDuBJ,oBCpBE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBD8BJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCdM,iBAAA,QACA,iBAAA,KAoBN,aE5EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDgEF,mBC9DE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDgEJ,oBC7DE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDuEJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCvDM,iBAAA,QACA,iBAAA,KAqBN,aE7EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDyGF,mBCvGE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDyGJ,oBCtGE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDgHJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCChGM,iBAAA,QACA,iBAAA,KAsBN,UE9EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDkJF,gBChJE,gBAEE,iBAAA,QACA,oBAAA,EAAA,MDkJJ,iBC/IE,iBAEE,iBAAA,QACA,aAAA,QAMA,mBDyJJ,0BANA,yBAGA,0BANA,yBAHA,yBAFA,oBAeA,2BANA,0BAGA,2BANA,0BAHA,0BAFA,6BAeA,oCANA,mCAGA,oCANA,mCAHA,mCCzIM,iBAAA,QACA,iBAAA,KAuBN,aE/EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QD2LF,mBCzLE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MD2LJ,oBCxLE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDkMJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCClLM,iBAAA,QACA,iBAAA,KAwBN,YEhFI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDoOF,kBClOE,kBAEE,iBAAA,QACA,oBAAA,EAAA,MDoOJ,mBCjOE,mBAEE,iBAAA,QACA,aAAA,QAMA,qBD2OJ,4BANA,2BAGA,4BANA,2BAHA,2BAFA,sBAeA,6BANA,4BAGA,6BANA,4BAHA,4BAFA,+BAeA,sCANA,qCAGA,sCANA,qCAHA,qCC3NM,iBAAA,QACA,iBAAA,KD2ON,eC5MA,WCtCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBFsPV,0BCvMA,0BEjGI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgGF,iBAAA,QAEF,yBD6MA,+BADA,+BGlTI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsGF,iBAAA,QASF,gBEnHI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHqIA,cAAA,ICrEA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBFuRV,sCCtNA,oCEnHI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD8EV,cDoNA,iBClNE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEtII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHwJA,cAAA,IDyNF,sCC5NA,oCEtII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDoFV,8BDuOA,iCC3NI,YAAA,EAAA,KAAA,EAAA,gBDgOJ,qBADA,kBC1NA,mBAGE,cAAA,EAIF,yBAEI,mDDwNF,yDADA,yDCpNI,MAAA,KEnKF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UF2KJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC/HA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBD0IV,eE5LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAKF,YE7LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAMF,eE9LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAOF,cE/LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAeF,UEvMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6MJ,cEjNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8MJ,sBElNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,mBEnNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgNJ,sBEpNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiNJ,qBErNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFqNJ,sBExLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKF+LJ,YACE,cAAA,IClLA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDoLV,wBDiQA,8BADA,8BC7PE,YAAA,EAAA,KAAA,EAAA,QEzOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuOF,aAAA,QALF,+BD6QA,qCADA,qCCpQI,YAAA,KAUJ,OCvME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBDgNV,8BElQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+PJ,8BEnQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgQJ,8BEpQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiQJ,2BErQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFkQJ,8BEtQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFmQJ,6BEvQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0QJ,ME9QI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4QF,aAAA,QC/NA,mBAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/rest_framework/static/rest_framework/css/bootstrap.min.css b/rest_framework/static/rest_framework/css/bootstrap.min.css index 7f3562ec2..5b96335ff 100644 --- a/rest_framework/static/rest_framework/css/bootstrap.min.css +++ b/rest_framework/static/rest_framework/css/bootstrap.min.css @@ -1,6 +1,6 @@ /*! - * Bootstrap v3.4.0 (https://getbootstrap.com/) - * Copyright 2011-2018 Twitter, Inc. + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 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;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,: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/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:"\002a"}.glyphicon-plus:before{content:"\002b"}.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: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{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;display:inline-block;max-width:100%;height:auto}.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;list-style:none;margin-left:-5px}.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;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.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}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.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}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}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>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;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}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}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: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,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;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,-webkit-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::-ms-expand{background-color:transparent;border:0}.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}@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.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.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.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.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:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{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);opacity:.65;-webkit-box-shadow:none;box-shadow:none}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;background-image:none;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.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,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;background-image:none;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.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,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;background-image:none;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.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,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;background-image:none;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.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,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;background-image:none;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.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,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;background-image:none;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.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,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-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.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;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-left-radius:4px;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-right-radius:4px;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 .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height: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;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);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.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}}@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}.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-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-right:15px;margin-top:8px;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-right:-15px;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);margin-top:8px;margin-bottom:8px}@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-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-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-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-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-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-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>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#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>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;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{padding-right:15px;padding-left:15px;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}.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}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-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{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.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-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.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{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-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;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;font-size:12px;filter:alpha(opacity=0);opacity:0}.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.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}.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}.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-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;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;font-size:14px;background-color:#fff;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)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.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}.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}.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:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-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{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);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;outline:0;filter:alpha(opacity=90);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:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{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,.modal-header:after,.modal-header: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,.modal-header: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}} /*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/rest_framework/static/rest_framework/css/bootstrap.min.css.map b/rest_framework/static/rest_framework/css/bootstrap.min.css.map new file mode 100644 index 000000000..0ae3de508 --- /dev/null +++ b/rest_framework/static/rest_framework/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","dist/css/bootstrap.css","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;AAKA,4ECKA,KACE,YAAA,WACA,qBAAA,KACA,yBAAA,KAOF,KACE,OAAA,EAaF,QCnBA,MACA,QACA,WACA,OACA,OACA,OACA,OACA,KACA,KACA,IACA,QACA,QDqBE,QAAA,MAQF,MCzBA,OACA,SACA,MD2BE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SCrCA,SDuCE,QAAA,KAUF,EACE,iBAAA,YAQF,SCnDA,QDqDE,QAAA,EAWF,YACE,cAAA,KACA,gBAAA,UACA,wBAAA,UAAA,OAAA,qBAAA,UAAA,OAAA,gBAAA,UAAA,OAOF,EC/DA,ODiEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,UAAA,IACA,OAAA,MAAA,EAOF,KACE,WAAA,KACA,MAAA,KAOF,MACE,UAAA,IAOF,ICzFA,ID2FE,UAAA,IACA,YAAA,EACA,SAAA,SACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,mBAAA,YAAA,gBAAA,YAAA,WAAA,YACA,OAAA,EAOF,IACE,SAAA,KAOF,KC7HA,IACA,IACA,KD+HE,YAAA,SAAA,CAAA,UACA,UAAA,IAkBF,OC7IA,MACA,SACA,OACA,SD+IE,MAAA,QACA,KAAA,QACA,OAAA,EAOF,OACE,SAAA,QAUF,OC1JA,OD4JE,eAAA,KAWF,OCnKA,wBACA,kBACA,mBDqKE,mBAAA,OACA,OAAA,QAOF,iBCxKA,qBD0KE,OAAA,QAOF,yBC7KA,wBD+KE,OAAA,EACA,QAAA,EAQF,MACE,YAAA,OAWF,qBC5LA,kBD8LE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CCjMA,8CDmME,OAAA,KAQF,mBACE,mBAAA,UACA,mBAAA,YAAA,gBAAA,YAAA,WAAA,YASF,iDC5MA,8CD8ME,mBAAA,KAOF,SACE,OAAA,IAAA,MAAA,OACA,OAAA,EAAA,IACA,QAAA,MAAA,OAAA,MAQF,OACE,OAAA,EACA,QAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,gBAAA,SACA,eAAA,EAGF,GC3OA,GD6OE,QAAA,EDlPF,qFGhLA,aACE,ED2LA,OADA,QCvLE,MAAA,eACA,YAAA,eACA,WAAA,cACA,mBAAA,eAAA,WAAA,eAGF,ED0LA,UCxLE,gBAAA,UAGF,cACE,QAAA,KAAA,WAAA,IAGF,kBACE,QAAA,KAAA,YAAA,IAKF,mBDqLA,6BCnLE,QAAA,GDuLF,WCpLA,IAEE,OAAA,IAAA,MAAA,KACA,kBAAA,MAGF,MACE,QAAA,mBDqLF,IClLA,GAEE,kBAAA,MAGF,IACE,UAAA,eDmLF,GACA,GCjLA,EAGE,QAAA,EACA,OAAA,EAGF,GD+KA,GC7KE,iBAAA,MAMF,QACE,QAAA,KAEF,YD2KA,oBCxKI,iBAAA,eAGJ,OACE,OAAA,IAAA,MAAA,KAGF,OACE,gBAAA,mBADF,UD2KA,UCtKI,iBAAA,eD0KJ,mBCvKA,mBAGI,OAAA,IAAA,MAAA,gBCrFN,WACE,YAAA,uBACA,IAAA,+CACA,IAAA,sDAAA,2BAAA,CAAA,iDAAA,eAAA,CAAA,gDAAA,cAAA,CAAA,+CAAA,kBAAA,CAAA,2EAAA,cAQF,WACE,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EACA,uBAAA,YACA,wBAAA,UAIkC,2BAAW,QAAA,QACX,uBAAW,QAAA,QF2P/C,sBEzPoC,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QASX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QCxS/C,ECkEE,mBAAA,WACG,gBAAA,WACK,WAAA,WJo+BV,OGriCA,QC+DE,mBAAA,WACG,gBAAA,WACK,WAAA,WDzDV,KACE,UAAA,KACA,4BAAA,cAGF,KACE,YAAA,gBAAA,CAAA,SAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,iBAAA,KHoiCF,OGhiCA,MHiiCA,OACA,SG9hCE,YAAA,QACA,UAAA,QACA,YAAA,QAMF,EACE,MAAA,QACA,gBAAA,KH8hCF,QG5hCE,QAEE,MAAA,QACA,gBAAA,UAGF,QEnDA,QAAA,IAAA,KAAA,yBACA,eAAA,KF6DF,OACE,OAAA,EAMF,IACE,eAAA,OHqhCF,4BADA,0BGhhCA,gBH+gCA,iBADA,eMxlCE,QAAA,MACA,UAAA,KACA,OAAA,KH6EF,aACE,cAAA,IAMF,eACE,QAAA,IACA,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,cAAA,IC+FA,mBAAA,IAAA,IAAA,YACK,cAAA,IAAA,IAAA,YACG,WAAA,IAAA,IAAA,YE5LR,QAAA,aACA,UAAA,KACA,OAAA,KHiGF,YACE,cAAA,IAMF,GACE,WAAA,KACA,cAAA,KACA,OAAA,EACA,WAAA,IAAA,MAAA,KAQF,SACE,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EACA,OAAA,KACA,SAAA,OACA,KAAA,cACA,OAAA,EAQA,0BH8/BF,yBG5/BI,SAAA,OACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,SAAA,QACA,KAAA,KAWJ,cACE,OAAA,QH4/BF,IACA,IACA,IACA,IACA,IACA,IOtpCA,GP4oCA,GACA,GACA,GACA,GACA,GO9oCE,YAAA,QACA,YAAA,IACA,YAAA,IACA,MAAA,QPyqCF,WAZA,UAaA,WAZA,UAaA,WAZA,UAaA,WAZA,UAaA,WAZA,UAaA,WAZA,UACA,UOxqCA,SPyqCA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SOxpCI,YAAA,IACA,YAAA,EACA,MAAA,KP8qCJ,IAEA,IAEA,IO9qCA,GP2qCA,GAEA,GO1qCE,WAAA,KACA,cAAA,KPqrCF,WANA,UAQA,WANA,UAQA,WANA,UACA,UOxrCA,SP0rCA,UANA,SAQA,UANA,SO9qCI,UAAA,IPyrCJ,IAEA,IAEA,IO1rCA,GPurCA,GAEA,GOtrCE,WAAA,KACA,cAAA,KPisCF,WANA,UAQA,WANA,UAQA,WANA,UACA,UOpsCA,SPssCA,UANA,SAQA,UANA,SO1rCI,UAAA,IPqsCJ,IOjsCA,GAAU,UAAA,KPqsCV,IOpsCA,GAAU,UAAA,KPwsCV,IOvsCA,GAAU,UAAA,KP2sCV,IO1sCA,GAAU,UAAA,KP8sCV,IO7sCA,GAAU,UAAA,KPitCV,IOhtCA,GAAU,UAAA,KAMV,EACE,OAAA,EAAA,EAAA,KAGF,MACE,cAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,IAEA,yBAAA,MACE,UAAA,MPitCJ,OOxsCA,MAEE,UAAA,IP0sCF,MOvsCA,KAEE,QAAA,KACA,iBAAA,QAIF,WAAuB,WAAA,KACvB,YAAuB,WAAA,MACvB,aAAuB,WAAA,OACvB,cAAuB,WAAA,QACvB,aAAuB,YAAA,OAGvB,gBAAuB,eAAA,UACvB,gBAAuB,eAAA,UACvB,iBAAuB,eAAA,WAGvB,YACE,MAAA,KAEF,cCvGE,MAAA,QR2zCF,qBQ1zCE,qBAEE,MAAA,QDuGJ,cC1GE,MAAA,QRk0CF,qBQj0CE,qBAEE,MAAA,QD0GJ,WC7GE,MAAA,QRy0CF,kBQx0CE,kBAEE,MAAA,QD6GJ,cChHE,MAAA,QRg1CF,qBQ/0CE,qBAEE,MAAA,QDgHJ,aCnHE,MAAA,QRu1CF,oBQt1CE,oBAEE,MAAA,QDuHJ,YAGE,MAAA,KE7HA,iBAAA,QT+1CF,mBS91CE,mBAEE,iBAAA,QF6HJ,YEhIE,iBAAA,QTs2CF,mBSr2CE,mBAEE,iBAAA,QFgIJ,SEnIE,iBAAA,QT62CF,gBS52CE,gBAEE,iBAAA,QFmIJ,YEtIE,iBAAA,QTo3CF,mBSn3CE,mBAEE,iBAAA,QFsIJ,WEzIE,iBAAA,QT23CF,kBS13CE,kBAEE,iBAAA,QF8IJ,aACE,eAAA,IACA,OAAA,KAAA,EAAA,KACA,cAAA,IAAA,MAAA,KPgvCF,GOxuCA,GAEE,WAAA,EACA,cAAA,KP4uCF,MAFA,MACA,MO9uCA,MAMI,cAAA,EAOJ,eACE,aAAA,EACA,WAAA,KAIF,aALE,aAAA,EACA,WAAA,KAMA,YAAA,KAFF,gBAKI,QAAA,aACA,cAAA,IACA,aAAA,IAKJ,GACE,WAAA,EACA,cAAA,KPouCF,GOluCA,GAEE,YAAA,WAEF,GACE,YAAA,IAEF,GACE,YAAA,EAaA,yBAAA,kBAEI,MAAA,KACA,MAAA,MACA,MAAA,KACA,WAAA,MGxNJ,SAAA,OACA,cAAA,SACA,YAAA,OHiNA,kBASI,YAAA,OP4tCN,0BOjtCA,YAEE,OAAA,KAGF,YACE,UAAA,IA9IqB,eAAA,UAmJvB,WACE,QAAA,KAAA,KACA,OAAA,EAAA,EAAA,KACA,UAAA,OACA,YAAA,IAAA,MAAA,KPitCF,yBO5sCI,wBP2sCJ,yBO1sCM,cAAA,EPgtCN,kBO1tCA,kBPytCA,iBOtsCI,QAAA,MACA,UAAA,IACA,YAAA,WACA,MAAA,KP4sCJ,yBO1sCI,yBPysCJ,wBOxsCM,QAAA,cAQN,oBPqsCA,sBOnsCE,cAAA,KACA,aAAA,EACA,WAAA,MACA,aAAA,IAAA,MAAA,KACA,YAAA,EP0sCF,kCOpsCI,kCPksCJ,iCAGA,oCAJA,oCAEA,mCOnsCe,QAAA,GP4sCf,iCO3sCI,iCPysCJ,gCAGA,mCAJA,mCAEA,kCOzsCM,QAAA,cAMN,QACE,cAAA,KACA,WAAA,OACA,YAAA,WIxSF,KXm/CA,IACA,IACA,KWj/CE,YAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,aAAA,CAAA,UAIF,KACE,QAAA,IAAA,IACA,UAAA,IACA,MAAA,QACA,iBAAA,QACA,cAAA,IAIF,IACE,QAAA,IAAA,IACA,UAAA,IACA,MAAA,KACA,iBAAA,KACA,cAAA,IACA,mBAAA,MAAA,EAAA,KAAA,EAAA,gBAAA,WAAA,MAAA,EAAA,KAAA,EAAA,gBANF,QASI,QAAA,EACA,UAAA,KACA,YAAA,IACA,mBAAA,KAAA,WAAA,KAKJ,IACE,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UACA,UAAA,WACA,iBAAA,QACA,OAAA,IAAA,MAAA,KACA,cAAA,IAXF,SAeI,QAAA,EACA,UAAA,QACA,MAAA,QACA,YAAA,SACA,iBAAA,YACA,cAAA,EAKJ,gBACE,WAAA,MACA,WAAA,OC1DF,WCHE,cAAA,KACA,aAAA,KACA,aAAA,KACA,YAAA,KDGA,yBAAA,WACE,MAAA,OAEF,yBAAA,WACE,MAAA,OAEF,0BAAA,WACE,MAAA,QAUJ,iBCvBE,cAAA,KACA,aAAA,KACA,aAAA,KACA,YAAA,KD6BF,KCvBE,aAAA,MACA,YAAA,MD0BF,gBACE,aAAA,EACA,YAAA,EAFF,8BAKI,cAAA,EACA,aAAA,EZwiDJ,UAoCA,WAIA,WAIA,WAxCA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAjCA,UAoCA,WAIA,WAIA,WAxCA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAjCA,UAoCA,WAIA,WAIA,WAxCA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UatnDC,UbynDD,WAIA,WAIA,WAxCA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UAIA,UcpmDM,SAAA,SAEA,WAAA,IAEA,cAAA,KACA,aAAA,KDtBL,UbmpDD,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,Uc3mDM,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,EFCJ,yBCzEC,Ub2zDC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcnxDI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFUJ,yBClFC,Ubo+DC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,Uc57DI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFmBJ,0BC3FC,Ub6oEC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcrmEI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GCjEJ,MACE,iBAAA,YADF,uBAQI,SAAA,OACA,QAAA,aACA,MAAA,KAKA,sBf+xEJ,sBe9xEM,SAAA,OACA,QAAA,WACA,MAAA,KAKN,QACE,YAAA,IACA,eAAA,IACA,MAAA,KACA,WAAA,KAGF,GACE,WAAA,KAMF,OACE,MAAA,KACA,UAAA,KACA,cAAA,Kf6xEF,mBAHA,mBAIA,mBAHA,mBACA,mBe/xEA,mBAWQ,QAAA,IACA,YAAA,WACA,eAAA,IACA,WAAA,IAAA,MAAA,KAdR,mBAoBI,eAAA,OACA,cAAA,IAAA,MAAA,KfyxEJ,uCe9yEA,uCf+yEA,wCAHA,wCAIA,2CAHA,2Ce/wEQ,WAAA,EA9BR,mBAoCI,WAAA,IAAA,MAAA,KApCJ,cAyCI,iBAAA,KfoxEJ,6BAHA,6BAIA,6BAHA,6BACA,6Be5wEA,6BAOQ,QAAA,IAWR,gBACE,OAAA,IAAA,MAAA,KfqwEF,4BAHA,4BAIA,4BAHA,4BACA,4BerwEA,4BAQQ,OAAA,IAAA,MAAA,KfmwER,4Be3wEA,4BAeM,oBAAA,IAUN,yCAEI,iBAAA,QASJ,4BAEI,iBAAA,QfqvEJ,0BAGA,0BATA,0BAGA,0BAIA,0BAGA,0BATA,0BAGA,0BACA,0BAGA,0BgBt4EE,0BhBg4EF,0BgBz3EM,iBAAA,QhBs4EN,sCAEA,sCADA,oCgBj4EE,sChB+3EF,sCgBz3EM,iBAAA,QhBs4EN,2BAGA,2BATA,2BAGA,2BAIA,2BAGA,2BATA,2BAGA,2BACA,2BAGA,2BgB35EE,2BhBq5EF,2BgB94EM,iBAAA,QhB25EN,uCAEA,uCADA,qCgBt5EE,uChBo5EF,uCgB94EM,iBAAA,QhB25EN,wBAGA,wBATA,wBAGA,wBAIA,wBAGA,wBATA,wBAGA,wBACA,wBAGA,wBgBh7EE,wBhB06EF,wBgBn6EM,iBAAA,QhBg7EN,oCAEA,oCADA,kCgB36EE,oChBy6EF,oCgBn6EM,iBAAA,QhBg7EN,2BAGA,2BATA,2BAGA,2BAIA,2BAGA,2BATA,2BAGA,2BACA,2BAGA,2BgBr8EE,2BhB+7EF,2BgBx7EM,iBAAA,QhBq8EN,uCAEA,uCADA,qCgBh8EE,uChB87EF,uCgBx7EM,iBAAA,QhBq8EN,0BAGA,0BATA,0BAGA,0BAIA,0BAGA,0BATA,0BAGA,0BACA,0BAGA,0BgB19EE,0BhBo9EF,0BgB78EM,iBAAA,QhB09EN,sCAEA,sCADA,oCgBr9EE,sChBm9EF,sCgB78EM,iBAAA,QDoJN,kBACE,WAAA,KACA,WAAA,KAEA,oCAAA,kBACE,MAAA,KACA,cAAA,KACA,WAAA,OACA,mBAAA,yBACA,OAAA,IAAA,MAAA,KALF,yBASI,cAAA,Efq0EJ,qCAHA,qCAIA,qCAHA,qCACA,qCe70EA,qCAkBU,YAAA,OAlBV,kCA0BI,OAAA,Ef+zEJ,0DAHA,0DAIA,0DAHA,0DACA,0Dex1EA,0DAmCU,YAAA,Ef8zEV,yDAHA,yDAIA,yDAHA,yDACA,yDeh2EA,yDAuCU,aAAA,Efg0EV,yDev2EA,yDfw2EA,yDAFA,yDelzEU,cAAA,GEzNZ,SAIE,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EAGF,OACE,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KACA,YAAA,QACA,MAAA,KACA,OAAA,EACA,cAAA,IAAA,MAAA,QAGF,MACE,QAAA,aACA,UAAA,KACA,cAAA,IACA,YAAA,IAUF,mBb6BE,mBAAA,WACG,gBAAA,WACK,WAAA,WarBR,mBAAA,KACA,gBAAA,KAAA,WAAA,KjBkgFF,qBiB9/EA,kBAEE,OAAA,IAAA,EAAA,EACA,WAAA,MACA,YAAA,OjBogFF,wCADA,qCADA,8BAFA,+BACA,2BiB3/EE,4BAGE,OAAA,YAIJ,iBACE,QAAA,MAIF,kBACE,QAAA,MACA,MAAA,KAIF,iBjBu/EA,aiBr/EE,OAAA,KjB0/EF,2BiBt/EA,uBjBq/EA,wBK/kFE,QAAA,IAAA,KAAA,yBACA,eAAA,KYgGF,OACE,QAAA,MACA,YAAA,IACA,UAAA,KACA,YAAA,WACA,MAAA,KA0BF,cACE,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,iBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,cAAA,Ib3EA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBAyHR,mBAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KACK,cAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KACG,mBAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,Kc1IR,oBACE,aAAA,QACA,QAAA,EdYF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,qBAiCR,gCACE,MAAA,KACA,QAAA,EAEF,oCAA0B,MAAA,KAC1B,yCAAgC,MAAA,Ka+ChC,0BACE,iBAAA,YACA,OAAA,EAQF,wBjBq+EF,wBACA,iCiBn+EI,iBAAA,KACA,QAAA,EAGF,wBjBo+EF,iCiBl+EI,OAAA,YAIF,sBACE,OAAA,KAcJ,qDAKI,8BjBm9EF,wCACA,+BAFA,8BiBj9EI,YAAA,KjB09EJ,iCAEA,2CACA,kCAFA,iCiBx9EE,0BjBq9EF,oCACA,2BAFA,0BiBl9EI,YAAA,KjB+9EJ,iCAEA,2CACA,kCAFA,iCiB79EE,0BjB09EF,oCACA,2BAFA,0BiBv9EI,YAAA,MAWN,YACE,cAAA,KjBy9EF,UiBj9EA,OAEE,SAAA,SACA,QAAA,MACA,WAAA,KACA,cAAA,KjBm9EF,yBiBh9EE,sBjBk9EF,mCADA,gCiB98EM,OAAA,YjBm9EN,gBiB99EA,aAgBI,WAAA,KACA,aAAA,KACA,cAAA,EACA,YAAA,IACA,OAAA,QjBm9EJ,+BACA,sCiBj9EA,yBjB+8EA,gCiB38EE,SAAA,SACA,WAAA,MACA,YAAA,MjBi9EF,oBiB98EA,cAEE,WAAA,KjBg9EF,iBiB58EA,cAEE,SAAA,SACA,QAAA,aACA,aAAA,KACA,cAAA,EACA,YAAA,IACA,eAAA,OACA,OAAA,QjB88EF,0BiB38EE,uBjB68EF,oCADA,iCiB18EI,OAAA,YjB+8EJ,kCiB58EA,4BAEE,WAAA,EACA,YAAA,KASF,qBACE,WAAA,KAEA,YAAA,IACA,eAAA,IAEA,cAAA,EAEA,8BjBm8EF,8BiBj8EI,cAAA,EACA,aAAA,EAaJ,UC3PE,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,cAAA,IAEA,gBACE,OAAA,KACA,YAAA,KlBsrFJ,0BkBnrFE,kBAEE,OAAA,KDiPJ,6BAEI,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,cAAA,IANJ,mCASI,OAAA,KACA,YAAA,KjBq8EJ,6CiB/8EA,qCAcI,OAAA,KAdJ,oCAiBI,OAAA,KACA,WAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IAIJ,UCvRE,OAAA,KACA,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UACA,cAAA,IAEA,gBACE,OAAA,KACA,YAAA,KlB2tFJ,0BkBxtFE,kBAEE,OAAA,KD6QJ,6BAEI,OAAA,KACA,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UACA,cAAA,IANJ,mCASI,OAAA,KACA,YAAA,KjB88EJ,6CiBx9EA,qCAcI,OAAA,KAdJ,oCAiBI,OAAA,KACA,WAAA,KACA,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UASJ,cAEE,SAAA,SAFF,4BAMI,cAAA,OAIJ,uBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,YAAA,KACA,WAAA,OACA,eAAA,KjBo8EF,oDADA,uCiBj8EA,iCAGE,MAAA,KACA,OAAA,KACA,YAAA,KjBo8EF,oDADA,uCiBj8EA,iCAGE,MAAA,KACA,OAAA,KACA,YAAA,KjBq8EF,uBAEA,8BAJA,4BiB/7EA,yBjBg8EA,oBAEA,2BAGA,4BAEA,mCAHA,yBAEA,gCkBx1FI,MAAA,QDkZJ,2BC9YI,aAAA,QdiDF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBchDN,iCACE,aAAA,Qd8CJ,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,QACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,Qa4VV,gCCpYI,MAAA,QACA,iBAAA,QACA,aAAA,QDkYJ,oCC9XI,MAAA,QlB61FJ,uBAEA,8BAJA,4BiB19EA,yBjB29EA,oBAEA,2BAGA,4BAEA,mCAHA,yBAEA,gCkBt3FI,MAAA,QDqZJ,2BCjZI,aAAA,QdiDF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBchDN,iCACE,aAAA,Qd8CJ,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,QACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,Qa+VV,gCCvYI,MAAA,QACA,iBAAA,QACA,aAAA,QDqYJ,oCCjYI,MAAA,QlB23FJ,qBAEA,4BAJA,0BiBr/EA,uBjBs/EA,kBAEA,yBAGA,0BAEA,iCAHA,uBAEA,8BkBp5FI,MAAA,QDwZJ,yBCpZI,aAAA,QdiDF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBchDN,+BACE,aAAA,Qd8CJ,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,QACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,QakWV,8BC1YI,MAAA,QACA,iBAAA,QACA,aAAA,QDwYJ,kCCpYI,MAAA,QD2YF,2CACE,IAAA,KAEF,mDACE,IAAA,EAUJ,YACE,QAAA,MACA,WAAA,IACA,cAAA,KACA,MAAA,QAkBA,yBAAA,yBAGI,QAAA,aACA,cAAA,EACA,eAAA,OALJ,2BAUI,QAAA,aACA,MAAA,KACA,eAAA,OAZJ,kCAiBI,QAAA,aAjBJ,0BAqBI,QAAA,aACA,eAAA,OjBi/EJ,wCiBvgFA,6CjBsgFA,2CiB3+EM,MAAA,KA3BN,wCAiCI,MAAA,KAjCJ,4BAqCI,cAAA,EACA,eAAA,OjB4+EJ,uBiBlhFA,oBA6CI,QAAA,aACA,WAAA,EACA,cAAA,EACA,eAAA,OjBy+EJ,6BiBzhFA,0BAmDM,aAAA,EjB0+EN,4CiB7hFA,sCAwDI,SAAA,SACA,YAAA,EAzDJ,kDA8DI,IAAA,GjBw+EN,2BAEA,kCiB/9EA,wBjB89EA,+BiBr9EI,YAAA,IACA,WAAA,EACA,cAAA,EjB09EJ,2BiBr+EA,wBAiBI,WAAA,KAjBJ,6BJ9gBE,aAAA,MACA,YAAA,MIwiBA,yBAAA,gCAEI,YAAA,IACA,cAAA,EACA,WAAA,OA/BN,sDAwCI,MAAA,KAQA,yBAAA,+CAEI,YAAA,KACA,UAAA,MAKJ,yBAAA,+CAEI,YAAA,IACA,UAAA,ME9kBR,KACE,QAAA,aACA,cAAA,EACA,YAAA,IACA,WAAA,OACA,YAAA,OACA,eAAA,OACA,iBAAA,aAAA,aAAA,aACA,OAAA,QACA,iBAAA,KACA,OAAA,IAAA,MAAA,YCoCA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,cAAA,IhBqKA,oBAAA,KACG,iBAAA,KACC,gBAAA,KACI,YAAA,KJs1FV,kBAHA,kBACA,WACA,kBAHA,kBmB1hGI,WdrBF,QAAA,IAAA,KAAA,yBACA,eAAA,KLwjGF,WADA,WmB7hGE,WAGE,MAAA,KACA,gBAAA,KnB+hGJ,YmB5hGE,YAEE,iBAAA,KACA,QAAA,Ef2BF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBexBR,cnB4hGF,eACA,wBmB1hGI,OAAA,YE9CF,OAAA,kBACA,QAAA,IjBiEA,mBAAA,KACQ,WAAA,KefN,enB4hGJ,yBmB1hGM,eAAA,KASN,aC7DE,MAAA,KACA,iBAAA,KACA,aAAA,KpBqlGF,mBoBnlGE,mBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpBqlGJ,oBoBnlGE,oBpBolGF,mCoBjlGI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpB2lGJ,0BAHA,0BAHA,0BAKA,0BAHA,0BoBrlGI,0BpB0lGJ,yCAHA,yCAHA,yCoBjlGM,MAAA,KACA,iBAAA,QACA,aAAA,QpBgmGN,4BAHA,4BoBvlGI,4BpB2lGJ,6BAHA,6BAHA,6BAOA,sCAHA,sCAHA,sCoBnlGM,iBAAA,KACA,aAAA,KDuBN,oBClBI,MAAA,KACA,iBAAA,KDoBJ,aChEE,MAAA,KACA,iBAAA,QACA,aAAA,QpB0oGF,mBoBxoGE,mBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpB0oGJ,oBoBxoGE,oBpByoGF,mCoBtoGI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpBgpGJ,0BAHA,0BAHA,0BAKA,0BAHA,0BoB1oGI,0BpB+oGJ,yCAHA,yCAHA,yCoBtoGM,MAAA,KACA,iBAAA,QACA,aAAA,QpBqpGN,4BAHA,4BoB5oGI,4BpBgpGJ,6BAHA,6BAHA,6BAOA,sCAHA,sCAHA,sCoBxoGM,iBAAA,QACA,aAAA,QD0BN,oBCrBI,MAAA,QACA,iBAAA,KDwBJ,aCpEE,MAAA,KACA,iBAAA,QACA,aAAA,QpB+rGF,mBoB7rGE,mBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpB+rGJ,oBoB7rGE,oBpB8rGF,mCoB3rGI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpBqsGJ,0BAHA,0BAHA,0BAKA,0BAHA,0BoB/rGI,0BpBosGJ,yCAHA,yCAHA,yCoB3rGM,MAAA,KACA,iBAAA,QACA,aAAA,QpB0sGN,4BAHA,4BoBjsGI,4BpBqsGJ,6BAHA,6BAHA,6BAOA,sCAHA,sCAHA,sCoB7rGM,iBAAA,QACA,aAAA,QD8BN,oBCzBI,MAAA,QACA,iBAAA,KD4BJ,UCxEE,MAAA,KACA,iBAAA,QACA,aAAA,QpBovGF,gBoBlvGE,gBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,gBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpBovGJ,iBoBlvGE,iBpBmvGF,gCoBhvGI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpB0vGJ,uBAHA,uBAHA,uBAKA,uBAHA,uBoBpvGI,uBpByvGJ,sCAHA,sCAHA,sCoBhvGM,MAAA,KACA,iBAAA,QACA,aAAA,QpB+vGN,yBAHA,yBoBtvGI,yBpB0vGJ,0BAHA,0BAHA,0BAOA,mCAHA,mCAHA,mCoBlvGM,iBAAA,QACA,aAAA,QDkCN,iBC7BI,MAAA,QACA,iBAAA,KDgCJ,aC5EE,MAAA,KACA,iBAAA,QACA,aAAA,QpByyGF,mBoBvyGE,mBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpByyGJ,oBoBvyGE,oBpBwyGF,mCoBryGI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpB+yGJ,0BAHA,0BAHA,0BAKA,0BAHA,0BoBzyGI,0BpB8yGJ,yCAHA,yCAHA,yCoBryGM,MAAA,KACA,iBAAA,QACA,aAAA,QpBozGN,4BAHA,4BoB3yGI,4BpB+yGJ,6BAHA,6BAHA,6BAOA,sCAHA,sCAHA,sCoBvyGM,iBAAA,QACA,aAAA,QDsCN,oBCjCI,MAAA,QACA,iBAAA,KDoCJ,YChFE,MAAA,KACA,iBAAA,QACA,aAAA,QpB81GF,kBoB51GE,kBAEE,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,kBACE,MAAA,KACA,iBAAA,QACA,aAAA,QpB81GJ,mBoB51GE,mBpB61GF,kCoB11GI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QpBo2GJ,yBAHA,yBAHA,yBAKA,yBAHA,yBoB91GI,yBpBm2GJ,wCAHA,wCAHA,wCoB11GM,MAAA,KACA,iBAAA,QACA,aAAA,QpBy2GN,2BAHA,2BoBh2GI,2BpBo2GJ,4BAHA,4BAHA,4BAOA,qCAHA,qCAHA,qCoB51GM,iBAAA,QACA,aAAA,QD0CN,mBCrCI,MAAA,QACA,iBAAA,KD6CJ,UACE,YAAA,IACA,MAAA,QACA,cAAA,EAEA,UnBwzGF,iBADA,iBAEA,oBACA,6BmBrzGI,iBAAA,YfnCF,mBAAA,KACQ,WAAA,KeqCR,UnB0zGF,iBADA,gBADA,gBmBpzGI,aAAA,YnB0zGJ,gBmBxzGE,gBAEE,MAAA,QACA,gBAAA,UACA,iBAAA,YnB2zGJ,0BmBvzGI,0BnBwzGJ,mCAFA,mCmBpzGM,MAAA,KACA,gBAAA,KnB0zGN,mBmBjzGA,QC9EE,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UACA,cAAA,IpBm4GF,mBmBpzGA,QClFE,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,cAAA,IpB04GF,mBmBvzGA,QCtFE,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,cAAA,ID2FF,WACE,QAAA,MACA,MAAA,KAIF,sBACE,WAAA,InBuzGF,6BADA,4BmB/yGE,6BACE,MAAA,KG1JJ,MACE,QAAA,ElBoLA,mBAAA,QAAA,KAAA,OACK,cAAA,QAAA,KAAA,OACG,WAAA,QAAA,KAAA,OkBnLR,SACE,QAAA,EAIJ,UACE,QAAA,KAEA,aAAY,QAAA,MACZ,eAAY,QAAA,UACZ,kBAAY,QAAA,gBAGd,YACE,SAAA,SACA,OAAA,EACA,SAAA,OlBsKA,4BAAA,MAAA,CAAA,WACQ,uBAAA,MAAA,CAAA,WAAA,oBAAA,MAAA,CAAA,WAOR,4BAAA,KACQ,uBAAA,KAAA,oBAAA,KAGR,mCAAA,KACQ,8BAAA,KAAA,2BAAA,KmB5MV,OACE,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OACA,WAAA,IAAA,OACA,WAAA,IAAA,QACA,aAAA,IAAA,MAAA,YACA,YAAA,IAAA,MAAA,YvBu/GF,UuBn/GA,QAEE,SAAA,SAIF,uBACE,QAAA,EAIF,eACE,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,KACA,OAAA,IAAA,MAAA,gBACA,cAAA,InBuBA,mBAAA,EAAA,IAAA,KAAA,iBACQ,WAAA,EAAA,IAAA,KAAA,iBmBlBR,0BACE,MAAA,EACA,KAAA,KAzBJ,wBCzBE,OAAA,IACA,OAAA,IAAA,EACA,SAAA,OACA,iBAAA,QDsBF,oBAmCI,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KACA,YAAA,IACA,YAAA,WACA,MAAA,KACA,YAAA,OvB8+GJ,0BuB5+GI,0BAEE,MAAA,QACA,gBAAA,KACA,iBAAA,QAOJ,yBvBw+GF,+BADA,+BuBp+GI,MAAA,KACA,gBAAA,KACA,iBAAA,QACA,QAAA,EASF,2BvBi+GF,iCADA,iCuB79GI,MAAA,KvBk+GJ,iCuB99GE,iCAEE,gBAAA,KACA,OAAA,YACA,iBAAA,YACA,iBAAA,KEzGF,OAAA,0DF+GF,qBAGI,QAAA,MAHJ,QAQI,QAAA,EAQJ,qBACE,MAAA,EACA,KAAA,KAQF,oBACE,MAAA,KACA,KAAA,EAIF,iBACE,QAAA,MACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,YAAA,OAIF,mBACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,IAIF,2BACE,MAAA,EACA,KAAA,KAQF,evB+7GA,sCuB37GI,QAAA,GACA,WAAA,EACA,cAAA,IAAA,OACA,cAAA,IAAA,QAPJ,uBvBs8GA,8CuB37GI,IAAA,KACA,OAAA,KACA,cAAA,IASJ,yBACE,6BApEA,MAAA,EACA,KAAA,KAmEA,kCA1DA,MAAA,KACA,KAAA,GG1IF,W1BkoHA,oB0BhoHE,SAAA,SACA,QAAA,aACA,eAAA,O1BooHF,yB0BxoHA,gBAMI,SAAA,SACA,MAAA,K1B4oHJ,gCAFA,gCAFA,+BAFA,+BAKA,uBAFA,uBAFA,sB0BroHI,sBAIE,QAAA,EAMN,qB1BooHA,2BACA,2BACA,iC0BjoHI,YAAA,KAKJ,aACE,YAAA,KADF,kB1BmoHA,wBACA,0B0B7nHI,MAAA,KAPJ,kB1BwoHA,wBACA,0B0B7nHI,YAAA,IAIJ,yEACE,cAAA,EAIF,4BACE,YAAA,EACA,mECpDA,wBAAA,EACA,2BAAA,EDwDF,6C1B2nHA,8C2B5qHE,uBAAA,EACA,0BAAA,EDsDF,sBACE,MAAA,KAEF,8DACE,cAAA,EAEF,mE1B0nHA,oE2B/rHE,wBAAA,EACA,2BAAA,ED0EF,oECnEE,uBAAA,EACA,0BAAA,EDuEF,mC1BwnHA,iC0BtnHE,QAAA,EAiBF,iCACE,cAAA,IACA,aAAA,IAEF,oCACE,cAAA,KACA,aAAA,KAKF,iCtB/CE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsBkDR,0CtBnDA,mBAAA,KACQ,WAAA,KsByDV,YACE,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,EACA,oBAAA,EAGF,uBACE,aAAA,EAAA,IAAA,IAOF,yB1B4lHA,+BACA,oC0BzlHI,QAAA,MACA,MAAA,KACA,MAAA,KACA,UAAA,KAPJ,oCAcM,MAAA,KAdN,8B1BumHA,oCACA,oCACA,0C0BnlHI,WAAA,KACA,YAAA,EAKF,4DACE,cAAA,EAEF,sDC7KA,uBAAA,IACA,wBAAA,IAOA,2BAAA,EACA,0BAAA,EDwKA,sDCjLA,uBAAA,EACA,wBAAA,EAOA,2BAAA,IACA,0BAAA,ID6KF,uEACE,cAAA,EAEF,4E1BqlHA,6E2BtwHE,2BAAA,EACA,0BAAA,EDsLF,6EC/LE,uBAAA,EACA,wBAAA,EDsMF,qBACE,QAAA,MACA,MAAA,KACA,aAAA,MACA,gBAAA,SAJF,0B1BslHA,gC0B/kHI,QAAA,WACA,MAAA,KACA,MAAA,GATJ,qCAYI,MAAA,KAZJ,+CAgBI,KAAA,K1BmlHJ,gD0BlkHA,6C1BmkHA,2DAFA,wD0B5jHM,SAAA,SACA,KAAA,cACA,eAAA,KE1ON,aACE,SAAA,SACA,QAAA,MACA,gBAAA,SAGA,0BACE,MAAA,KACA,cAAA,EACA,aAAA,EATJ,2BAeI,SAAA,SACA,QAAA,EAKA,MAAA,KAEA,MAAA,KACA,cAAA,EAEA,iCACE,QAAA,EAUN,8B5B2xHA,mCACA,sCkBpwHE,OAAA,KACA,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UACA,cAAA,IAEA,oClBswHF,yCACA,4CkBtwHI,OAAA,KACA,YAAA,KlB4wHJ,8CACA,mDACA,sDkB3wHE,sClBuwHF,2CACA,8CkBtwHI,OAAA,KUhCJ,8B5B6yHA,mCACA,sCkB3xHE,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,cAAA,IAEA,oClB6xHF,yCACA,4CkB7xHI,OAAA,KACA,YAAA,KlBmyHJ,8CACA,mDACA,sDkBlyHE,sClB8xHF,2CACA,8CkB7xHI,OAAA,KlBqyHJ,2B4B5zHA,mB5B2zHA,iB4BxzHE,QAAA,W5B8zHF,8D4B5zHE,sD5B2zHF,oD4B1zHI,cAAA,EAIJ,mB5B2zHA,iB4BzzHE,MAAA,GACA,YAAA,OACA,eAAA,OAKF,mBACE,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,cAAA,IAGA,4BACE,QAAA,IAAA,KACA,UAAA,KACA,cAAA,IAEF,4BACE,QAAA,KAAA,KACA,UAAA,KACA,cAAA,I5ByzHJ,wC4B70HA,qCA0BI,WAAA,EAKJ,uC5BkzHA,+BACA,kCACA,6CACA,8CAEA,6DADA,wE2B55HE,wBAAA,EACA,2BAAA,EC8GF,+BACE,aAAA,EAEF,sC5BmzHA,8BAKA,+DADA,oDAHA,iCACA,4CACA,6C2Bh6HE,uBAAA,EACA,0BAAA,ECkHF,8BACE,YAAA,EAKF,iBACE,SAAA,SAGA,UAAA,EACA,YAAA,OALF,sBAUI,SAAA,SAVJ,2BAYM,YAAA,K5BizHN,6BADA,4B4B7yHI,4BAGE,QAAA,EAKJ,kC5B0yHF,wC4BvyHM,aAAA,KAGJ,iC5BwyHF,uC4BryHM,QAAA,EACA,YAAA,KC/JN,KACE,aAAA,EACA,cAAA,EACA,WAAA,KAHF,QAOI,SAAA,SACA,QAAA,MARJ,UAWM,SAAA,SACA,QAAA,MACA,QAAA,KAAA,K7By8HN,gB6Bx8HM,gBAEE,gBAAA,KACA,iBAAA,KAKJ,mBACE,MAAA,K7Bu8HN,yB6Br8HM,yBAEE,MAAA,KACA,gBAAA,KACA,OAAA,YACA,iBAAA,YAOJ,a7Bi8HJ,mBADA,mB6B77HM,iBAAA,KACA,aAAA,QAzCN,kBLLE,OAAA,IACA,OAAA,IAAA,EACA,SAAA,OACA,iBAAA,QKEF,cA0DI,UAAA,KASJ,UACE,cAAA,IAAA,MAAA,KADF,aAGI,MAAA,KAEA,cAAA,KALJ,eASM,aAAA,IACA,YAAA,WACA,OAAA,IAAA,MAAA,YACA,cAAA,IAAA,IAAA,EAAA,EACA,qBACE,aAAA,KAAA,KAAA,KAMF,sB7B86HN,4BADA,4B6B16HQ,MAAA,KACA,OAAA,QACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,oBAAA,YAKN,wBAqDA,MAAA,KA8BA,cAAA,EAnFA,2BAwDE,MAAA,KAxDF,6BA0DI,cAAA,IACA,WAAA,OA3DJ,iDAgEE,IAAA,KACA,KAAA,KAGF,yBAAA,2BAEI,QAAA,WACA,MAAA,GAHJ,6BAKM,cAAA,GAzEN,6BAuFE,aAAA,EACA,cAAA,IAxFF,kC7Bu8HF,wCADA,wC6Bx2HI,OAAA,IAAA,MAAA,KAGF,yBAAA,6BAEI,cAAA,IAAA,MAAA,KACA,cAAA,IAAA,IAAA,EAAA,EAHJ,kC7Bg3HA,wCADA,wC6Bv2HI,oBAAA,MAhGN,cAEI,MAAA,KAFJ,gBAMM,cAAA,IANN,iBASM,YAAA,IAKA,uB7By8HN,6BADA,6B6Br8HQ,MAAA,KACA,iBAAA,QAQR,gBAEI,MAAA,KAFJ,mBAIM,WAAA,IACA,YAAA,EAYN,eACE,MAAA,KADF,kBAII,MAAA,KAJJ,oBAMM,cAAA,IACA,WAAA,OAPN,wCAYI,IAAA,KACA,KAAA,KAGF,yBAAA,kBAEI,QAAA,WACA,MAAA,GAHJ,oBAKM,cAAA,GASR,oBACE,cAAA,EADF,yBAKI,aAAA,EACA,cAAA,IANJ,8B7By7HA,oCADA,oC6B56HI,OAAA,IAAA,MAAA,KAGF,yBAAA,yBAEI,cAAA,IAAA,MAAA,KACA,cAAA,IAAA,IAAA,EAAA,EAHJ,8B7Bo7HA,oCADA,oC6B36HI,oBAAA,MAUN,uBAEI,QAAA,KAFJ,qBAKI,QAAA,MASJ,yBAEE,WAAA,KF7OA,uBAAA,EACA,wBAAA,EGQF,QACE,SAAA,SACA,WAAA,KACA,cAAA,KACA,OAAA,IAAA,MAAA,YAKA,yBAAA,QACE,cAAA,KAaF,yBAAA,eACE,MAAA,MAeJ,iBACE,cAAA,KACA,aAAA,KACA,WAAA,QACA,WAAA,IAAA,MAAA,YACA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,WAAA,MAAA,EAAA,IAAA,EAAA,qBAEA,2BAAA,MAEA,oBACE,WAAA,KAGF,yBAAA,iBACE,MAAA,KACA,WAAA,EACA,mBAAA,KAAA,WAAA,KAEA,0BACE,QAAA,gBACA,OAAA,eACA,eAAA,EACA,SAAA,kBAGF,oBACE,WAAA,Q9BknIJ,sC8B7mIE,mC9B4mIF,oC8BzmII,cAAA,EACA,aAAA,G9B+mIN,qB8B1mIA,kBAWE,SAAA,MACA,MAAA,EACA,KAAA,EACA,QAAA,K9BmmIF,sC8BjnIA,mCAGI,WAAA,MAEA,4D9BinIF,sC8BjnIE,mCACE,WAAA,OAWJ,yB9B2mIA,qB8B3mIA,kBACE,cAAA,GAIJ,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,IAEF,qBACE,OAAA,EACA,cAAA,EACA,aAAA,IAAA,EAAA,E9B+mIF,kCAFA,gCACA,4B8BtmIA,0BAII,aAAA,MACA,YAAA,MAEA,yB9BwmIF,kCAFA,gCACA,4B8BvmIE,0BACE,aAAA,EACA,YAAA,GAaN,mBACE,QAAA,KACA,aAAA,EAAA,EAAA,IAEA,yBAAA,mBACE,cAAA,GAOJ,cACE,MAAA,KACA,OAAA,KACA,QAAA,KAAA,KACA,UAAA,KACA,YAAA,K9B8lIF,oB8B5lIE,oBAEE,gBAAA,KATJ,kBAaI,QAAA,MAGF,yBACE,iC9B0lIF,uC8BxlII,YAAA,OAWN,eACE,SAAA,SACA,MAAA,MACA,QAAA,IAAA,KACA,aAAA,KC9LA,WAAA,IACA,cAAA,ID+LA,iBAAA,YACA,iBAAA,KACA,OAAA,IAAA,MAAA,YACA,cAAA,IAIA,qBACE,QAAA,EAdJ,yBAmBI,QAAA,MACA,MAAA,KACA,OAAA,IACA,cAAA,IAtBJ,mCAyBI,WAAA,IAGF,yBAAA,eACE,QAAA,MAUJ,YACE,OAAA,MAAA,MADF,iBAII,YAAA,KACA,eAAA,KACA,YAAA,KAGF,yBAAA,iCAGI,SAAA,OACA,MAAA,KACA,MAAA,KACA,WAAA,EACA,iBAAA,YACA,OAAA,EACA,mBAAA,KAAA,WAAA,K9BykIJ,kD8BllIA,sCAYM,QAAA,IAAA,KAAA,IAAA,KAZN,sCAeM,YAAA,K9B0kIN,4C8BzkIM,4CAEE,iBAAA,MAOR,yBAAA,YACE,MAAA,KACA,OAAA,EAFF,eAKI,MAAA,KALJ,iBAOM,YAAA,KACA,eAAA,MAYR,aACE,QAAA,KAAA,KACA,aAAA,MACA,YAAA,MACA,WAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,Y1B5NA,mBAAA,MAAA,EAAA,IAAA,EAAA,oBAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,oBAAA,CAAA,EAAA,IAAA,EAAA,qB2BjER,WAAA,IACA,cAAA,Id6cA,yBAAA,yBAGI,QAAA,aACA,cAAA,EACA,eAAA,OALJ,2BAUI,QAAA,aACA,MAAA,KACA,eAAA,OAZJ,kCAiBI,QAAA,aAjBJ,0BAqBI,QAAA,aACA,eAAA,OjB+4HJ,wCiBr6HA,6CjBo6HA,2CiBz4HM,MAAA,KA3BN,wCAiCI,MAAA,KAjCJ,4BAqCI,cAAA,EACA,eAAA,OjB04HJ,uBiBh7HA,oBA6CI,QAAA,aACA,WAAA,EACA,cAAA,EACA,eAAA,OjBu4HJ,6BiBv7HA,0BAmDM,aAAA,EjBw4HN,4CiB37HA,sCAwDI,SAAA,SACA,YAAA,EAzDJ,kDA8DI,IAAA,GaxOF,yBAAA,yBACE,cAAA,IAEA,oCACE,cAAA,GASN,yBAAA,aACE,MAAA,KACA,YAAA,EACA,eAAA,EACA,aAAA,EACA,YAAA,EACA,OAAA,E1BvPF,mBAAA,KACQ,WAAA,M0B+PV,8BACE,WAAA,EHpUA,uBAAA,EACA,wBAAA,EGuUF,mDACE,cAAA,EHzUA,uBAAA,IACA,wBAAA,IAOA,2BAAA,EACA,0BAAA,EG0UF,YChVE,WAAA,IACA,cAAA,IDkVA,mBCnVA,WAAA,KACA,cAAA,KDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,aChWE,WAAA,KACA,cAAA,KDkWA,yBAAA,aACE,MAAA,KACA,aAAA,KACA,YAAA,MAaJ,yBACE,aEtWA,MAAA,eFuWA,cE1WA,MAAA,gBF4WE,aAAA,MAFF,4BAKI,aAAA,GAUN,gBACE,iBAAA,QACA,aAAA,QAFF,8BAKI,MAAA,K9BmlIJ,oC8BllII,oCAEE,MAAA,QACA,iBAAA,YATN,6BAcI,MAAA,KAdJ,iCAmBM,MAAA,K9BglIN,uC8B9kIM,uCAEE,MAAA,KACA,iBAAA,YAIF,sC9B6kIN,4CADA,4C8BzkIQ,MAAA,KACA,iBAAA,QAIF,wC9B2kIN,8CADA,8C8BvkIQ,MAAA,KACA,iBAAA,YAOF,oC9BskIN,0CADA,0C8BlkIQ,MAAA,KACA,iBAAA,QAIJ,yBAAA,sDAIM,MAAA,K9BmkIR,4D8BlkIQ,4DAEE,MAAA,KACA,iBAAA,YAIF,2D9BikIR,iEADA,iE8B7jIU,MAAA,KACA,iBAAA,QAIF,6D9B+jIR,mEADA,mE8B3jIU,MAAA,KACA,iBAAA,aA/EZ,+BAuFI,aAAA,K9B4jIJ,qC8B3jII,qCAEE,iBAAA,KA1FN,yCA6FM,iBAAA,KA7FN,iC9B0pIA,6B8BvjII,aAAA,QAnGJ,6BA4GI,MAAA,KACA,mCACE,MAAA,KA9GN,0BAmHI,MAAA,K9BojIJ,gC8BnjII,gCAEE,MAAA,K9BsjIN,0C8BljIM,0C9BmjIN,mDAFA,mD8B/iIQ,MAAA,KAQR,gBACE,iBAAA,KACA,aAAA,QAFF,8BAKI,MAAA,Q9B+iIJ,oC8B9iII,oCAEE,MAAA,KACA,iBAAA,YATN,6BAcI,MAAA,QAdJ,iCAmBM,MAAA,Q9B4iIN,uC8B1iIM,uCAEE,MAAA,KACA,iBAAA,YAIF,sC9ByiIN,4CADA,4C8BriIQ,MAAA,KACA,iBAAA,QAIF,wC9BuiIN,8CADA,8C8BniIQ,MAAA,KACA,iBAAA,YAMF,oC9BmiIN,0CADA,0C8B/hIQ,MAAA,KACA,iBAAA,QAIJ,yBAAA,kEAIM,aAAA,QAJN,0DAOM,iBAAA,QAPN,sDAUM,MAAA,Q9BgiIR,4D8B/hIQ,4DAEE,MAAA,KACA,iBAAA,YAIF,2D9B8hIR,iEADA,iE8B1hIU,MAAA,KACA,iBAAA,QAIF,6D9B4hIR,mEADA,mE8BxhIU,MAAA,KACA,iBAAA,aApFZ,+BA6FI,aAAA,K9BwhIJ,qC8BvhII,qCAEE,iBAAA,KAhGN,yCAmGM,iBAAA,KAnGN,iC9B4nIA,6B8BnhII,aAAA,QAzGJ,6BA6GI,MAAA,QACA,mCACE,MAAA,KA/GN,0BAoHI,MAAA,Q9BqhIJ,gC8BphII,gCAEE,MAAA,K9BuhIN,0C8BnhIM,0C9BohIN,mDAFA,mD8BhhIQ,MAAA,KGtoBR,YACE,QAAA,IAAA,KACA,cAAA,KACA,WAAA,KACA,iBAAA,QACA,cAAA,IALF,eAQI,QAAA,aARJ,yBAWM,QAAA,EAAA,IACA,MAAA,KACA,QAAA,SAbN,oBAkBI,MAAA,KCpBJ,YACE,QAAA,aACA,aAAA,EACA,OAAA,KAAA,EACA,cAAA,IAJF,eAOI,QAAA,OAPJ,iBlCyrJA,oBkC/qJM,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WACA,MAAA,QACA,gBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,KlCorJN,uBkClrJM,uBlCmrJN,0BAFA,0BkC/qJQ,QAAA,EACA,MAAA,QACA,iBAAA,KACA,aAAA,KAGJ,6BlCkrJJ,gCkC/qJQ,YAAA,EPnBN,uBAAA,IACA,0BAAA,IOsBE,4BlCirJJ,+B2BhtJE,wBAAA,IACA,2BAAA,IOwCE,sBlC+qJJ,4BAFA,4BADA,yBAIA,+BAFA,+BkC3qJM,QAAA,EACA,MAAA,KACA,OAAA,QACA,iBAAA,QACA,aAAA,QlCmrJN,wBAEA,8BADA,8BkCxuJA,2BlCsuJA,iCADA,iCkCtqJM,MAAA,KACA,OAAA,YACA,iBAAA,KACA,aAAA,KASN,oBlCqqJA,uBmC7uJM,QAAA,KAAA,KACA,UAAA,KACA,YAAA,UAEF,gCnC+uJJ,mC2B1uJE,uBAAA,IACA,0BAAA,IQAE,+BnC8uJJ,kC2BvvJE,wBAAA,IACA,2BAAA,IO2EF,oBlCgrJA,uBmC7vJM,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IAEF,gCnC+vJJ,mC2B1vJE,uBAAA,IACA,0BAAA,IQAE,+BnC8vJJ,kC2BvwJE,wBAAA,IACA,2BAAA,ISHF,OACE,aAAA,EACA,OAAA,KAAA,EACA,WAAA,OACA,WAAA,KAJF,UAOI,QAAA,OAPJ,YpCuxJA,eoC7wJM,QAAA,aACA,QAAA,IAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,cAAA,KpCixJN,kBoC/xJA,kBAmBM,gBAAA,KACA,iBAAA,KApBN,epCoyJA,kBoCzwJM,MAAA,MA3BN,mBpCwyJA,sBoCtwJM,MAAA,KAlCN,mBpC6yJA,yBADA,yBAEA,sBoCnwJM,MAAA,KACA,OAAA,YACA,iBAAA,KC9CN,OACE,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,SACA,cAAA,MrCuzJF,cqCnzJI,cAEE,MAAA,KACA,gBAAA,KACA,OAAA,QAKJ,aACE,QAAA,KAIF,YACE,SAAA,SACA,IAAA,KAOJ,eCtCE,iBAAA,KtCk1JF,2BsC/0JI,2BAEE,iBAAA,QDqCN,eC1CE,iBAAA,QtCy1JF,2BsCt1JI,2BAEE,iBAAA,QDyCN,eC9CE,iBAAA,QtCg2JF,2BsC71JI,2BAEE,iBAAA,QD6CN,YClDE,iBAAA,QtCu2JF,wBsCp2JI,wBAEE,iBAAA,QDiDN,eCtDE,iBAAA,QtC82JF,2BsC32JI,2BAEE,iBAAA,QDqDN,cC1DE,iBAAA,QtCq3JF,0BsCl3JI,0BAEE,iBAAA,QCFN,OACE,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,OACA,iBAAA,KACA,cAAA,KAGA,aACE,QAAA,KAIF,YACE,SAAA,SACA,IAAA,KvCq3JJ,0BuCl3JE,eAEE,IAAA,EACA,QAAA,IAAA,IvCo3JJ,cuC/2JI,cAEE,MAAA,KACA,gBAAA,KACA,OAAA,QAKJ,+BvC42JF,4BuC12JI,MAAA,QACA,iBAAA,KAGF,wBACE,MAAA,MAGF,+BACE,aAAA,IAGF,uBACE,YAAA,IC1DJ,WACE,YAAA,KACA,eAAA,KACA,cAAA,KACA,MAAA,QACA,iBAAA,KxCu6JF,ewC56JA,cASI,MAAA,QATJ,aAaI,cAAA,KACA,UAAA,KACA,YAAA,IAfJ,cAmBI,iBAAA,QAGF,sBxCk6JF,4BwCh6JI,cAAA,KACA,aAAA,KACA,cAAA,IA1BJ,sBA8BI,UAAA,KAGF,oCAAA,WACE,YAAA,KACA,eAAA,KAEA,sBxCi6JF,4BwC/5JI,cAAA,KACA,aAAA,KxCm6JJ,ewC16JA,cAYI,UAAA,MC1CN,WACE,QAAA,MACA,QAAA,IACA,cAAA,KACA,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KACA,cAAA,IrCiLA,mBAAA,OAAA,IAAA,YACK,cAAA,OAAA,IAAA,YACG,WAAA,OAAA,IAAA,YJ+xJV,iByCz9JA,eAaI,aAAA,KACA,YAAA,KzCi9JJ,mBADA,kByC58JE,kBAGE,aAAA,QArBJ,oBA0BI,QAAA,IACA,MAAA,KC3BJ,OACE,QAAA,KACA,cAAA,KACA,OAAA,IAAA,MAAA,YACA,cAAA,IAJF,UAQI,WAAA,EACA,MAAA,QATJ,mBAcI,YAAA,IAdJ,S1Co/JA,U0Ch+JI,cAAA,EApBJ,WAwBI,WAAA,IASJ,mB1C09JA,mB0Cx9JE,cAAA,KAFF,0B1C89JA,0B0Cx9JI,SAAA,SACA,IAAA,KACA,MAAA,MACA,MAAA,QAQJ,eCvDE,MAAA,QACA,iBAAA,QACA,aAAA,QDqDF,kBClDI,iBAAA,QDkDJ,2BC9CI,MAAA,QDkDJ,YC3DE,MAAA,QACA,iBAAA,QACA,aAAA,QDyDF,eCtDI,iBAAA,QDsDJ,wBClDI,MAAA,QDsDJ,eC/DE,MAAA,QACA,iBAAA,QACA,aAAA,QD6DF,kBC1DI,iBAAA,QD0DJ,2BCtDI,MAAA,QD0DJ,cCnEE,MAAA,QACA,iBAAA,QACA,aAAA,QDiEF,iBC9DI,iBAAA,QD8DJ,0BC1DI,MAAA,QCDJ,wCACE,KAAQ,oBAAA,KAAA,EACR,GAAQ,oBAAA,EAAA,GAIV,mCACE,KAAQ,oBAAA,KAAA,EACR,GAAQ,oBAAA,EAAA,GAFV,gCACE,KAAQ,oBAAA,KAAA,EACR,GAAQ,oBAAA,EAAA,GAQV,UACE,OAAA,KACA,cAAA,KACA,SAAA,OACA,iBAAA,QACA,cAAA,IxCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,eACQ,WAAA,MAAA,EAAA,IAAA,IAAA,ewClCV,cACE,MAAA,KACA,MAAA,GACA,OAAA,KACA,UAAA,KACA,YAAA,KACA,MAAA,KACA,WAAA,OACA,iBAAA,QxCyBA,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACQ,WAAA,MAAA,EAAA,KAAA,EAAA,gBAyHR,mBAAA,MAAA,IAAA,KACK,cAAA,MAAA,IAAA,KACG,WAAA,MAAA,IAAA,KJw6JV,sB4CnjKA,gCCDI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKDEF,wBAAA,KAAA,KAAA,gBAAA,KAAA,K5CwjKF,qB4CjjKA,+BxC5CE,kBAAA,qBAAA,GAAA,OAAA,SACK,aAAA,qBAAA,GAAA,OAAA,SACG,UAAA,qBAAA,GAAA,OAAA,SwCmDV,sBEvEE,iBAAA,QAGA,wCDgDE,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKDsBJ,mBE3EE,iBAAA,QAGA,qCDgDE,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKD0BJ,sBE/EE,iBAAA,QAGA,wCDgDE,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKD8BJ,qBEnFE,iBAAA,QAGA,uCDgDE,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKExDJ,OAEE,WAAA,KAEA,mBACE,WAAA,EAIJ,O/CqpKA,Y+CnpKE,SAAA,OACA,KAAA,EAGF,YACE,MAAA,QAGF,cACE,QAAA,MAGA,4BACE,UAAA,KAIJ,a/CgpKA,mB+C9oKE,aAAA,KAGF,Y/C+oKA,kB+C7oKE,cAAA,K/CkpKF,Y+C/oKA,Y/C8oKA,a+C3oKE,QAAA,WACA,eAAA,IAGF,cACE,eAAA,OAGF,cACE,eAAA,OAIF,eACE,WAAA,EACA,cAAA,IAMF,YACE,aAAA,EACA,WAAA,KCrDF,YAEE,aAAA,EACA,cAAA,KAQF,iBACE,SAAA,SACA,QAAA,MACA,QAAA,KAAA,KAEA,cAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,KAGA,6BrB7BA,uBAAA,IACA,wBAAA,IqB+BA,4BACE,cAAA,ErBzBF,2BAAA,IACA,0BAAA,IqB6BA,0BhDqrKF,gCADA,gCgDjrKI,MAAA,KACA,OAAA,YACA,iBAAA,KALF,mDhD4rKF,yDADA,yDgDlrKM,MAAA,QATJ,gDhDisKF,sDADA,sDgDprKM,MAAA,KAKJ,wBhDqrKF,8BADA,8BgDjrKI,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QANF,iDhDisKF,wDAHA,uDADA,uDAMA,8DAHA,6DAJA,uDAMA,8DAHA,6DgDnrKM,MAAA,QAZJ,8ChDwsKF,oDADA,oDgDxrKM,MAAA,QAWN,kBhDkrKA,uBgDhrKE,MAAA,KAFF,2ChDsrKA,gDgDjrKI,MAAA,KhDsrKJ,wBgDlrKE,wBhDmrKF,6BAFA,6BgD/qKI,MAAA,KACA,gBAAA,KACA,iBAAA,QAIJ,uBACE,MAAA,KACA,WAAA,KnCvGD,yBoCIG,MAAA,QACA,iBAAA,QAEA,0BjDuxKJ,+BiDrxKM,MAAA,QAFF,mDjD2xKJ,wDiDtxKQ,MAAA,QjD2xKR,gCiDxxKM,gCjDyxKN,qCAFA,qCiDrxKQ,MAAA,QACA,iBAAA,QAEF,iCjD4xKN,uCAFA,uCADA,sCAIA,4CAFA,4CiDxxKQ,MAAA,KACA,iBAAA,QACA,aAAA,QpCzBP,sBoCIG,MAAA,QACA,iBAAA,QAEA,uBjDozKJ,4BiDlzKM,MAAA,QAFF,gDjDwzKJ,qDiDnzKQ,MAAA,QjDwzKR,6BiDrzKM,6BjDszKN,kCAFA,kCiDlzKQ,MAAA,QACA,iBAAA,QAEF,8BjDyzKN,oCAFA,oCADA,mCAIA,yCAFA,yCiDrzKQ,MAAA,KACA,iBAAA,QACA,aAAA,QpCzBP,yBoCIG,MAAA,QACA,iBAAA,QAEA,0BjDi1KJ,+BiD/0KM,MAAA,QAFF,mDjDq1KJ,wDiDh1KQ,MAAA,QjDq1KR,gCiDl1KM,gCjDm1KN,qCAFA,qCiD/0KQ,MAAA,QACA,iBAAA,QAEF,iCjDs1KN,uCAFA,uCADA,sCAIA,4CAFA,4CiDl1KQ,MAAA,KACA,iBAAA,QACA,aAAA,QpCzBP,wBoCIG,MAAA,QACA,iBAAA,QAEA,yBjD82KJ,8BiD52KM,MAAA,QAFF,kDjDk3KJ,uDiD72KQ,MAAA,QjDk3KR,+BiD/2KM,+BjDg3KN,oCAFA,oCiD52KQ,MAAA,QACA,iBAAA,QAEF,gCjDm3KN,sCAFA,sCADA,qCAIA,2CAFA,2CiD/2KQ,MAAA,KACA,iBAAA,QACA,aAAA,QDiGR,yBACE,WAAA,EACA,cAAA,IAEF,sBACE,cAAA,EACA,YAAA,IExHF,OACE,cAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,YACA,cAAA,I9C0DA,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gB8CtDV,YACE,QAAA,KAKF,eACE,QAAA,KAAA,KACA,cAAA,IAAA,MAAA,YvBtBA,uBAAA,IACA,wBAAA,IuBmBF,0CAMI,MAAA,QAKJ,aACE,WAAA,EACA,cAAA,EACA,UAAA,KACA,MAAA,QlD24KF,oBAEA,sBkDj5KA,elD84KA,mBAEA,qBkDr4KI,MAAA,QAKJ,cACE,QAAA,KAAA,KACA,iBAAA,QACA,WAAA,IAAA,MAAA,KvB1CA,2BAAA,IACA,0BAAA,IuBmDF,mBlD+3KA,mCkD53KI,cAAA,EAHJ,oClDm4KA,oDkD73KM,aAAA,IAAA,EACA,cAAA,EAIF,4DlD63KJ,4EkD33KQ,WAAA,EvBzEN,uBAAA,IACA,wBAAA,IuB8EE,0DlD23KJ,0EkDz3KQ,cAAA,EvBzEN,2BAAA,IACA,0BAAA,IuBmDF,+EvB5DE,uBAAA,EACA,wBAAA,EuB4FF,wDAEI,iBAAA,EAGJ,0BACE,iBAAA,ElDw3KF,8BkDh3KA,clD+2KA,gCkD32KI,cAAA,ElDi3KJ,sCkDr3KA,sBlDo3KA,wCkD72KM,cAAA,KACA,aAAA,KlDk3KN,wDkD13KA,0BvB3GE,uBAAA,IACA,wBAAA,I3B2+KF,yFAFA,yFACA,2DkDh4KA,2DAmBQ,uBAAA,IACA,wBAAA,IlDo3KR,wGAIA,wGANA,wGAIA,wGAHA,0EAIA,0EkD34KA,0ElDy4KA,0EkDj3KU,uBAAA,IlD03KV,uGAIA,uGANA,uGAIA,uGAHA,yEAIA,yEkDr5KA,yElDm5KA,yEkDv3KU,wBAAA,IlD83KV,sDkD15KA,yBvBnGE,2BAAA,IACA,0BAAA,I3BigLF,qFAEA,qFkDj6KA,wDlDg6KA,wDkDv3KQ,2BAAA,IACA,0BAAA,IlD43KR,oGAIA,oGAFA,oGAIA,oGkD56KA,uElDy6KA,uEAFA,uEAIA,uEkD73KU,0BAAA,IlDk4KV,mGAIA,mGAFA,mGAIA,mGkDt7KA,sElDm7KA,sEAFA,sEAIA,sEkDn4KU,2BAAA,IAlDV,0BlD07KA,qCACA,0BACA,qCkDj4KI,WAAA,IAAA,MAAA,KlDq4KJ,kDkDh8KA,kDA+DI,WAAA,EA/DJ,uBlDo8KA,yCkDj4KI,OAAA,ElD44KJ,+CANA,+CAQA,+CANA,+CAEA,+CkD78KA,+ClDg9KA,iEANA,iEAQA,iEANA,iEAEA,iEANA,iEkD93KU,YAAA,ElDm5KV,8CANA,8CAQA,8CANA,8CAEA,8CkD39KA,8ClD89KA,gEANA,gEAQA,gEANA,gEAEA,gEANA,gEkDx4KU,aAAA,ElDu5KV,+CAIA,+CkDz+KA,+ClDu+KA,+CADA,iEAIA,iEANA,iEAIA,iEkDj5KU,cAAA,EAvFV,8ClDi/KA,8CAFA,8CAIA,8CALA,gEAIA,gEAFA,gEAIA,gEkDp5KU,cAAA,EAhGV,yBAsGI,cAAA,EACA,OAAA,EAUJ,aACE,cAAA,KADF,oBAKI,cAAA,EACA,cAAA,IANJ,2BASM,WAAA,IATN,4BAcI,cAAA,ElD04KJ,wDkDx5KA,wDAkBM,WAAA,IAAA,MAAA,KAlBN,2BAuBI,WAAA,EAvBJ,uDAyBM,cAAA,IAAA,MAAA,KAON,eC5PE,aAAA,KAEA,8BACE,MAAA,KACA,iBAAA,QACA,aAAA,KAHF,0DAMI,iBAAA,KANJ,qCASI,MAAA,QACA,iBAAA,KAGJ,yDAEI,oBAAA,KD8ON,eC/PE,aAAA,QAEA,8BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAHF,0DAMI,iBAAA,QANJ,qCASI,MAAA,QACA,iBAAA,KAGJ,yDAEI,oBAAA,QDiPN,eClQE,aAAA,QAEA,8BACE,MAAA,QACA,iBAAA,QACA,aAAA,QAHF,0DAMI,iBAAA,QANJ,qCASI,MAAA,QACA,iBAAA,QAGJ,yDAEI,oBAAA,QDoPN,YCrQE,aAAA,QAEA,2BACE,MAAA,QACA,iBAAA,QACA,aAAA,QAHF,uDAMI,iBAAA,QANJ,kCASI,MAAA,QACA,iBAAA,QAGJ,sDAEI,oBAAA,QDuPN,eCxQE,aAAA,QAEA,8BACE,MAAA,QACA,iBAAA,QACA,aAAA,QAHF,0DAMI,iBAAA,QANJ,qCASI,MAAA,QACA,iBAAA,QAGJ,yDAEI,oBAAA,QD0PN,cC3QE,aAAA,QAEA,6BACE,MAAA,QACA,iBAAA,QACA,aAAA,QAHF,yDAMI,iBAAA,QANJ,oCASI,MAAA,QACA,iBAAA,QAGJ,wDAEI,oBAAA,QChBN,kBACE,SAAA,SACA,QAAA,MACA,OAAA,EACA,QAAA,EACA,SAAA,OALF,yCpDivLA,wBADA,yBAEA,yBACA,wBoDvuLI,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KACA,OAAA,EAKJ,wBACE,eAAA,OAIF,uBACE,eAAA,IC3BF,MACE,WAAA,KACA,QAAA,KACA,cAAA,KACA,iBAAA,QACA,OAAA,IAAA,MAAA,QACA,cAAA,IjD0DA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBiDjEV,iBASI,aAAA,KACA,aAAA,gBAKJ,SACE,QAAA,KACA,cAAA,IAEF,SACE,QAAA,IACA,cAAA,ICpBF,OACE,MAAA,MACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,YAAA,EAAA,IAAA,EAAA,KjCTA,OAAA,kBACA,QAAA,GrBkyLF,asDvxLE,aAEE,MAAA,KACA,gBAAA,KACA,OAAA,QjChBF,OAAA,kBACA,QAAA,GiCuBA,aACE,QAAA,EACA,OAAA,QACA,WAAA,IACA,OAAA,EACA,mBAAA,KACA,gBAAA,KAAA,WAAA,KCxBJ,YACE,SAAA,OAIF,OACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,SAAA,OACA,2BAAA,MAIA,QAAA,EAGA,0BnDiHA,kBAAA,kBACI,cAAA,kBACC,aAAA,kBACG,UAAA,kBAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,kBAAA,IAAA,SAAA,WAAA,UAAA,IAAA,SAAA,WAAA,UAAA,IAAA,QAAA,CAAA,kBAAA,IAAA,QAAA,CAAA,aAAA,IAAA,SmDrLR,wBnD6GA,kBAAA,eACI,cAAA,eACC,aAAA,eACG,UAAA,emD9GV,mBACE,WAAA,OACA,WAAA,KAIF,cACE,SAAA,SACA,MAAA,KACA,OAAA,KAIF,eACE,SAAA,SACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,KACA,OAAA,IAAA,MAAA,eACA,cAAA,InDcA,mBAAA,EAAA,IAAA,IAAA,eACQ,WAAA,EAAA,IAAA,IAAA,emDZR,QAAA,EAIF,gBACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,iBAAA,KAEA,qBlCpEA,OAAA,iBACA,QAAA,EkCoEA,mBlCrEA,OAAA,kBACA,QAAA,GkCyEF,cACE,QAAA,KACA,cAAA,IAAA,MAAA,QAIF,qBACE,WAAA,KAIF,aACE,OAAA,EACA,YAAA,WAKF,YACE,SAAA,SACA,QAAA,KAIF,cACE,QAAA,KACA,WAAA,MACA,WAAA,IAAA,MAAA,QAHF,wBAQI,cAAA,EACA,YAAA,IATJ,mCAaI,YAAA,KAbJ,oCAiBI,YAAA,EAKJ,yBACE,SAAA,SACA,IAAA,QACA,MAAA,KACA,OAAA,KACA,SAAA,OAIF,yBAEE,cACE,MAAA,MACA,OAAA,KAAA,KAEF,enDrEA,mBAAA,EAAA,IAAA,KAAA,eACQ,WAAA,EAAA,IAAA,KAAA,emDyER,UAAY,MAAA,OAGd,yBACE,UAAY,MAAA,OC9Id,SACE,SAAA,SACA,QAAA,KACA,QAAA,MCRA,YAAA,gBAAA,CAAA,SAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,UAAA,OACA,YAAA,ODHA,UAAA,KnCTA,OAAA,iBACA,QAAA,EmCYA,YnCbA,OAAA,kBACA,QAAA,GmCaA,aACE,QAAA,IAAA,EACA,WAAA,KAEF,eACE,QAAA,EAAA,IACA,YAAA,IAEF,gBACE,QAAA,IAAA,EACA,WAAA,IAEF,cACE,QAAA,EAAA,IACA,YAAA,KAIF,4BACE,OAAA,EACA,KAAA,IACA,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEF,iCACE,MAAA,IACA,OAAA,EACA,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEF,kCACE,OAAA,EACA,KAAA,IACA,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEF,8BACE,IAAA,IACA,KAAA,EACA,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEF,6BACE,IAAA,IACA,MAAA,EACA,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEF,+BACE,IAAA,EACA,KAAA,IACA,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEF,oCACE,IAAA,EACA,MAAA,IACA,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEF,qCACE,IAAA,EACA,KAAA,IACA,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAKJ,eACE,UAAA,MACA,QAAA,IAAA,IACA,MAAA,KACA,WAAA,OACA,iBAAA,KACA,cAAA,IAIF,eACE,SAAA,SACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MEzGF,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IDXA,YAAA,gBAAA,CAAA,SAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,UAAA,OACA,YAAA,OCAA,UAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,KACA,OAAA,IAAA,MAAA,eACA,cAAA,ItDiDA,mBAAA,EAAA,IAAA,KAAA,eACQ,WAAA,EAAA,IAAA,KAAA,esD9CR,aAAQ,WAAA,MACR,eAAU,YAAA,KACV,gBAAW,WAAA,KACX,cAAS,YAAA,MAvBX,gBA4BI,aAAA,KAEA,gB1DkjMJ,sB0DhjMM,SAAA,SACA,QAAA,MACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MAGF,sBACE,QAAA,GACA,aAAA,KAIJ,oBACE,OAAA,MACA,KAAA,IACA,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,EACA,0BACE,OAAA,IACA,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAGJ,sBACE,IAAA,IACA,KAAA,MACA,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,EACA,4BACE,OAAA,MACA,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAGJ,uBACE,IAAA,MACA,KAAA,IACA,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gBACA,6BACE,IAAA,IACA,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAIJ,qBACE,IAAA,IACA,MAAA,MACA,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gBACA,2BACE,MAAA,IACA,OAAA,MACA,QAAA,IACA,mBAAA,EACA,kBAAA,KAKN,eACE,QAAA,IAAA,KACA,OAAA,EACA,UAAA,KACA,iBAAA,QACA,cAAA,IAAA,MAAA,QACA,cAAA,IAAA,IAAA,EAAA,EAGF,iBACE,QAAA,IAAA,KCpHF,UACE,SAAA,SAGF,gBACE,SAAA,SACA,MAAA,KACA,SAAA,OAHF,sBAMI,SAAA,SACA,QAAA,KvD6KF,mBAAA,IAAA,YAAA,KACK,cAAA,IAAA,YAAA,KACG,WAAA,IAAA,YAAA,KJs/LV,4B2D5qMA,0BAcM,YAAA,EAIF,8BAAA,uBAAA,sBvDuLF,mBAAA,kBAAA,IAAA,YAEK,cAAA,aAAA,IAAA,YACG,WAAA,kBAAA,IAAA,YAAA,WAAA,UAAA,IAAA,YAAA,WAAA,UAAA,IAAA,WAAA,CAAA,kBAAA,IAAA,WAAA,CAAA,aAAA,IAAA,YA7JR,4BAAA,OAEQ,oBAAA,OA+GR,oBAAA,OAEQ,YAAA,OJ0hMR,mC2DrqMI,2BvDmHJ,kBAAA,sBACQ,UAAA,sBuDjHF,KAAA,E3DwqMN,kC2DtqMI,2BvD8GJ,kBAAA,uBACQ,UAAA,uBuD5GF,KAAA,E3D0qMN,6B2DxqMI,gC3DuqMJ,iCI9jMA,kBAAA,mBACQ,UAAA,mBuDtGF,KAAA,GArCR,wB3DgtMA,sBACA,sB2DpqMI,QAAA,MA7CJ,wBAiDI,KAAA,EAjDJ,sB3DwtMA,sB2DlqMI,SAAA,SACA,IAAA,EACA,MAAA,KAxDJ,sBA4DI,KAAA,KA5DJ,sBA+DI,KAAA,MA/DJ,2B3DouMA,4B2DjqMI,KAAA,EAnEJ,6BAuEI,KAAA,MAvEJ,8BA0EI,KAAA,KAQJ,kBACE,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,IACA,UAAA,KACA,MAAA,KACA,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,ctCpGA,OAAA,kBACA,QAAA,GsCyGA,uBdrGE,iBAAA,sEACA,iBAAA,iEACA,iBAAA,uFAAA,iBAAA,kEACA,OAAA,+GACA,kBAAA,ScoGF,wBACE,MAAA,EACA,KAAA,Kd1GA,iBAAA,sEACA,iBAAA,iEACA,iBAAA,uFAAA,iBAAA,kEACA,OAAA,+GACA,kBAAA,S7C6wMJ,wB2DlqME,wBAEE,MAAA,KACA,gBAAA,KACA,QAAA,EtCxHF,OAAA,kBACA,QAAA,GrB8xMF,0CACA,2CAFA,6B2DpsMA,6BAuCI,SAAA,SACA,IAAA,IACA,QAAA,EACA,QAAA,aACA,WAAA,M3DmqMJ,0C2D9sMA,6BA+CI,KAAA,IACA,YAAA,M3DmqMJ,2C2DntMA,6BAoDI,MAAA,IACA,aAAA,M3DmqMJ,6B2DxtMA,6BAyDI,MAAA,KACA,OAAA,KACA,YAAA,MACA,YAAA,EAIA,oCACE,QAAA,QAIF,oCACE,QAAA,QAUN,qBACE,SAAA,SACA,OAAA,KACA,KAAA,IACA,QAAA,GACA,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KATF,wBAYI,QAAA,aACA,MAAA,KACA,OAAA,KACA,OAAA,IACA,YAAA,OACA,OAAA,QAUA,iBAAA,OACA,iBAAA,cAEA,OAAA,IAAA,MAAA,KACA,cAAA,KA/BJ,6BAmCI,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAOJ,kBACE,SAAA,SACA,MAAA,IACA,OAAA,KACA,KAAA,IACA,QAAA,GACA,YAAA,KACA,eAAA,KACA,MAAA,KACA,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eAEA,uBACE,YAAA,KAMJ,oCAGE,0C3D+nMA,2CAEA,6BADA,6B2D3nMI,MAAA,KACA,OAAA,KACA,WAAA,MACA,UAAA,KARJ,0C3DwoMA,6B2D5nMI,YAAA,MAZJ,2C3D4oMA,6B2D5nMI,aAAA,MAKJ,kBACE,MAAA,IACA,KAAA,IACA,eAAA,KAIF,qBACE,OAAA,M3D0oMJ,qCADA,sCADA,mBADA,oBAXA,gB4D73ME,iB5Dm4MF,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oCAqBA,oBADA,qBADA,oBADA,qBAXA,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,eAOA,aADA,cAGA,kBADA,mBAjBA,WADA,Y4Dl4MI,QAAA,MACA,QAAA,I5Dm6MJ,qCADA,mB4Dh6ME,gB5D65MF,uBADA,iBADA,wBAIA,mCAUA,oBADA,oBANA,WAGA,uBADA,qBADA,cAGA,aACA,kBATA,W4D75MI,MAAA,K5BNJ,c6BVE,QAAA,MACA,aAAA,KACA,YAAA,K7BWF,YACE,MAAA,gBAEF,WACE,MAAA,eAQF,MACE,QAAA,eAEF,MACE,QAAA,gBAEF,WACE,WAAA,OAEF,W8BzBE,KAAA,CAAA,CAAA,EAAA,EACA,MAAA,YACA,YAAA,KACA,iBAAA,YACA,OAAA,E9B8BF,QACE,QAAA,eAOF,OACE,SAAA,M+BjCF,cACE,MAAA,a/D88MF,YADA,YADA,Y+Dt8MA,YClBE,QAAA,ehEs+MF,kBACA,mBACA,yBALA,kBACA,mBACA,yBALA,kBACA,mBACA,yB+Dz8MA,kB/Dq8MA,mBACA,yB+D17ME,QAAA,eAIA,yBAAA,YCjDA,QAAA,gBACA,iBAAU,QAAA,gBACV,cAAU,QAAA,oBhE4/MV,cgE3/MA,cACU,QAAA,sBDkDV,yBAAA,kBACE,QAAA,iBAIF,yBAAA,mBACE,QAAA,kBAIF,yBAAA,yBACE,QAAA,wBAKF,+CAAA,YCtEA,QAAA,gBACA,iBAAU,QAAA,gBACV,cAAU,QAAA,oBhE0hNV,cgEzhNA,cACU,QAAA,sBDuEV,+CAAA,kBACE,QAAA,iBAIF,+CAAA,mBACE,QAAA,kBAIF,+CAAA,yBACE,QAAA,wBAKF,gDAAA,YC3FA,QAAA,gBACA,iBAAU,QAAA,gBACV,cAAU,QAAA,oBhEwjNV,cgEvjNA,cACU,QAAA,sBD4FV,gDAAA,kBACE,QAAA,iBAIF,gDAAA,mBACE,QAAA,kBAIF,gDAAA,yBACE,QAAA,wBAKF,0BAAA,YChHA,QAAA,gBACA,iBAAU,QAAA,gBACV,cAAU,QAAA,oBhEslNV,cgErlNA,cACU,QAAA,sBDiHV,0BAAA,kBACE,QAAA,iBAIF,0BAAA,mBACE,QAAA,kBAIF,0BAAA,yBACE,QAAA,wBAKF,yBAAA,WC7HA,QAAA,gBDkIA,+CAAA,WClIA,QAAA,gBDuIA,gDAAA,WCvIA,QAAA,gBD4IA,0BAAA,WC5IA,QAAA,gBDuJF,eCvJE,QAAA,eD0JA,aAAA,eClKA,QAAA,gBACA,oBAAU,QAAA,gBACV,iBAAU,QAAA,oBhE2oNV,iBgE1oNA,iBACU,QAAA,sBDkKZ,qBACE,QAAA,eAEA,aAAA,qBACE,QAAA,iBAGJ,sBACE,QAAA,eAEA,aAAA,sBACE,QAAA,kBAGJ,4BACE,QAAA,eAEA,aAAA,4BACE,QAAA,wBAKF,aAAA,cCrLA,QAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n 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\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n -moz-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n 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\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n -o-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because