summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkinitrupti2016-11-21 12:16:09 +0530
committerkinitrupti2016-11-21 12:16:09 +0530
commitdbaf7af91132ff93718678f2a5b42fee3d1b6acd (patch)
treeaec4d3f94c7423280499ad6264d24f586881b08f
parent19793cdf2025bb2a4560a0718ed5d6bce175e7b8 (diff)
downloadPython-TBC-Interface-dbaf7af91132ff93718678f2a5b42fee3d1b6acd.tar.gz
Python-TBC-Interface-dbaf7af91132ff93718678f2a5b42fee3d1b6acd.tar.bz2
Python-TBC-Interface-dbaf7af91132ff93718678f2a5b42fee3d1b6acd.zip
Admin css fixed
-rw-r--r--tbc/static/admin/__init__.py29
-rw-r--r--tbc/static/admin/actions.py88
-rw-r--r--tbc/static/admin/apps.py22
-rw-r--r--tbc/static/admin/checks.py973
-rw-r--r--tbc/static/admin/css/base.css967
-rw-r--r--tbc/static/admin/css/changelists.css341
-rw-r--r--tbc/static/admin/css/dashboard.css30
-rw-r--r--tbc/static/admin/css/fonts.css20
-rw-r--r--tbc/static/admin/css/forms.css499
-rw-r--r--tbc/static/admin/css/login.css78
-rw-r--r--tbc/static/admin/css/rtl.css256
-rw-r--r--tbc/static/admin/css/widgets.css565
-rw-r--r--tbc/static/admin/decorators.py28
-rw-r--r--tbc/static/admin/exceptions.py11
-rw-r--r--tbc/static/admin/filters.py416
-rwxr-xr-xtbc/static/admin/fonts/LICENSE.txt202
-rw-r--r--tbc/static/admin/fonts/README.txt2
-rw-r--r--tbc/static/admin/fonts/Roboto-Bold-webfont.woffbin0 -> 82564 bytes
-rw-r--r--tbc/static/admin/fonts/Roboto-Light-webfont.woffbin0 -> 81348 bytes
-rw-r--r--tbc/static/admin/fonts/Roboto-Regular-webfont.woffbin0 -> 80304 bytes
-rw-r--r--tbc/static/admin/forms.py29
-rw-r--r--tbc/static/admin/helpers.py371
-rw-r--r--tbc/static/admin/img/LICENSE20
-rw-r--r--tbc/static/admin/img/README.txt7
-rw-r--r--tbc/static/admin/img/calendar-icons.svg14
-rw-r--r--tbc/static/admin/img/gis/move_vertex_off.svg1
-rw-r--r--tbc/static/admin/img/gis/move_vertex_on.svg1
-rw-r--r--tbc/static/admin/img/icon-addlink.svg3
-rw-r--r--tbc/static/admin/img/icon-alert.svg3
-rw-r--r--tbc/static/admin/img/icon-calendar.svg9
-rw-r--r--tbc/static/admin/img/icon-changelink.svg3
-rw-r--r--tbc/static/admin/img/icon-clock.svg9
-rw-r--r--tbc/static/admin/img/icon-deletelink.svg3
-rw-r--r--tbc/static/admin/img/icon-no.svg3
-rw-r--r--tbc/static/admin/img/icon-unknown-alt.svg3
-rw-r--r--tbc/static/admin/img/icon-unknown.svg3
-rw-r--r--tbc/static/admin/img/icon-yes.svg3
-rw-r--r--tbc/static/admin/img/inline-delete.svg3
-rw-r--r--tbc/static/admin/img/search.svg3
-rw-r--r--tbc/static/admin/img/selector-icons.svg34
-rw-r--r--tbc/static/admin/img/sorting-icons.svg19
-rw-r--r--tbc/static/admin/img/tooltag-add.svg3
-rw-r--r--tbc/static/admin/img/tooltag-arrowright.svg3
-rw-r--r--tbc/static/admin/js/SelectBox.js135
-rw-r--r--tbc/static/admin/js/SelectFilter2.js198
-rw-r--r--tbc/static/admin/js/actions.js146
-rw-r--r--tbc/static/admin/js/actions.min.js6
-rw-r--r--tbc/static/admin/js/admin/DateTimeShortcuts.js364
-rw-r--r--tbc/static/admin/js/admin/RelatedObjectLookups.js160
-rw-r--r--tbc/static/admin/js/calendar.js178
-rw-r--r--tbc/static/admin/js/collapse.js26
-rw-r--r--tbc/static/admin/js/collapse.min.js2
-rw-r--r--tbc/static/admin/js/core.js263
-rw-r--r--tbc/static/admin/js/inlines.js275
-rw-r--r--tbc/static/admin/js/inlines.min.js9
-rw-r--r--tbc/static/admin/js/jquery.init.js8
-rw-r--r--tbc/static/admin/js/prepopulate.js42
-rw-r--r--tbc/static/admin/js/prepopulate.min.js1
-rw-r--r--tbc/static/admin/js/timeparse.js106
-rw-r--r--tbc/static/admin/js/urlify.js171
-rw-r--r--tbc/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt26
-rw-r--r--tbc/static/admin/js/vendor/jquery/jquery.js9210
-rw-r--r--tbc/static/admin/js/vendor/jquery/jquery.min.js4
-rw-r--r--tbc/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt21
-rw-r--r--tbc/static/admin/js/vendor/xregexp/xregexp.min.js18
-rw-r--r--tbc/static/admin/locale/af/LC_MESSAGES/django.mobin0 -> 10374 bytes
-rw-r--r--tbc/static/admin/locale/af/LC_MESSAGES/django.po646
-rw-r--r--tbc/static/admin/locale/af/LC_MESSAGES/djangojs.mobin0 -> 1158 bytes
-rw-r--r--tbc/static/admin/locale/af/LC_MESSAGES/djangojs.po149
-rw-r--r--tbc/static/admin/locale/ar/LC_MESSAGES/django.mobin0 -> 18899 bytes
-rw-r--r--tbc/static/admin/locale/ar/LC_MESSAGES/django.po680
-rw-r--r--tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.mobin0 -> 5235 bytes
-rw-r--r--tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.po172
-rw-r--r--tbc/static/admin/locale/ast/LC_MESSAGES/django.mobin0 -> 2476 bytes
-rw-r--r--tbc/static/admin/locale/ast/LC_MESSAGES/django.po629
-rw-r--r--tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.mobin0 -> 2348 bytes
-rw-r--r--tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.po157
-rw-r--r--tbc/static/admin/locale/az/LC_MESSAGES/django.mobin0 -> 12888 bytes
-rw-r--r--tbc/static/admin/locale/az/LC_MESSAGES/django.po660
-rw-r--r--tbc/static/admin/locale/az/LC_MESSAGES/djangojs.mobin0 -> 3451 bytes
-rw-r--r--tbc/static/admin/locale/az/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/be/LC_MESSAGES/django.mobin0 -> 17963 bytes
-rw-r--r--tbc/static/admin/locale/be/LC_MESSAGES/django.po671
-rw-r--r--tbc/static/admin/locale/be/LC_MESSAGES/djangojs.mobin0 -> 5281 bytes
-rw-r--r--tbc/static/admin/locale/be/LC_MESSAGES/djangojs.po169
-rw-r--r--tbc/static/admin/locale/bg/LC_MESSAGES/django.mobin0 -> 19795 bytes
-rw-r--r--tbc/static/admin/locale/bg/LC_MESSAGES/django.po682
-rw-r--r--tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.mobin0 -> 4965 bytes
-rw-r--r--tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.po164
-rw-r--r--tbc/static/admin/locale/bn/LC_MESSAGES/django.mobin0 -> 17043 bytes
-rw-r--r--tbc/static/admin/locale/bn/LC_MESSAGES/django.po649
-rw-r--r--tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.mobin0 -> 2751 bytes
-rw-r--r--tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.po152
-rw-r--r--tbc/static/admin/locale/br/LC_MESSAGES/django.mobin0 -> 4338 bytes
-rw-r--r--tbc/static/admin/locale/br/LC_MESSAGES/django.po624
-rw-r--r--tbc/static/admin/locale/br/LC_MESSAGES/djangojs.mobin0 -> 1598 bytes
-rw-r--r--tbc/static/admin/locale/br/LC_MESSAGES/djangojs.po149
-rw-r--r--tbc/static/admin/locale/bs/LC_MESSAGES/django.mobin0 -> 9843 bytes
-rw-r--r--tbc/static/admin/locale/bs/LC_MESSAGES/django.po652
-rw-r--r--tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.mobin0 -> 1183 bytes
-rw-r--r--tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.po155
-rw-r--r--tbc/static/admin/locale/ca/LC_MESSAGES/django.mobin0 -> 16624 bytes
-rw-r--r--tbc/static/admin/locale/ca/LC_MESSAGES/django.po684
-rw-r--r--tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.mobin0 -> 4069 bytes
-rw-r--r--tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/cs/LC_MESSAGES/django.mobin0 -> 16575 bytes
-rw-r--r--tbc/static/admin/locale/cs/LC_MESSAGES/django.po685
-rw-r--r--tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.mobin0 -> 4317 bytes
-rw-r--r--tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.po168
-rw-r--r--tbc/static/admin/locale/cy/LC_MESSAGES/django.mobin0 -> 14777 bytes
-rw-r--r--tbc/static/admin/locale/cy/LC_MESSAGES/django.po678
-rw-r--r--tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.mobin0 -> 4043 bytes
-rw-r--r--tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.po168
-rw-r--r--tbc/static/admin/locale/da/LC_MESSAGES/django.mobin0 -> 15589 bytes
-rw-r--r--tbc/static/admin/locale/da/LC_MESSAGES/django.po679
-rw-r--r--tbc/static/admin/locale/da/LC_MESSAGES/djangojs.mobin0 -> 3856 bytes
-rw-r--r--tbc/static/admin/locale/da/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/de/LC_MESSAGES/django.mobin0 -> 16794 bytes
-rw-r--r--tbc/static/admin/locale/de/LC_MESSAGES/django.po690
-rw-r--r--tbc/static/admin/locale/de/LC_MESSAGES/djangojs.mobin0 -> 4093 bytes
-rw-r--r--tbc/static/admin/locale/de/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/el/LC_MESSAGES/django.mobin0 -> 21990 bytes
-rw-r--r--tbc/static/admin/locale/el/LC_MESSAGES/django.po700
-rw-r--r--tbc/static/admin/locale/el/LC_MESSAGES/djangojs.mobin0 -> 5197 bytes
-rw-r--r--tbc/static/admin/locale/el/LC_MESSAGES/djangojs.po167
-rw-r--r--tbc/static/admin/locale/en/LC_MESSAGES/django.mobin0 -> 356 bytes
-rw-r--r--tbc/static/admin/locale/en/LC_MESSAGES/django.po846
-rw-r--r--tbc/static/admin/locale/en/LC_MESSAGES/djangojs.mobin0 -> 356 bytes
-rw-r--r--tbc/static/admin/locale/en/LC_MESSAGES/djangojs.po189
-rw-r--r--tbc/static/admin/locale/en_AU/LC_MESSAGES/django.mobin0 -> 4308 bytes
-rw-r--r--tbc/static/admin/locale/en_AU/LC_MESSAGES/django.po636
-rw-r--r--tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.mobin0 -> 1714 bytes
-rw-r--r--tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.po153
-rw-r--r--tbc/static/admin/locale/en_GB/LC_MESSAGES/django.mobin0 -> 11700 bytes
-rw-r--r--tbc/static/admin/locale/en_GB/LC_MESSAGES/django.po656
-rw-r--r--tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.mobin0 -> 3395 bytes
-rw-r--r--tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.po164
-rw-r--r--tbc/static/admin/locale/eo/LC_MESSAGES/django.mobin0 -> 15809 bytes
-rw-r--r--tbc/static/admin/locale/eo/LC_MESSAGES/django.po682
-rw-r--r--tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.mobin0 -> 3949 bytes
-rw-r--r--tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/es/LC_MESSAGES/django.mobin0 -> 16736 bytes
-rw-r--r--tbc/static/admin/locale/es/LC_MESSAGES/django.po700
-rw-r--r--tbc/static/admin/locale/es/LC_MESSAGES/djangojs.mobin0 -> 4125 bytes
-rw-r--r--tbc/static/admin/locale/es/LC_MESSAGES/djangojs.po170
-rw-r--r--tbc/static/admin/locale/es_AR/LC_MESSAGES/django.mobin0 -> 16920 bytes
-rw-r--r--tbc/static/admin/locale/es_AR/LC_MESSAGES/django.po690
-rw-r--r--tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.mobin0 -> 4390 bytes
-rw-r--r--tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.po174
-rw-r--r--tbc/static/admin/locale/es_CO/LC_MESSAGES/django.mobin0 -> 16728 bytes
-rw-r--r--tbc/static/admin/locale/es_CO/LC_MESSAGES/django.po697
-rw-r--r--tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.mobin0 -> 4133 bytes
-rw-r--r--tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.po169
-rw-r--r--tbc/static/admin/locale/es_MX/LC_MESSAGES/django.mobin0 -> 15662 bytes
-rw-r--r--tbc/static/admin/locale/es_MX/LC_MESSAGES/django.po683
-rw-r--r--tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.mobin0 -> 3630 bytes
-rw-r--r--tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.po165
-rw-r--r--tbc/static/admin/locale/es_VE/LC_MESSAGES/django.mobin0 -> 486 bytes
-rw-r--r--tbc/static/admin/locale/es_VE/LC_MESSAGES/django.po609
-rw-r--r--tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.mobin0 -> 486 bytes
-rw-r--r--tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.po145
-rw-r--r--tbc/static/admin/locale/et/LC_MESSAGES/django.mobin0 -> 15797 bytes
-rw-r--r--tbc/static/admin/locale/et/LC_MESSAGES/django.po677
-rw-r--r--tbc/static/admin/locale/et/LC_MESSAGES/djangojs.mobin0 -> 3885 bytes
-rw-r--r--tbc/static/admin/locale/et/LC_MESSAGES/djangojs.po165
-rw-r--r--tbc/static/admin/locale/eu/LC_MESSAGES/django.mobin0 -> 14271 bytes
-rw-r--r--tbc/static/admin/locale/eu/LC_MESSAGES/django.po672
-rw-r--r--tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.mobin0 -> 3414 bytes
-rw-r--r--tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.po163
-rw-r--r--tbc/static/admin/locale/fa/LC_MESSAGES/django.mobin0 -> 19003 bytes
-rw-r--r--tbc/static/admin/locale/fa/LC_MESSAGES/django.po678
-rw-r--r--tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.mobin0 -> 4626 bytes
-rw-r--r--tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.po162
-rw-r--r--tbc/static/admin/locale/fi/LC_MESSAGES/django.mobin0 -> 15835 bytes
-rw-r--r--tbc/static/admin/locale/fi/LC_MESSAGES/django.po674
-rw-r--r--tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.mobin0 -> 4052 bytes
-rw-r--r--tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/fr/LC_MESSAGES/django.mobin0 -> 17386 bytes
-rw-r--r--tbc/static/admin/locale/fr/LC_MESSAGES/django.po693
-rw-r--r--tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.mobin0 -> 4233 bytes
-rw-r--r--tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/fy/LC_MESSAGES/django.mobin0 -> 476 bytes
-rw-r--r--tbc/static/admin/locale/fy/LC_MESSAGES/django.po609
-rw-r--r--tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.mobin0 -> 476 bytes
-rw-r--r--tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.po145
-rw-r--r--tbc/static/admin/locale/ga/LC_MESSAGES/django.mobin0 -> 15276 bytes
-rw-r--r--tbc/static/admin/locale/ga/LC_MESSAGES/django.po685
-rw-r--r--tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.mobin0 -> 4638 bytes
-rw-r--r--tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.po179
-rw-r--r--tbc/static/admin/locale/gd/LC_MESSAGES/django.mobin0 -> 18124 bytes
-rw-r--r--tbc/static/admin/locale/gd/LC_MESSAGES/django.po704
-rw-r--r--tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.mobin0 -> 4750 bytes
-rw-r--r--tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.po183
-rw-r--r--tbc/static/admin/locale/gl/LC_MESSAGES/django.mobin0 -> 14481 bytes
-rw-r--r--tbc/static/admin/locale/gl/LC_MESSAGES/django.po677
-rw-r--r--tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.mobin0 -> 3529 bytes
-rw-r--r--tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.po167
-rw-r--r--tbc/static/admin/locale/he/LC_MESSAGES/django.mobin0 -> 17402 bytes
-rw-r--r--tbc/static/admin/locale/he/LC_MESSAGES/django.po664
-rw-r--r--tbc/static/admin/locale/he/LC_MESSAGES/djangojs.mobin0 -> 4256 bytes
-rw-r--r--tbc/static/admin/locale/he/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/hi/LC_MESSAGES/django.mobin0 -> 20750 bytes
-rw-r--r--tbc/static/admin/locale/hi/LC_MESSAGES/django.po665
-rw-r--r--tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.mobin0 -> 5291 bytes
-rw-r--r--tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/hr/LC_MESSAGES/django.mobin0 -> 15686 bytes
-rw-r--r--tbc/static/admin/locale/hr/LC_MESSAGES/django.po684
-rw-r--r--tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.mobin0 -> 3477 bytes
-rw-r--r--tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.po168
-rw-r--r--tbc/static/admin/locale/hu/LC_MESSAGES/django.mobin0 -> 14579 bytes
-rw-r--r--tbc/static/admin/locale/hu/LC_MESSAGES/django.po670
-rw-r--r--tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.mobin0 -> 3456 bytes
-rw-r--r--tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/ia/LC_MESSAGES/django.mobin0 -> 12274 bytes
-rw-r--r--tbc/static/admin/locale/ia/LC_MESSAGES/django.po659
-rw-r--r--tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.mobin0 -> 3432 bytes
-rw-r--r--tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.po162
-rw-r--r--tbc/static/admin/locale/id/LC_MESSAGES/django.mobin0 -> 14803 bytes
-rw-r--r--tbc/static/admin/locale/id/LC_MESSAGES/django.po676
-rw-r--r--tbc/static/admin/locale/id/LC_MESSAGES/djangojs.mobin0 -> 3776 bytes
-rw-r--r--tbc/static/admin/locale/id/LC_MESSAGES/djangojs.po163
-rw-r--r--tbc/static/admin/locale/io/LC_MESSAGES/django.mobin0 -> 14146 bytes
-rw-r--r--tbc/static/admin/locale/io/LC_MESSAGES/django.po669
-rw-r--r--tbc/static/admin/locale/io/LC_MESSAGES/djangojs.mobin0 -> 464 bytes
-rw-r--r--tbc/static/admin/locale/io/LC_MESSAGES/djangojs.po145
-rw-r--r--tbc/static/admin/locale/is/LC_MESSAGES/django.mobin0 -> 12719 bytes
-rw-r--r--tbc/static/admin/locale/is/LC_MESSAGES/django.po660
-rw-r--r--tbc/static/admin/locale/is/LC_MESSAGES/djangojs.mobin0 -> 3471 bytes
-rw-r--r--tbc/static/admin/locale/is/LC_MESSAGES/djangojs.po163
-rw-r--r--tbc/static/admin/locale/it/LC_MESSAGES/django.mobin0 -> 16365 bytes
-rw-r--r--tbc/static/admin/locale/it/LC_MESSAGES/django.po689
-rw-r--r--tbc/static/admin/locale/it/LC_MESSAGES/djangojs.mobin0 -> 4033 bytes
-rw-r--r--tbc/static/admin/locale/it/LC_MESSAGES/djangojs.po168
-rw-r--r--tbc/static/admin/locale/ja/LC_MESSAGES/django.mobin0 -> 17528 bytes
-rw-r--r--tbc/static/admin/locale/ja/LC_MESSAGES/django.po670
-rw-r--r--tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.mobin0 -> 4186 bytes
-rw-r--r--tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.po157
-rw-r--r--tbc/static/admin/locale/ka/LC_MESSAGES/django.mobin0 -> 22502 bytes
-rw-r--r--tbc/static/admin/locale/ka/LC_MESSAGES/django.po671
-rw-r--r--tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.mobin0 -> 5640 bytes
-rw-r--r--tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/kk/LC_MESSAGES/django.mobin0 -> 13951 bytes
-rw-r--r--tbc/static/admin/locale/kk/LC_MESSAGES/django.po654
-rw-r--r--tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.mobin0 -> 2687 bytes
-rw-r--r--tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.po153
-rw-r--r--tbc/static/admin/locale/km/LC_MESSAGES/django.mobin0 -> 11440 bytes
-rw-r--r--tbc/static/admin/locale/km/LC_MESSAGES/django.po631
-rw-r--r--tbc/static/admin/locale/km/LC_MESSAGES/djangojs.mobin0 -> 1566 bytes
-rw-r--r--tbc/static/admin/locale/km/LC_MESSAGES/djangojs.po147
-rw-r--r--tbc/static/admin/locale/kn/LC_MESSAGES/django.mobin0 -> 10079 bytes
-rw-r--r--tbc/static/admin/locale/kn/LC_MESSAGES/django.po634
-rw-r--r--tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.mobin0 -> 2259 bytes
-rw-r--r--tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.po149
-rw-r--r--tbc/static/admin/locale/ko/LC_MESSAGES/django.mobin0 -> 16254 bytes
-rw-r--r--tbc/static/admin/locale/ko/LC_MESSAGES/django.po666
-rw-r--r--tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.mobin0 -> 3856 bytes
-rw-r--r--tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.po157
-rw-r--r--tbc/static/admin/locale/lb/LC_MESSAGES/django.mobin0 -> 913 bytes
-rw-r--r--tbc/static/admin/locale/lb/LC_MESSAGES/django.po625
-rw-r--r--tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.mobin0 -> 474 bytes
-rw-r--r--tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.po145
-rw-r--r--tbc/static/admin/locale/lt/LC_MESSAGES/django.mobin0 -> 16396 bytes
-rw-r--r--tbc/static/admin/locale/lt/LC_MESSAGES/django.po688
-rw-r--r--tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.mobin0 -> 4433 bytes
-rw-r--r--tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.po176
-rw-r--r--tbc/static/admin/locale/lv/LC_MESSAGES/django.mobin0 -> 10123 bytes
-rw-r--r--tbc/static/admin/locale/lv/LC_MESSAGES/django.po646
-rw-r--r--tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.mobin0 -> 2474 bytes
-rw-r--r--tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/mk/LC_MESSAGES/django.mobin0 -> 20036 bytes
-rw-r--r--tbc/static/admin/locale/mk/LC_MESSAGES/django.po682
-rw-r--r--tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.mobin0 -> 4947 bytes
-rw-r--r--tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.po164
-rw-r--r--tbc/static/admin/locale/ml/LC_MESSAGES/django.mobin0 -> 23740 bytes
-rw-r--r--tbc/static/admin/locale/ml/LC_MESSAGES/django.po664
-rw-r--r--tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.mobin0 -> 6815 bytes
-rw-r--r--tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/mn/LC_MESSAGES/django.mobin0 -> 20005 bytes
-rw-r--r--tbc/static/admin/locale/mn/LC_MESSAGES/django.po681
-rw-r--r--tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.mobin0 -> 4718 bytes
-rw-r--r--tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.po162
-rw-r--r--tbc/static/admin/locale/mr/LC_MESSAGES/django.mobin0 -> 468 bytes
-rw-r--r--tbc/static/admin/locale/mr/LC_MESSAGES/django.po609
-rw-r--r--tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.mobin0 -> 468 bytes
-rw-r--r--tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.po145
-rw-r--r--tbc/static/admin/locale/my/LC_MESSAGES/django.mobin0 -> 3677 bytes
-rw-r--r--tbc/static/admin/locale/my/LC_MESSAGES/django.po622
-rw-r--r--tbc/static/admin/locale/my/LC_MESSAGES/djangojs.mobin0 -> 3359 bytes
-rw-r--r--tbc/static/admin/locale/my/LC_MESSAGES/djangojs.po150
-rw-r--r--tbc/static/admin/locale/nb/LC_MESSAGES/django.mobin0 -> 15619 bytes
-rw-r--r--tbc/static/admin/locale/nb/LC_MESSAGES/django.po679
-rw-r--r--tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.mobin0 -> 3872 bytes
-rw-r--r--tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/ne/LC_MESSAGES/django.mobin0 -> 17677 bytes
-rw-r--r--tbc/static/admin/locale/ne/LC_MESSAGES/django.po644
-rw-r--r--tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.mobin0 -> 4788 bytes
-rw-r--r--tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.po157
-rw-r--r--tbc/static/admin/locale/nl/LC_MESSAGES/django.mobin0 -> 16137 bytes
-rw-r--r--tbc/static/admin/locale/nl/LC_MESSAGES/django.po686
-rw-r--r--tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.mobin0 -> 4182 bytes
-rw-r--r--tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.po170
-rw-r--r--tbc/static/admin/locale/nn/LC_MESSAGES/django.mobin0 -> 11844 bytes
-rw-r--r--tbc/static/admin/locale/nn/LC_MESSAGES/django.po657
-rw-r--r--tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.mobin0 -> 3365 bytes
-rw-r--r--tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.po163
-rw-r--r--tbc/static/admin/locale/os/LC_MESSAGES/django.mobin0 -> 16586 bytes
-rw-r--r--tbc/static/admin/locale/os/LC_MESSAGES/django.po660
-rw-r--r--tbc/static/admin/locale/os/LC_MESSAGES/djangojs.mobin0 -> 4120 bytes
-rw-r--r--tbc/static/admin/locale/os/LC_MESSAGES/djangojs.po162
-rw-r--r--tbc/static/admin/locale/pa/LC_MESSAGES/django.mobin0 -> 11297 bytes
-rw-r--r--tbc/static/admin/locale/pa/LC_MESSAGES/django.po630
-rw-r--r--tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.mobin0 -> 1551 bytes
-rw-r--r--tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.po149
-rw-r--r--tbc/static/admin/locale/pl/LC_MESSAGES/django.mobin0 -> 16232 bytes
-rw-r--r--tbc/static/admin/locale/pl/LC_MESSAGES/django.po693
-rw-r--r--tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.mobin0 -> 4220 bytes
-rw-r--r--tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.po176
-rw-r--r--tbc/static/admin/locale/pt/LC_MESSAGES/django.mobin0 -> 16606 bytes
-rw-r--r--tbc/static/admin/locale/pt/LC_MESSAGES/django.po690
-rw-r--r--tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.mobin0 -> 4077 bytes
-rw-r--r--tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.po168
-rw-r--r--tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.mobin0 -> 16307 bytes
-rw-r--r--tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.po689
-rw-r--r--tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.mobin0 -> 4109 bytes
-rw-r--r--tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.po165
-rw-r--r--tbc/static/admin/locale/ro/LC_MESSAGES/django.mobin0 -> 14307 bytes
-rw-r--r--tbc/static/admin/locale/ro/LC_MESSAGES/django.po678
-rw-r--r--tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.mobin0 -> 3676 bytes
-rw-r--r--tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.po172
-rw-r--r--tbc/static/admin/locale/ru/LC_MESSAGES/django.mobin0 -> 21036 bytes
-rw-r--r--tbc/static/admin/locale/ru/LC_MESSAGES/django.po691
-rw-r--r--tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.mobin0 -> 6075 bytes
-rw-r--r--tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.po180
-rw-r--r--tbc/static/admin/locale/sk/LC_MESSAGES/django.mobin0 -> 15480 bytes
-rw-r--r--tbc/static/admin/locale/sk/LC_MESSAGES/django.po679
-rw-r--r--tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.mobin0 -> 3920 bytes
-rw-r--r--tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.po167
-rw-r--r--tbc/static/admin/locale/sl/LC_MESSAGES/django.mobin0 -> 14318 bytes
-rw-r--r--tbc/static/admin/locale/sl/LC_MESSAGES/django.po677
-rw-r--r--tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.mobin0 -> 3431 bytes
-rw-r--r--tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.po170
-rw-r--r--tbc/static/admin/locale/sq/LC_MESSAGES/django.mobin0 -> 16563 bytes
-rw-r--r--tbc/static/admin/locale/sq/LC_MESSAGES/django.po684
-rw-r--r--tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.mobin0 -> 4088 bytes
-rw-r--r--tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.po165
-rw-r--r--tbc/static/admin/locale/sr/LC_MESSAGES/django.mobin0 -> 15431 bytes
-rw-r--r--tbc/static/admin/locale/sr/LC_MESSAGES/django.po660
-rw-r--r--tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.mobin0 -> 3812 bytes
-rw-r--r--tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.mobin0 -> 12413 bytes
-rw-r--r--tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.po660
-rw-r--r--tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mobin0 -> 3220 bytes
-rw-r--r--tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po161
-rw-r--r--tbc/static/admin/locale/sv/LC_MESSAGES/django.mobin0 -> 15453 bytes
-rw-r--r--tbc/static/admin/locale/sv/LC_MESSAGES/django.po682
-rw-r--r--tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.mobin0 -> 3887 bytes
-rw-r--r--tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.po167
-rw-r--r--tbc/static/admin/locale/sw/LC_MESSAGES/django.mobin0 -> 14702 bytes
-rw-r--r--tbc/static/admin/locale/sw/LC_MESSAGES/django.po675
-rw-r--r--tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.mobin0 -> 3892 bytes
-rw-r--r--tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.po163
-rw-r--r--tbc/static/admin/locale/ta/LC_MESSAGES/django.mobin0 -> 11074 bytes
-rw-r--r--tbc/static/admin/locale/ta/LC_MESSAGES/django.po637
-rw-r--r--tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.mobin0 -> 1791 bytes
-rw-r--r--tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.po148
-rw-r--r--tbc/static/admin/locale/te/LC_MESSAGES/django.mobin0 -> 11924 bytes
-rw-r--r--tbc/static/admin/locale/te/LC_MESSAGES/django.po633
-rw-r--r--tbc/static/admin/locale/te/LC_MESSAGES/djangojs.mobin0 -> 1801 bytes
-rw-r--r--tbc/static/admin/locale/te/LC_MESSAGES/djangojs.po149
-rw-r--r--tbc/static/admin/locale/th/LC_MESSAGES/django.mobin0 -> 20804 bytes
-rw-r--r--tbc/static/admin/locale/th/LC_MESSAGES/django.po647
-rw-r--r--tbc/static/admin/locale/th/LC_MESSAGES/djangojs.mobin0 -> 5022 bytes
-rw-r--r--tbc/static/admin/locale/th/LC_MESSAGES/djangojs.po158
-rw-r--r--tbc/static/admin/locale/tr/LC_MESSAGES/django.mobin0 -> 16509 bytes
-rw-r--r--tbc/static/admin/locale/tr/LC_MESSAGES/django.po689
-rw-r--r--tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.mobin0 -> 4045 bytes
-rw-r--r--tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/tt/LC_MESSAGES/django.mobin0 -> 14135 bytes
-rw-r--r--tbc/static/admin/locale/tt/LC_MESSAGES/django.po650
-rw-r--r--tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.mobin0 -> 2918 bytes
-rw-r--r--tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.po154
-rw-r--r--tbc/static/admin/locale/udm/LC_MESSAGES/django.mobin0 -> 622 bytes
-rw-r--r--tbc/static/admin/locale/udm/LC_MESSAGES/django.po606
-rw-r--r--tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.mobin0 -> 462 bytes
-rw-r--r--tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.po142
-rw-r--r--tbc/static/admin/locale/uk/LC_MESSAGES/django.mobin0 -> 20038 bytes
-rw-r--r--tbc/static/admin/locale/uk/LC_MESSAGES/django.po691
-rw-r--r--tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.mobin0 -> 4936 bytes
-rw-r--r--tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.po169
-rw-r--r--tbc/static/admin/locale/ur/LC_MESSAGES/django.mobin0 -> 14315 bytes
-rw-r--r--tbc/static/admin/locale/ur/LC_MESSAGES/django.po656
-rw-r--r--tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.mobin0 -> 2969 bytes
-rw-r--r--tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.po155
-rw-r--r--tbc/static/admin/locale/vi/LC_MESSAGES/django.mobin0 -> 15898 bytes
-rw-r--r--tbc/static/admin/locale/vi/LC_MESSAGES/django.po674
-rw-r--r--tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.mobin0 -> 4049 bytes
-rw-r--r--tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.po166
-rw-r--r--tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.mobin0 -> 14698 bytes
-rw-r--r--tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.po655
-rw-r--r--tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.mobin0 -> 3492 bytes
-rw-r--r--tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.po157
-rw-r--r--tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.mobin0 -> 14728 bytes
-rw-r--r--tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.po640
-rw-r--r--tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mobin0 -> 3569 bytes
-rw-r--r--tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po154
-rw-r--r--tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.mobin0 -> 13544 bytes
-rw-r--r--tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.po631
-rw-r--r--tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mobin0 -> 3324 bytes
-rw-r--r--tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po153
-rw-r--r--tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.mobin0 -> 14211 bytes
-rw-r--r--tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.po649
-rw-r--r--tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.mobin0 -> 3251 bytes
-rw-r--r--tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.po156
-rw-r--r--tbc/static/admin/migrations/0001_initial.py50
-rw-r--r--tbc/static/admin/migrations/0002_logentry_remove_auto_add.py25
-rw-r--r--tbc/static/admin/migrations/__init__.py0
-rw-r--r--tbc/static/admin/models.py101
-rw-r--r--tbc/static/admin/options.py1916
-rw-r--r--tbc/static/admin/sites.py535
-rw-r--r--tbc/static/admin/static/admin/css/base.css967
-rw-r--r--tbc/static/admin/static/admin/css/changelists.css341
-rw-r--r--tbc/static/admin/static/admin/css/dashboard.css30
-rw-r--r--tbc/static/admin/static/admin/css/fonts.css20
-rw-r--r--tbc/static/admin/static/admin/css/forms.css499
-rw-r--r--tbc/static/admin/static/admin/css/login.css78
-rw-r--r--tbc/static/admin/static/admin/css/rtl.css256
-rw-r--r--tbc/static/admin/static/admin/css/widgets.css565
-rwxr-xr-xtbc/static/admin/static/admin/fonts/LICENSE.txt202
-rw-r--r--tbc/static/admin/static/admin/fonts/README.txt2
-rw-r--r--tbc/static/admin/static/admin/fonts/Roboto-Bold-webfont.woffbin0 -> 82564 bytes
-rw-r--r--tbc/static/admin/static/admin/fonts/Roboto-Light-webfont.woffbin0 -> 81348 bytes
-rw-r--r--tbc/static/admin/static/admin/fonts/Roboto-Regular-webfont.woffbin0 -> 80304 bytes
-rw-r--r--tbc/static/admin/static/admin/img/LICENSE20
-rw-r--r--tbc/static/admin/static/admin/img/README.txt7
-rw-r--r--tbc/static/admin/static/admin/img/calendar-icons.svg14
-rw-r--r--tbc/static/admin/static/admin/img/gis/move_vertex_off.svg1
-rw-r--r--tbc/static/admin/static/admin/img/gis/move_vertex_on.svg1
-rw-r--r--tbc/static/admin/static/admin/img/icon-addlink.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-alert.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-calendar.svg9
-rw-r--r--tbc/static/admin/static/admin/img/icon-changelink.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-clock.svg9
-rw-r--r--tbc/static/admin/static/admin/img/icon-deletelink.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-no.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-unknown-alt.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-unknown.svg3
-rw-r--r--tbc/static/admin/static/admin/img/icon-yes.svg3
-rw-r--r--tbc/static/admin/static/admin/img/inline-delete.svg3
-rw-r--r--tbc/static/admin/static/admin/img/search.svg3
-rw-r--r--tbc/static/admin/static/admin/img/selector-icons.svg34
-rw-r--r--tbc/static/admin/static/admin/img/sorting-icons.svg19
-rw-r--r--tbc/static/admin/static/admin/img/tooltag-add.svg3
-rw-r--r--tbc/static/admin/static/admin/img/tooltag-arrowright.svg3
-rw-r--r--tbc/static/admin/static/admin/js/SelectBox.js135
-rw-r--r--tbc/static/admin/static/admin/js/SelectFilter2.js198
-rw-r--r--tbc/static/admin/static/admin/js/actions.js146
-rw-r--r--tbc/static/admin/static/admin/js/actions.min.js6
-rw-r--r--tbc/static/admin/static/admin/js/admin/DateTimeShortcuts.js364
-rw-r--r--tbc/static/admin/static/admin/js/admin/RelatedObjectLookups.js160
-rw-r--r--tbc/static/admin/static/admin/js/calendar.js178
-rw-r--r--tbc/static/admin/static/admin/js/collapse.js26
-rw-r--r--tbc/static/admin/static/admin/js/collapse.min.js2
-rw-r--r--tbc/static/admin/static/admin/js/core.js263
-rw-r--r--tbc/static/admin/static/admin/js/inlines.js275
-rw-r--r--tbc/static/admin/static/admin/js/inlines.min.js9
-rw-r--r--tbc/static/admin/static/admin/js/jquery.init.js8
-rw-r--r--tbc/static/admin/static/admin/js/prepopulate.js42
-rw-r--r--tbc/static/admin/static/admin/js/prepopulate.min.js1
-rw-r--r--tbc/static/admin/static/admin/js/timeparse.js106
-rw-r--r--tbc/static/admin/static/admin/js/urlify.js171
-rw-r--r--tbc/static/admin/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt26
-rw-r--r--tbc/static/admin/static/admin/js/vendor/jquery/jquery.js9210
-rw-r--r--tbc/static/admin/static/admin/js/vendor/jquery/jquery.min.js4
-rw-r--r--tbc/static/admin/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt21
-rw-r--r--tbc/static/admin/static/admin/js/vendor/xregexp/xregexp.min.js18
-rw-r--r--tbc/static/admin/templates/admin/404.html12
-rw-r--r--tbc/static/admin/templates/admin/500.html17
-rw-r--r--tbc/static/admin/templates/admin/actions.html16
-rw-r--r--tbc/static/admin/templates/admin/app_index.html18
-rw-r--r--tbc/static/admin/templates/admin/auth/user/add_form.html14
-rw-r--r--tbc/static/admin/templates/admin/auth/user/change_password.html60
-rw-r--r--tbc/static/admin/templates/admin/base.html88
-rw-r--r--tbc/static/admin/templates/admin/base_site.html9
-rw-r--r--tbc/static/admin/templates/admin/change_form.html122
-rw-r--r--tbc/static/admin/templates/admin/change_list.html98
-rw-r--r--tbc/static/admin/templates/admin/change_list_results.html38
-rw-r--r--tbc/static/admin/templates/admin/date_hierarchy.html10
-rw-r--r--tbc/static/admin/templates/admin/delete_confirmation.html46
-rw-r--r--tbc/static/admin/templates/admin/delete_selected_confirmation.html49
-rw-r--r--tbc/static/admin/templates/admin/edit_inline/stacked.html30
-rw-r--r--tbc/static/admin/templates/admin/edit_inline/tabular.html83
-rw-r--r--tbc/static/admin/templates/admin/filter.html8
-rw-r--r--tbc/static/admin/templates/admin/includes/fieldset.html29
-rw-r--r--tbc/static/admin/templates/admin/includes/object_delete_summary.html7
-rw-r--r--tbc/static/admin/templates/admin/index.html82
-rw-r--r--tbc/static/admin/templates/admin/invalid_setup.html13
-rw-r--r--tbc/static/admin/templates/admin/login.html69
-rw-r--r--tbc/static/admin/templates/admin/object_history.html42
-rw-r--r--tbc/static/admin/templates/admin/pagination.html12
-rw-r--r--tbc/static/admin/templates/admin/popup_response.html15
-rw-r--r--tbc/static/admin/templates/admin/prepopulated_fields_js.html28
-rw-r--r--tbc/static/admin/templates/admin/related_widget_wrapper.html27
-rw-r--r--tbc/static/admin/templates/admin/search_form.html17
-rw-r--r--tbc/static/admin/templates/admin/submit_line.html11
-rw-r--r--tbc/static/admin/templates/registration/logged_out.html12
-rw-r--r--tbc/static/admin/templates/registration/password_change_done.html15
-rw-r--r--tbc/static/admin/templates/registration/password_change_form.html61
-rw-r--r--tbc/static/admin/templates/registration/password_reset_complete.html20
-rw-r--r--tbc/static/admin/templates/registration/password_reset_confirm.html33
-rw-r--r--tbc/static/admin/templates/registration/password_reset_done.html19
-rw-r--r--tbc/static/admin/templates/registration/password_reset_email.html14
-rw-r--r--tbc/static/admin/templates/registration/password_reset_form.html22
-rw-r--r--tbc/static/admin/templatetags/__init__.py0
-rw-r--r--tbc/static/admin/templatetags/admin_list.py436
-rw-r--r--tbc/static/admin/templatetags/admin_modify.py68
-rw-r--r--tbc/static/admin/templatetags/admin_static.py17
-rw-r--r--tbc/static/admin/templatetags/admin_urls.py55
-rw-r--r--tbc/static/admin/templatetags/log.py59
-rw-r--r--tbc/static/admin/tests.py163
-rw-r--r--tbc/static/admin/utils.py492
-rw-r--r--tbc/static/admin/views/__init__.py0
-rw-r--r--tbc/static/admin/views/decorators.py18
-rw-r--r--tbc/static/admin/views/main.py392
-rw-r--r--tbc/static/admin/widgets.py391
524 files changed, 109011 insertions, 0 deletions
diff --git a/tbc/static/admin/__init__.py b/tbc/static/admin/__init__.py
new file mode 100644
index 0000000..23f51fa
--- /dev/null
+++ b/tbc/static/admin/__init__.py
@@ -0,0 +1,29 @@
+# ACTION_CHECKBOX_NAME is unused, but should stay since its import from here
+# has been referenced in documentation.
+from django.contrib.admin.decorators import register
+from django.contrib.admin.filters import (
+ AllValuesFieldListFilter, BooleanFieldListFilter, ChoicesFieldListFilter,
+ DateFieldListFilter, FieldListFilter, ListFilter, RelatedFieldListFilter,
+ RelatedOnlyFieldListFilter, SimpleListFilter,
+)
+from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
+from django.contrib.admin.options import (
+ HORIZONTAL, VERTICAL, ModelAdmin, StackedInline, TabularInline,
+)
+from django.contrib.admin.sites import AdminSite, site
+from django.utils.module_loading import autodiscover_modules
+
+__all__ = [
+ "register", "ACTION_CHECKBOX_NAME", "ModelAdmin", "HORIZONTAL", "VERTICAL",
+ "StackedInline", "TabularInline", "AdminSite", "site", "ListFilter",
+ "SimpleListFilter", "FieldListFilter", "BooleanFieldListFilter",
+ "RelatedFieldListFilter", "ChoicesFieldListFilter", "DateFieldListFilter",
+ "AllValuesFieldListFilter", "RelatedOnlyFieldListFilter", "autodiscover",
+]
+
+
+def autodiscover():
+ autodiscover_modules('admin', register_to=site)
+
+
+default_app_config = 'django.contrib.admin.apps.AdminConfig'
diff --git a/tbc/static/admin/actions.py b/tbc/static/admin/actions.py
new file mode 100644
index 0000000..4445dd5
--- /dev/null
+++ b/tbc/static/admin/actions.py
@@ -0,0 +1,88 @@
+"""
+Built-in, globally-available admin actions.
+"""
+
+from django.contrib import messages
+from django.contrib.admin import helpers
+from django.contrib.admin.utils import get_deleted_objects, model_ngettext
+from django.core.exceptions import PermissionDenied
+from django.db import router
+from django.template.response import TemplateResponse
+from django.utils.encoding import force_text
+from django.utils.translation import ugettext as _, ugettext_lazy
+
+
+def delete_selected(modeladmin, request, queryset):
+ """
+ Default action which deletes the selected objects.
+
+ This action first displays a confirmation page whichs shows all the
+ deleteable objects, or, if the user has no permission one of the related
+ childs (foreignkeys), a "permission denied" message.
+
+ Next, it deletes all selected objects and redirects back to the change list.
+ """
+ opts = modeladmin.model._meta
+ app_label = opts.app_label
+
+ # Check that the user has delete permission for the actual model
+ if not modeladmin.has_delete_permission(request):
+ raise PermissionDenied
+
+ using = router.db_for_write(modeladmin.model)
+
+ # Populate deletable_objects, a data structure of all related objects that
+ # will also be deleted.
+ deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
+ queryset, opts, request.user, modeladmin.admin_site, using)
+
+ # The user has already confirmed the deletion.
+ # Do the deletion and return a None to display the change list view again.
+ if request.POST.get('post'):
+ if perms_needed:
+ raise PermissionDenied
+ n = queryset.count()
+ if n:
+ for obj in queryset:
+ obj_display = force_text(obj)
+ modeladmin.log_deletion(request, obj, obj_display)
+ queryset.delete()
+ modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
+ "count": n, "items": model_ngettext(modeladmin.opts, n)
+ }, messages.SUCCESS)
+ # Return None to display the change list page again.
+ return None
+
+ if len(queryset) == 1:
+ objects_name = force_text(opts.verbose_name)
+ else:
+ objects_name = force_text(opts.verbose_name_plural)
+
+ if perms_needed or protected:
+ title = _("Cannot delete %(name)s") % {"name": objects_name}
+ else:
+ title = _("Are you sure?")
+
+ context = dict(
+ modeladmin.admin_site.each_context(request),
+ title=title,
+ objects_name=objects_name,
+ deletable_objects=[deletable_objects],
+ model_count=dict(model_count).items(),
+ queryset=queryset,
+ perms_lacking=perms_needed,
+ protected=protected,
+ opts=opts,
+ action_checkbox_name=helpers.ACTION_CHECKBOX_NAME,
+ )
+
+ request.current_app = modeladmin.admin_site.name
+
+ # Display the confirmation page
+ return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [
+ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name),
+ "admin/%s/delete_selected_confirmation.html" % app_label,
+ "admin/delete_selected_confirmation.html"
+ ], context)
+
+delete_selected.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s")
diff --git a/tbc/static/admin/apps.py b/tbc/static/admin/apps.py
new file mode 100644
index 0000000..c965cdb
--- /dev/null
+++ b/tbc/static/admin/apps.py
@@ -0,0 +1,22 @@
+from django.apps import AppConfig
+from django.contrib.admin.checks import check_admin_app
+from django.core import checks
+from django.utils.translation import ugettext_lazy as _
+
+
+class SimpleAdminConfig(AppConfig):
+ """Simple AppConfig which does not do automatic discovery."""
+
+ name = 'django.contrib.admin'
+ verbose_name = _("Administration")
+
+ def ready(self):
+ checks.register(check_admin_app, checks.Tags.admin)
+
+
+class AdminConfig(SimpleAdminConfig):
+ """The default AppConfig for admin which does autodiscovery."""
+
+ def ready(self):
+ super(AdminConfig, self).ready()
+ self.module.autodiscover()
diff --git a/tbc/static/admin/checks.py b/tbc/static/admin/checks.py
new file mode 100644
index 0000000..60bd236
--- /dev/null
+++ b/tbc/static/admin/checks.py
@@ -0,0 +1,973 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from itertools import chain
+
+from django.contrib.admin.utils import (
+ NotRelationField, flatten, get_fields_from_path,
+)
+from django.core import checks
+from django.core.exceptions import FieldDoesNotExist
+from django.db import models
+from django.forms.models import (
+ BaseModelForm, BaseModelFormSet, _get_foreign_key,
+)
+
+
+def check_admin_app(**kwargs):
+ from django.contrib.admin.sites import system_check_errors
+
+ return system_check_errors
+
+
+class BaseModelAdminChecks(object):
+
+ def check(self, admin_obj, **kwargs):
+ errors = []
+ errors.extend(self._check_raw_id_fields(admin_obj))
+ errors.extend(self._check_fields(admin_obj))
+ errors.extend(self._check_fieldsets(admin_obj))
+ errors.extend(self._check_exclude(admin_obj))
+ errors.extend(self._check_form(admin_obj))
+ errors.extend(self._check_filter_vertical(admin_obj))
+ errors.extend(self._check_filter_horizontal(admin_obj))
+ errors.extend(self._check_radio_fields(admin_obj))
+ errors.extend(self._check_prepopulated_fields(admin_obj))
+ errors.extend(self._check_view_on_site_url(admin_obj))
+ errors.extend(self._check_ordering(admin_obj))
+ errors.extend(self._check_readonly_fields(admin_obj))
+ return errors
+
+ def _check_raw_id_fields(self, obj):
+ """ Check that `raw_id_fields` only contains field names that are listed
+ on the model. """
+
+ if not isinstance(obj.raw_id_fields, (list, tuple)):
+ return must_be('a list or tuple', option='raw_id_fields', obj=obj, id='admin.E001')
+ else:
+ return list(chain(*[
+ self._check_raw_id_fields_item(obj, obj.model, field_name, 'raw_id_fields[%d]' % index)
+ for index, field_name in enumerate(obj.raw_id_fields)
+ ]))
+
+ def _check_raw_id_fields_item(self, obj, model, field_name, label):
+ """ Check an item of `raw_id_fields`, i.e. check that field named
+ `field_name` exists in model `model` and is a ForeignKey or a
+ ManyToManyField. """
+
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E002')
+ else:
+ if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
+ return must_be('a ForeignKey or ManyToManyField',
+ option=label, obj=obj, id='admin.E003')
+ else:
+ return []
+
+ def _check_fields(self, obj):
+ """ Check that `fields` only refer to existing fields, doesn't contain
+ duplicates. Check if at most one of `fields` and `fieldsets` is defined.
+ """
+
+ if obj.fields is None:
+ return []
+ elif not isinstance(obj.fields, (list, tuple)):
+ return must_be('a list or tuple', option='fields', obj=obj, id='admin.E004')
+ elif obj.fieldsets:
+ return [
+ checks.Error(
+ "Both 'fieldsets' and 'fields' are specified.",
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E005',
+ )
+ ]
+ fields = flatten(obj.fields)
+ if len(fields) != len(set(fields)):
+ return [
+ checks.Error(
+ "The value of 'fields' contains duplicate field(s).",
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E006',
+ )
+ ]
+
+ return list(chain(*[
+ self._check_field_spec(obj, obj.model, field_name, 'fields')
+ for field_name in obj.fields
+ ]))
+
+ def _check_fieldsets(self, obj):
+ """ Check that fieldsets is properly formatted and doesn't contain
+ duplicates. """
+
+ if obj.fieldsets is None:
+ return []
+ elif not isinstance(obj.fieldsets, (list, tuple)):
+ return must_be('a list or tuple', option='fieldsets', obj=obj, id='admin.E007')
+ else:
+ return list(chain(*[
+ self._check_fieldsets_item(obj, obj.model, fieldset, 'fieldsets[%d]' % index)
+ for index, fieldset in enumerate(obj.fieldsets)
+ ]))
+
+ def _check_fieldsets_item(self, obj, model, fieldset, label):
+ """ Check an item of `fieldsets`, i.e. check that this is a pair of a
+ set name and a dictionary containing "fields" key. """
+
+ if not isinstance(fieldset, (list, tuple)):
+ return must_be('a list or tuple', option=label, obj=obj, id='admin.E008')
+ elif len(fieldset) != 2:
+ return must_be('of length 2', option=label, obj=obj, id='admin.E009')
+ elif not isinstance(fieldset[1], dict):
+ return must_be('a dictionary', option='%s[1]' % label, obj=obj, id='admin.E010')
+ elif 'fields' not in fieldset[1]:
+ return [
+ checks.Error(
+ "The value of '%s[1]' must contain the key 'fields'." % label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E011',
+ )
+ ]
+ elif not isinstance(fieldset[1]['fields'], (list, tuple)):
+ return must_be('a list or tuple', option="%s[1]['fields']" % label, obj=obj, id='admin.E008')
+
+ fields = flatten(fieldset[1]['fields'])
+ if len(fields) != len(set(fields)):
+ return [
+ checks.Error(
+ "There are duplicate field(s) in '%s[1]'." % label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E012',
+ )
+ ]
+ return list(chain(*[
+ self._check_field_spec(obj, model, fieldset_fields, '%s[1]["fields"]' % label)
+ for fieldset_fields in fieldset[1]['fields']
+ ]))
+
+ def _check_field_spec(self, obj, model, fields, label):
+ """ `fields` should be an item of `fields` or an item of
+ fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a
+ field name or a tuple of field names. """
+
+ if isinstance(fields, tuple):
+ return list(chain(*[
+ self._check_field_spec_item(obj, model, field_name, "%s[%d]" % (label, index))
+ for index, field_name in enumerate(fields)
+ ]))
+ else:
+ return self._check_field_spec_item(obj, model, fields, label)
+
+ def _check_field_spec_item(self, obj, model, field_name, label):
+ if field_name in obj.readonly_fields:
+ # Stuff can be put in fields that isn't actually a model field if
+ # it's in readonly_fields, readonly_fields will handle the
+ # validation of such things.
+ return []
+ else:
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ # If we can't find a field on the model that matches, it could
+ # be an extra field on the form.
+ return []
+ else:
+ if (isinstance(field, models.ManyToManyField) and
+ not field.remote_field.through._meta.auto_created):
+ return [
+ checks.Error(
+ ("The value of '%s' cannot include the ManyToManyField '%s', "
+ "because that field manually specifies a relationship model.")
+ % (label, field_name),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E013',
+ )
+ ]
+ else:
+ return []
+
+ def _check_exclude(self, obj):
+ """ Check that exclude is a sequence without duplicates. """
+
+ if obj.exclude is None: # default value is None
+ return []
+ elif not isinstance(obj.exclude, (list, tuple)):
+ return must_be('a list or tuple', option='exclude', obj=obj, id='admin.E014')
+ elif len(obj.exclude) > len(set(obj.exclude)):
+ return [
+ checks.Error(
+ "The value of 'exclude' contains duplicate field(s).",
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E015',
+ )
+ ]
+ else:
+ return []
+
+ def _check_form(self, obj):
+ """ Check that form subclasses BaseModelForm. """
+
+ if hasattr(obj, 'form') and not issubclass(obj.form, BaseModelForm):
+ return must_inherit_from(parent='BaseModelForm', option='form',
+ obj=obj, id='admin.E016')
+ else:
+ return []
+
+ def _check_filter_vertical(self, obj):
+ """ Check that filter_vertical is a sequence of field names. """
+
+ if not hasattr(obj, 'filter_vertical'):
+ return []
+ elif not isinstance(obj.filter_vertical, (list, tuple)):
+ return must_be('a list or tuple', option='filter_vertical', obj=obj, id='admin.E017')
+ else:
+ return list(chain(*[
+ self._check_filter_item(obj, obj.model, field_name, "filter_vertical[%d]" % index)
+ for index, field_name in enumerate(obj.filter_vertical)
+ ]))
+
+ def _check_filter_horizontal(self, obj):
+ """ Check that filter_horizontal is a sequence of field names. """
+
+ if not hasattr(obj, 'filter_horizontal'):
+ return []
+ elif not isinstance(obj.filter_horizontal, (list, tuple)):
+ return must_be('a list or tuple', option='filter_horizontal', obj=obj, id='admin.E018')
+ else:
+ return list(chain(*[
+ self._check_filter_item(obj, obj.model, field_name, "filter_horizontal[%d]" % index)
+ for index, field_name in enumerate(obj.filter_horizontal)
+ ]))
+
+ def _check_filter_item(self, obj, model, field_name, label):
+ """ Check one item of `filter_vertical` or `filter_horizontal`, i.e.
+ check that given field exists and is a ManyToManyField. """
+
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E019')
+ else:
+ if not isinstance(field, models.ManyToManyField):
+ return must_be('a ManyToManyField', option=label, obj=obj, id='admin.E020')
+ else:
+ return []
+
+ def _check_radio_fields(self, obj):
+ """ Check that `radio_fields` is a dictionary. """
+
+ if not hasattr(obj, 'radio_fields'):
+ return []
+ elif not isinstance(obj.radio_fields, dict):
+ return must_be('a dictionary', option='radio_fields', obj=obj, id='admin.E021')
+ else:
+ return list(chain(*[
+ self._check_radio_fields_key(obj, obj.model, field_name, 'radio_fields') +
+ self._check_radio_fields_value(obj, val, 'radio_fields["%s"]' % field_name)
+ for field_name, val in obj.radio_fields.items()
+ ]))
+
+ def _check_radio_fields_key(self, obj, model, field_name, label):
+ """ Check that a key of `radio_fields` dictionary is name of existing
+ field and that the field is a ForeignKey or has `choices` defined. """
+
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E022')
+ else:
+ if not (isinstance(field, models.ForeignKey) or field.choices):
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not an "
+ "instance of ForeignKey, and does not have a 'choices' definition." % (
+ label, field_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E023',
+ )
+ ]
+ else:
+ return []
+
+ def _check_radio_fields_value(self, obj, val, label):
+ """ Check type of a value of `radio_fields` dictionary. """
+
+ from django.contrib.admin.options import HORIZONTAL, VERTICAL
+
+ if val not in (HORIZONTAL, VERTICAL):
+ return [
+ checks.Error(
+ "The value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL." % label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E024',
+ )
+ ]
+ else:
+ return []
+
+ def _check_view_on_site_url(self, obj):
+ if hasattr(obj, 'view_on_site'):
+ if not callable(obj.view_on_site) and not isinstance(obj.view_on_site, bool):
+ return [
+ checks.Error(
+ "The value of 'view_on_site' must be a callable or a boolean value.",
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E025',
+ )
+ ]
+ else:
+ return []
+ else:
+ return []
+
+ def _check_prepopulated_fields(self, obj):
+ """ Check that `prepopulated_fields` is a dictionary containing allowed
+ field types. """
+
+ if not hasattr(obj, 'prepopulated_fields'):
+ return []
+ elif not isinstance(obj.prepopulated_fields, dict):
+ return must_be('a dictionary', option='prepopulated_fields', obj=obj, id='admin.E026')
+ else:
+ return list(chain(*[
+ self._check_prepopulated_fields_key(obj, obj.model, field_name, 'prepopulated_fields') +
+ self._check_prepopulated_fields_value(obj, obj.model, val, 'prepopulated_fields["%s"]' % field_name)
+ for field_name, val in obj.prepopulated_fields.items()
+ ]))
+
+ def _check_prepopulated_fields_key(self, obj, model, field_name, label):
+ """ Check a key of `prepopulated_fields` dictionary, i.e. check that it
+ is a name of existing field and the field is one of the allowed types.
+ """
+
+ forbidden_field_types = (
+ models.DateTimeField,
+ models.ForeignKey,
+ models.ManyToManyField
+ )
+
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E027')
+ else:
+ if isinstance(field, forbidden_field_types):
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which must not be a DateTimeField, "
+ "ForeignKey or ManyToManyField." % (
+ label, field_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E028',
+ )
+ ]
+ else:
+ return []
+
+ def _check_prepopulated_fields_value(self, obj, model, val, label):
+ """ Check a value of `prepopulated_fields` dictionary, i.e. it's an
+ iterable of existing fields. """
+
+ if not isinstance(val, (list, tuple)):
+ return must_be('a list or tuple', option=label, obj=obj, id='admin.E029')
+ else:
+ return list(chain(*[
+ self._check_prepopulated_fields_value_item(obj, model, subfield_name, "%s[%r]" % (label, index))
+ for index, subfield_name in enumerate(val)
+ ]))
+
+ def _check_prepopulated_fields_value_item(self, obj, model, field_name, label):
+ """ For `prepopulated_fields` equal to {"slug": ("title",)},
+ `field_name` is "title". """
+
+ try:
+ model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E030')
+ else:
+ return []
+
+ def _check_ordering(self, obj):
+ """ Check that ordering refers to existing fields or is random. """
+
+ # ordering = None
+ if obj.ordering is None: # The default value is None
+ return []
+ elif not isinstance(obj.ordering, (list, tuple)):
+ return must_be('a list or tuple', option='ordering', obj=obj, id='admin.E031')
+ else:
+ return list(chain(*[
+ self._check_ordering_item(obj, obj.model, field_name, 'ordering[%d]' % index)
+ for index, field_name in enumerate(obj.ordering)
+ ]))
+
+ def _check_ordering_item(self, obj, model, field_name, label):
+ """ Check that `ordering` refers to existing fields. """
+
+ if field_name == '?' and len(obj.ordering) != 1:
+ return [
+ checks.Error(
+ ("The value of 'ordering' has the random ordering marker '?', "
+ "but contains other fields as well."),
+ hint='Either remove the "?", or remove the other fields.',
+ obj=obj.__class__,
+ id='admin.E032',
+ )
+ ]
+ elif field_name == '?':
+ return []
+ elif '__' in field_name:
+ # Skip ordering in the format field1__field2 (FIXME: checking
+ # this format would be nice, but it's a little fiddly).
+ return []
+ else:
+ if field_name.startswith('-'):
+ field_name = field_name[1:]
+
+ try:
+ model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E033')
+ else:
+ return []
+
+ def _check_readonly_fields(self, obj):
+ """ Check that readonly_fields refers to proper attribute or field. """
+
+ if obj.readonly_fields == ():
+ return []
+ elif not isinstance(obj.readonly_fields, (list, tuple)):
+ return must_be('a list or tuple', option='readonly_fields', obj=obj, id='admin.E034')
+ else:
+ return list(chain(*[
+ self._check_readonly_fields_item(obj, obj.model, field_name, "readonly_fields[%d]" % index)
+ for index, field_name in enumerate(obj.readonly_fields)
+ ]))
+
+ def _check_readonly_fields_item(self, obj, model, field_name, label):
+ if callable(field_name):
+ return []
+ elif hasattr(obj, field_name):
+ return []
+ elif hasattr(model, field_name):
+ return []
+ else:
+ try:
+ model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return [
+ checks.Error(
+ "The value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s.%s'." % (
+ label, obj.__class__.__name__, model._meta.app_label, model._meta.object_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E035',
+ )
+ ]
+ else:
+ return []
+
+
+class ModelAdminChecks(BaseModelAdminChecks):
+
+ def check(self, admin_obj, **kwargs):
+ errors = super(ModelAdminChecks, self).check(admin_obj)
+ errors.extend(self._check_save_as(admin_obj))
+ errors.extend(self._check_save_on_top(admin_obj))
+ errors.extend(self._check_inlines(admin_obj))
+ errors.extend(self._check_list_display(admin_obj))
+ errors.extend(self._check_list_display_links(admin_obj))
+ errors.extend(self._check_list_filter(admin_obj))
+ errors.extend(self._check_list_select_related(admin_obj))
+ errors.extend(self._check_list_per_page(admin_obj))
+ errors.extend(self._check_list_max_show_all(admin_obj))
+ errors.extend(self._check_list_editable(admin_obj))
+ errors.extend(self._check_search_fields(admin_obj))
+ errors.extend(self._check_date_hierarchy(admin_obj))
+ return errors
+
+ def _check_save_as(self, obj):
+ """ Check save_as is a boolean. """
+
+ if not isinstance(obj.save_as, bool):
+ return must_be('a boolean', option='save_as',
+ obj=obj, id='admin.E101')
+ else:
+ return []
+
+ def _check_save_on_top(self, obj):
+ """ Check save_on_top is a boolean. """
+
+ if not isinstance(obj.save_on_top, bool):
+ return must_be('a boolean', option='save_on_top',
+ obj=obj, id='admin.E102')
+ else:
+ return []
+
+ def _check_inlines(self, obj):
+ """ Check all inline model admin classes. """
+
+ if not isinstance(obj.inlines, (list, tuple)):
+ return must_be('a list or tuple', option='inlines', obj=obj, id='admin.E103')
+ else:
+ return list(chain(*[
+ self._check_inlines_item(obj, obj.model, item, "inlines[%d]" % index)
+ for index, item in enumerate(obj.inlines)
+ ]))
+
+ def _check_inlines_item(self, obj, model, inline, label):
+ """ Check one inline model admin. """
+ inline_label = '.'.join([inline.__module__, inline.__name__])
+
+ from django.contrib.admin.options import BaseModelAdmin
+
+ if not issubclass(inline, BaseModelAdmin):
+ return [
+ checks.Error(
+ "'%s' must inherit from 'BaseModelAdmin'." % inline_label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E104',
+ )
+ ]
+ elif not inline.model:
+ return [
+ checks.Error(
+ "'%s' must have a 'model' attribute." % inline_label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E105',
+ )
+ ]
+ elif not issubclass(inline.model, models.Model):
+ return must_be('a Model', option='%s.model' % inline_label,
+ obj=obj, id='admin.E106')
+ else:
+ return inline(model, obj.admin_site).check()
+
+ def _check_list_display(self, obj):
+ """ Check that list_display only contains fields or usable attributes.
+ """
+
+ if not isinstance(obj.list_display, (list, tuple)):
+ return must_be('a list or tuple', option='list_display', obj=obj, id='admin.E107')
+ else:
+ return list(chain(*[
+ self._check_list_display_item(obj, obj.model, item, "list_display[%d]" % index)
+ for index, item in enumerate(obj.list_display)
+ ]))
+
+ def _check_list_display_item(self, obj, model, item, label):
+ if callable(item):
+ return []
+ elif hasattr(obj, item):
+ return []
+ elif hasattr(model, item):
+ # getattr(model, item) could be an X_RelatedObjectsDescriptor
+ try:
+ field = model._meta.get_field(item)
+ except FieldDoesNotExist:
+ try:
+ field = getattr(model, item)
+ except AttributeError:
+ field = None
+
+ if field is None:
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not a "
+ "callable, an attribute of '%s', or an attribute or method on '%s.%s'." % (
+ label, item, obj.__class__.__name__, model._meta.app_label, model._meta.object_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E108',
+ )
+ ]
+ elif isinstance(field, models.ManyToManyField):
+ return [
+ checks.Error(
+ "The value of '%s' must not be a ManyToManyField." % label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E109',
+ )
+ ]
+ else:
+ return []
+ else:
+ try:
+ model._meta.get_field(item)
+ except FieldDoesNotExist:
+ return [
+ # This is a deliberate repeat of E108; there's more than one path
+ # required to test this condition.
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not a callable, "
+ "an attribute of '%s', or an attribute or method on '%s.%s'." % (
+ label, item, obj.__class__.__name__, model._meta.app_label, model._meta.object_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E108',
+ )
+ ]
+ else:
+ return []
+
+ def _check_list_display_links(self, obj):
+ """ Check that list_display_links is a unique subset of list_display.
+ """
+
+ if obj.list_display_links is None:
+ return []
+ elif not isinstance(obj.list_display_links, (list, tuple)):
+ return must_be('a list, a tuple, or None', option='list_display_links', obj=obj, id='admin.E110')
+ else:
+ return list(chain(*[
+ self._check_list_display_links_item(obj, field_name, "list_display_links[%d]" % index)
+ for index, field_name in enumerate(obj.list_display_links)
+ ]))
+
+ def _check_list_display_links_item(self, obj, field_name, label):
+ if field_name not in obj.list_display:
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not defined in 'list_display'." % (
+ label, field_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E111',
+ )
+ ]
+ else:
+ return []
+
+ def _check_list_filter(self, obj):
+ if not isinstance(obj.list_filter, (list, tuple)):
+ return must_be('a list or tuple', option='list_filter', obj=obj, id='admin.E112')
+ else:
+ return list(chain(*[
+ self._check_list_filter_item(obj, obj.model, item, "list_filter[%d]" % index)
+ for index, item in enumerate(obj.list_filter)
+ ]))
+
+ def _check_list_filter_item(self, obj, model, item, label):
+ """
+ Check one item of `list_filter`, i.e. check if it is one of three options:
+ 1. 'field' -- a basic field filter, possibly w/ relationships (e.g.
+ 'field__rel')
+ 2. ('field', SomeFieldListFilter) - a field-based list filter class
+ 3. SomeListFilter - a non-field list filter class
+ """
+
+ from django.contrib.admin import ListFilter, FieldListFilter
+
+ if callable(item) and not isinstance(item, models.Field):
+ # If item is option 3, it should be a ListFilter...
+ if not issubclass(item, ListFilter):
+ return must_inherit_from(parent='ListFilter', option=label,
+ obj=obj, id='admin.E113')
+ # ... but not a FieldListFilter.
+ elif issubclass(item, FieldListFilter):
+ return [
+ checks.Error(
+ "The value of '%s' must not inherit from 'FieldListFilter'." % label,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E114',
+ )
+ ]
+ else:
+ return []
+ elif isinstance(item, (tuple, list)):
+ # item is option #2
+ field, list_filter_class = item
+ if not issubclass(list_filter_class, FieldListFilter):
+ return must_inherit_from(parent='FieldListFilter', option='%s[1]' % label,
+ obj=obj, id='admin.E115')
+ else:
+ return []
+ else:
+ # item is option #1
+ field = item
+
+ # Validate the field string
+ try:
+ get_fields_from_path(model, field)
+ except (NotRelationField, FieldDoesNotExist):
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which does not refer to a Field." % (label, field),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E116',
+ )
+ ]
+ else:
+ return []
+
+ def _check_list_select_related(self, obj):
+ """ Check that list_select_related is a boolean, a list or a tuple. """
+
+ if not isinstance(obj.list_select_related, (bool, list, tuple)):
+ return must_be('a boolean, tuple or list', option='list_select_related',
+ obj=obj, id='admin.E117')
+ else:
+ return []
+
+ def _check_list_per_page(self, obj):
+ """ Check that list_per_page is an integer. """
+
+ if not isinstance(obj.list_per_page, int):
+ return must_be('an integer', option='list_per_page', obj=obj, id='admin.E118')
+ else:
+ return []
+
+ def _check_list_max_show_all(self, obj):
+ """ Check that list_max_show_all is an integer. """
+
+ if not isinstance(obj.list_max_show_all, int):
+ return must_be('an integer', option='list_max_show_all', obj=obj, id='admin.E119')
+ else:
+ return []
+
+ def _check_list_editable(self, obj):
+ """ Check that list_editable is a sequence of editable fields from
+ list_display without first element. """
+
+ if not isinstance(obj.list_editable, (list, tuple)):
+ return must_be('a list or tuple', option='list_editable', obj=obj, id='admin.E120')
+ else:
+ return list(chain(*[
+ self._check_list_editable_item(obj, obj.model, item, "list_editable[%d]" % index)
+ for index, item in enumerate(obj.list_editable)
+ ]))
+
+ def _check_list_editable_item(self, obj, model, field_name, label):
+ try:
+ field = model._meta.get_field(field_name)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(field=field_name, option=label,
+ model=model, obj=obj, id='admin.E121')
+ else:
+ if field_name not in obj.list_display:
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not "
+ "contained in 'list_display'." % (label, field_name),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E122',
+ )
+ ]
+ elif obj.list_display_links and field_name in obj.list_display_links:
+ return [
+ checks.Error(
+ "The value of '%s' cannot be in both 'list_editable' and 'list_display_links'." % field_name,
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E123',
+ )
+ ]
+ # Check that list_display_links is set, and that the first values of list_editable and list_display are
+ # not the same. See ticket #22792 for the use case relating to this.
+ elif (obj.list_display[0] in obj.list_editable and obj.list_display[0] != obj.list_editable[0] and
+ obj.list_display_links is not None):
+ return [
+ checks.Error(
+ "The value of '%s' refers to the first field in 'list_display' ('%s'), "
+ "which cannot be used unless 'list_display_links' is set." % (
+ label, obj.list_display[0]
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E124',
+ )
+ ]
+ elif not field.editable:
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not editable through the admin." % (
+ label, field_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E125',
+ )
+ ]
+ else:
+ return []
+
+ def _check_search_fields(self, obj):
+ """ Check search_fields is a sequence. """
+
+ if not isinstance(obj.search_fields, (list, tuple)):
+ return must_be('a list or tuple', option='search_fields', obj=obj, id='admin.E126')
+ else:
+ return []
+
+ def _check_date_hierarchy(self, obj):
+ """ Check that date_hierarchy refers to DateField or DateTimeField. """
+
+ if obj.date_hierarchy is None:
+ return []
+ else:
+ try:
+ field = obj.model._meta.get_field(obj.date_hierarchy)
+ except FieldDoesNotExist:
+ return refer_to_missing_field(option='date_hierarchy',
+ field=obj.date_hierarchy,
+ model=obj.model, obj=obj, id='admin.E127')
+ else:
+ if not isinstance(field, (models.DateField, models.DateTimeField)):
+ return must_be('a DateField or DateTimeField', option='date_hierarchy',
+ obj=obj, id='admin.E128')
+ else:
+ return []
+
+
+class InlineModelAdminChecks(BaseModelAdminChecks):
+
+ def check(self, inline_obj, **kwargs):
+ errors = super(InlineModelAdminChecks, self).check(inline_obj)
+ parent_model = inline_obj.parent_model
+ errors.extend(self._check_relation(inline_obj, parent_model))
+ errors.extend(self._check_exclude_of_parent_model(inline_obj, parent_model))
+ errors.extend(self._check_extra(inline_obj))
+ errors.extend(self._check_max_num(inline_obj))
+ errors.extend(self._check_min_num(inline_obj))
+ errors.extend(self._check_formset(inline_obj))
+ return errors
+
+ def _check_exclude_of_parent_model(self, obj, parent_model):
+ # Do not perform more specific checks if the base checks result in an
+ # error.
+ errors = super(InlineModelAdminChecks, self)._check_exclude(obj)
+ if errors:
+ return []
+
+ # Skip if `fk_name` is invalid.
+ if self._check_relation(obj, parent_model):
+ return []
+
+ if obj.exclude is None:
+ return []
+
+ fk = _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name)
+ if fk.name in obj.exclude:
+ return [
+ checks.Error(
+ "Cannot exclude the field '%s', because it is the foreign key "
+ "to the parent model '%s.%s'." % (
+ fk.name, parent_model._meta.app_label, parent_model._meta.object_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id='admin.E201',
+ )
+ ]
+ else:
+ return []
+
+ def _check_relation(self, obj, parent_model):
+ try:
+ _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name)
+ except ValueError as e:
+ return [checks.Error(e.args[0], hint=None, obj=obj.__class__, id='admin.E202')]
+ else:
+ return []
+
+ def _check_extra(self, obj):
+ """ Check that extra is an integer. """
+
+ if not isinstance(obj.extra, int):
+ return must_be('an integer', option='extra', obj=obj, id='admin.E203')
+ else:
+ return []
+
+ def _check_max_num(self, obj):
+ """ Check that max_num is an integer. """
+
+ if obj.max_num is None:
+ return []
+ elif not isinstance(obj.max_num, int):
+ return must_be('an integer', option='max_num', obj=obj, id='admin.E204')
+ else:
+ return []
+
+ def _check_min_num(self, obj):
+ """ Check that min_num is an integer. """
+
+ if obj.min_num is None:
+ return []
+ elif not isinstance(obj.min_num, int):
+ return must_be('an integer', option='min_num', obj=obj, id='admin.E205')
+ else:
+ return []
+
+ def _check_formset(self, obj):
+ """ Check formset is a subclass of BaseModelFormSet. """
+
+ if not issubclass(obj.formset, BaseModelFormSet):
+ return must_inherit_from(parent='BaseModelFormSet', option='formset',
+ obj=obj, id='admin.E206')
+ else:
+ return []
+
+
+def must_be(type, option, obj, id):
+ return [
+ checks.Error(
+ "The value of '%s' must be %s." % (option, type),
+ hint=None,
+ obj=obj.__class__,
+ id=id,
+ ),
+ ]
+
+
+def must_inherit_from(parent, option, obj, id):
+ return [
+ checks.Error(
+ "The value of '%s' must inherit from '%s'." % (option, parent),
+ hint=None,
+ obj=obj.__class__,
+ id=id,
+ ),
+ ]
+
+
+def refer_to_missing_field(field, option, model, obj, id):
+ return [
+ checks.Error(
+ "The value of '%s' refers to '%s', which is not an attribute of '%s.%s'." % (
+ option, field, model._meta.app_label, model._meta.object_name
+ ),
+ hint=None,
+ obj=obj.__class__,
+ id=id,
+ ),
+ ]
diff --git a/tbc/static/admin/css/base.css b/tbc/static/admin/css/base.css
new file mode 100644
index 0000000..a37555a
--- /dev/null
+++ b/tbc/static/admin/css/base.css
@@ -0,0 +1,967 @@
+/*
+ DJANGO Admin styles
+*/
+
+@import url(fonts.css);
+
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+ color: #333;
+ background: #fff;
+}
+
+/* LINKS */
+
+a:link, a:visited {
+ color: #447e9b;
+ text-decoration: none;
+}
+
+a:focus, a:hover {
+ color: #036;
+}
+
+a:focus {
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+a.section:link, a.section:visited {
+ color: #fff;
+ text-decoration: none;
+}
+
+a.section:focus, a.section:hover {
+ text-decoration: underline;
+}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+ margin: .2em 0 .8em 0;
+}
+
+p {
+ padding: 0;
+ line-height: 140%;
+}
+
+h1,h2,h3,h4,h5 {
+ font-weight: bold;
+}
+
+h1 {
+ margin: 0 0 20px;
+ font-weight: 300;
+ font-size: 20px;
+ color: #666;
+}
+
+h2 {
+ font-size: 16px;
+ margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+ font-weight: normal;
+ margin-top: 0;
+}
+
+h3 {
+ font-size: 14px;
+ margin: .8em 0 .3em 0;
+ color: #666;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 12px;
+ margin: 1em 0 .8em 0;
+ padding-bottom: 3px;
+}
+
+h5 {
+ font-size: 10px;
+ margin: 1.5em 0 .5em 0;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+ul li {
+ list-style-type: square;
+ padding: 1px 0;
+}
+
+li ul {
+ margin-bottom: 0;
+}
+
+li, dt, dd {
+ font-size: 13px;
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 4px;
+}
+
+dd {
+ margin-left: 0;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+blockquote {
+ font-size: 11px;
+ color: #777;
+ margin-left: 2px;
+ padding-left: 10px;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+ color: #666;
+ font-size: 12px;
+}
+
+pre.literal-block {
+ margin: 10px;
+ background: #eee;
+ padding: 6px 8px;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ clear: both;
+ color: #eee;
+ background-color: #eee;
+ height: 1px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
+.small {
+ font-size: 11px;
+}
+
+.tiny {
+ font-size: 10px;
+}
+
+p.tiny {
+ margin-top: -2px;
+}
+
+.mini {
+ font-size: 10px;
+}
+
+p.mini {
+ margin-top: -3px;
+}
+
+.help, p.help, form p.help {
+ font-size: 11px;
+ color: #999;
+}
+
+.help-tooltip {
+ cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+ vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+ color: #999;
+ font-weight: normal;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.clear {
+ clear: both;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.example {
+ margin: 10px 0;
+ padding: 5px 10px;
+ background: #efefef;
+}
+
+.nowrap {
+ white-space: nowrap;
+}
+
+/* TABLES */
+
+table {
+ border-collapse: collapse;
+ border-color: #ccc;
+}
+
+td, th {
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #eee;
+ vertical-align: top;
+ padding: 8px;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+th {
+ font-weight: 600;
+ text-align: left;
+}
+
+thead th,
+tfoot td {
+ color: #666;
+ padding: 5px 10px;
+ font-size: 11px;
+ background: #fff;
+ border: none;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+tfoot td {
+ border-bottom: none;
+ border-top: 1px solid #eee;
+}
+
+tr.alt {
+ background: #f6f6f6;
+}
+
+.row1 {
+ background: #fff;
+}
+
+.row2 {
+ background: #f9f9f9;
+}
+
+/* SORTABLE TABLES */
+
+thead th {
+ padding: 5px 10px;
+ line-height: normal;
+ text-transform: uppercase;
+ background: #f6f6f6;
+}
+
+thead th a:link, thead th a:visited {
+ color: #666;
+}
+
+thead th.sorted {
+ background: #eee;
+}
+
+thead th.sorted .text {
+ padding-right: 42px;
+}
+
+table thead th .text span {
+ padding: 8px 10px;
+ display: block;
+}
+
+table thead th .text a {
+ display: block;
+ cursor: pointer;
+ padding: 8px 10px;
+}
+
+table thead th .text a:focus, table thead th .text a:hover {
+ background: #eee;
+}
+
+thead th.sorted a.sortremove {
+ visibility: hidden;
+}
+
+table thead th.sorted:hover a.sortremove {
+ visibility: visible;
+}
+
+table thead th.sorted .sortoptions {
+ display: block;
+ padding: 9px 5px 0 5px;
+ float: right;
+ text-align: right;
+}
+
+table thead th.sorted .sortpriority {
+ font-size: .8em;
+ min-width: 12px;
+ text-align: center;
+ vertical-align: 3px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+table thead th.sorted .sortoptions a {
+ position: relative;
+ width: 14px;
+ height: 14px;
+ display: inline-block;
+ background: url(../img/sorting-icons.svg) 0 0 no-repeat;
+ background-size: 14px auto;
+}
+
+table thead th.sorted .sortoptions a.sortremove {
+ background-position: 0 0;
+}
+
+table thead th.sorted .sortoptions a.sortremove:after {
+ content: '\\';
+ position: absolute;
+ top: -6px;
+ left: 3px;
+ font-weight: 200;
+ font-size: 18px;
+ color: #999;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus:after,
+table thead th.sorted .sortoptions a.sortremove:hover:after {
+ color: #447e9b;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus,
+table thead th.sorted .sortoptions a.sortremove:hover {
+ background-position: 0 -14px;
+}
+
+table thead th.sorted .sortoptions a.ascending {
+ background-position: 0 -28px;
+}
+
+table thead th.sorted .sortoptions a.ascending:focus,
+table thead th.sorted .sortoptions a.ascending:hover {
+ background-position: 0 -42px;
+}
+
+table thead th.sorted .sortoptions a.descending {
+ top: 1px;
+ background-position: 0 -56px;
+}
+
+table thead th.sorted .sortoptions a.descending:focus,
+table thead th.sorted .sortoptions a.descending:hover {
+ background-position: 0 -70px;
+}
+
+/* FORM DEFAULTS */
+
+input, textarea, select, .form-row p, form .button {
+ margin: 2px 0;
+ padding: 2px 3px;
+ vertical-align: middle;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 13px;
+}
+
+textarea {
+ vertical-align: top;
+}
+
+input[type=text], input[type=password], input[type=email], input[type=url],
+input[type=number], textarea, select, .vTextField {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ padding: 5px 6px;
+ margin-top: 0;
+}
+
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
+input[type=url]:focus, input[type=number]:focus, textarea:focus, select:focus,
+.vTextField:focus {
+ border-color: #999;
+}
+
+select {
+ height: 30px;
+}
+
+select[multiple] {
+ min-height: 150px;
+}
+
+/* FORM BUTTONS */
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #79aec8;
+ padding: 10px 15px;
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+}
+
+a.button {
+ padding: 4px 5px;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active,
+.button:focus, input[type=submit]:focus, input[type=button]:focus,
+.button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #609ab6;
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+ opacity: 0.4;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ float: right;
+ border: none;
+ font-weight: 400;
+ background: #417690;
+}
+
+.button.default:active, input[type=submit].default:active,
+.button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #205067;
+}
+
+.button[disabled].default,
+input[type=submit][disabled].default,
+input[type=button][disabled].default {
+ opacity: 0.4;
+}
+
+
+/* MODULES */
+
+.module {
+ border: none;
+ margin-bottom: 30px;
+ background: #fff;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.module blockquote {
+ margin-left: 12px;
+}
+
+.module ul, .module ol {
+ margin-left: 1.5em;
+}
+
+.module h3 {
+ margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ margin: 0;
+ padding: 8px;
+ font-weight: 400;
+ font-size: 13px;
+ text-align: left;
+ background: #79aec8;
+ color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+ font-size: 12px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+
+.module table {
+ border-collapse: collapse;
+}
+
+/* MESSAGES & ERRORS */
+
+ul.messagelist {
+ padding: 0;
+ margin: 0;
+}
+
+ul.messagelist li {
+ display: block;
+ font-weight: 400;
+ font-size: 13px;
+ padding: 10px 10px 10px 65px;
+ margin: 0 0 10px 0;
+ background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+ color: #333;
+}
+
+ul.messagelist li.warning {
+ background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat;
+ background-size: 14px auto;
+}
+
+ul.messagelist li.error {
+ background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+}
+
+.errornote {
+ font-size: 14px;
+ font-weight: 700;
+ display: block;
+ padding: 10px 12px;
+ margin: 0 0 10px 0;
+ color: #ba2121;
+ border: 1px solid #ba2121;
+ border-radius: 4px;
+ background-color: #fff;
+ background-position: 5px 12px;
+}
+
+ul.errorlist {
+ margin: 0 0 4px;
+ padding: 0;
+ color: #ba2121;
+ background: #fff;
+}
+
+ul.errorlist li {
+ font-size: 13px;
+ display: block;
+ margin-bottom: 4px;
+}
+
+ul.errorlist li:first-child {
+ margin-top: 0;
+}
+
+ul.errorlist li a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td ul.errorlist {
+ margin: 0;
+ padding: 0;
+}
+
+td ul.errorlist li {
+ margin: 0;
+}
+
+.form-row.errors {
+ margin: 0;
+ border: none;
+ border-bottom: 1px solid #eee;
+ background: none;
+}
+
+.form-row.errors ul.errorlist li {
+ padding-left: 0;
+}
+
+.errors input, .errors select, .errors textarea {
+ border: 1px solid #ba2121;
+}
+
+div.system-message {
+ background: #ffc;
+ margin: 10px;
+ padding: 6px 8px;
+ font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+ padding: 4px 5px 4px 25px;
+ margin: 0;
+ color: #c11;
+ background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
+}
+
+.description {
+ font-size: 12px;
+ padding: 5px 0 0 12px;
+}
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+ background: #79aec8;
+ padding: 10px 40px;
+ border: none;
+ font-size: 14px;
+ color: #c4dce8;
+ text-align: left;
+}
+
+div.breadcrumbs a {
+ color: #fff;
+}
+
+div.breadcrumbs a:focus, div.breadcrumbs a:hover {
+ color: #c4dce8;
+}
+
+/* ACTION ICONS */
+
+.addlink {
+ padding-left: 16px;
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+}
+
+.changelink, .inlinechangelink {
+ padding-left: 16px;
+ background: url(../img/icon-changelink.svg) 0 1px no-repeat;
+}
+
+.deletelink {
+ padding-left: 16px;
+ background: url(../img/icon-deletelink.svg) 0 1px no-repeat;
+}
+
+a.deletelink:link, a.deletelink:visited {
+ color: #CC3434;
+}
+
+a.deletelink:focus, a.deletelink:hover {
+ color: #993333;
+ text-decoration: none;
+}
+
+/* OBJECT TOOLS */
+
+.object-tools {
+ font-size: 10px;
+ font-weight: bold;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin-top: -48px;
+}
+
+.form-row .object-tools {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ float: none;
+ height: 2em;
+ padding-left: 3.5em;
+}
+
+.object-tools li {
+ display: block;
+ float: left;
+ margin-left: 5px;
+ height: 16px;
+}
+
+.object-tools a {
+ border-radius: 15px;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ padding: 3px 12px;
+ background: #999;
+ font-weight: 400;
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #fff;
+}
+
+.object-tools a:focus, .object-tools a:hover {
+ background-color: #417690;
+}
+
+.object-tools a:focus{
+ text-decoration: none;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
+ background-repeat: no-repeat;
+ background-position: 93% center;
+ padding-right: 26px;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink {
+ background-image: url(../img/tooltag-arrowright.svg);
+}
+
+.object-tools a.addlink {
+ background-image: url(../img/tooltag-add.svg);
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+ width: 100%;
+}
+
+table#change-history tbody th {
+ width: 16em;
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+ position: relative;
+ width: 100%;
+ min-width: 980px;
+ padding: 0;
+}
+
+#content {
+ padding: 20px 40px;
+}
+
+.dashboard #content {
+ width: 600px;
+}
+
+#content-main {
+ float: left;
+ width: 100%;
+}
+
+#content-related {
+ float: right;
+ width: 260px;
+ position: relative;
+ margin-right: -300px;
+}
+
+#footer {
+ clear: both;
+ padding: 10px;
+}
+
+/* COLUMN TYPES */
+
+.colMS {
+ margin-right: 300px;
+}
+
+.colSM {
+ margin-left: 300px;
+}
+
+.colSM #content-related {
+ float: left;
+ margin-right: 0;
+ margin-left: -300px;
+}
+
+.colSM #content-main {
+ float: right;
+}
+
+.popup .colM {
+ width: auto;
+}
+
+/* HEADER */
+
+#header {
+ width: auto;
+ height: 40px;
+ padding: 10px 40px;
+ background: #417690;
+ line-height: 40px;
+ color: #ffc;
+ overflow: hidden;
+}
+
+#header a:link, #header a:visited {
+ color: #fff;
+}
+
+#header a:focus , #header a:hover {
+ text-decoration: underline;
+}
+
+#branding {
+ float: left;
+}
+
+#branding h1 {
+ padding: 0;
+ margin: 0 20px 0 0;
+ font-weight: 300;
+ font-size: 24px;
+ color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+ color: #f5dd5d;
+}
+
+#branding h2 {
+ padding: 0 10px;
+ font-size: 14px;
+ margin: -8px 0 8px 0;
+ font-weight: normal;
+ color: #ffc;
+}
+
+#branding a:hover {
+ text-decoration: none;
+}
+
+#user-tools {
+ float: right;
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: right;
+}
+
+#user-tools a {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.25);
+}
+
+#user-tools a:focus, #user-tools a:hover {
+ text-decoration: none;
+ border-bottom-color: #79aec8;
+ color: #79aec8;
+}
+
+/* SIDEBAR */
+
+#content-related {
+ background: #f8f8f8;
+}
+
+#content-related .module {
+ background: none;
+}
+
+#content-related h3 {
+ font-size: 14px;
+ color: #666;
+ padding: 0 16px;
+ margin: 0 0 16px;
+}
+
+#content-related h4 {
+ font-size: 13px;
+}
+
+#content-related p {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+#content-related .actionlist {
+ padding: 0;
+ margin: 16px;
+}
+
+#content-related .actionlist li {
+ line-height: 1.2;
+ margin-bottom: 10px;
+ padding-left: 18px;
+}
+
+#content-related .module h2 {
+ background: none;
+ padding: 16px;
+ margin-bottom: 16px;
+ border-bottom: 1px solid #eaeaea;
+ font-size: 18px;
+ color: #333;
+}
+
+.delete-confirmation form input[type="submit"] {
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #fff;
+}
+
+.delete-confirmation form input[type="submit"]:active,
+.delete-confirmation form input[type="submit"]:focus,
+.delete-confirmation form input[type="submit"]:hover {
+ background: #a41515;
+}
+
+.delete-confirmation form .cancel-link {
+ display: inline-block;
+ vertical-align: middle;
+ height: 15px;
+ line-height: 15px;
+ background: #ddd;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #333;
+ margin: 0 0 0 10px;
+}
+
+.delete-confirmation form .cancel-link:active,
+.delete-confirmation form .cancel-link:focus,
+.delete-confirmation form .cancel-link:hover {
+ background: #ccc;
+}
+
+/* POPUP */
+.popup #content {
+ padding: 20px;
+}
+
+.popup #container {
+ min-width: 0;
+}
+
+.popup #header {
+ padding: 10px 20px;
+}
diff --git a/tbc/static/admin/css/changelists.css b/tbc/static/admin/css/changelists.css
new file mode 100644
index 0000000..fd9e784
--- /dev/null
+++ b/tbc/static/admin/css/changelists.css
@@ -0,0 +1,341 @@
+/* CHANGELISTS */
+
+#changelist {
+ position: relative;
+ width: 100%;
+}
+
+#changelist table {
+ width: 100%;
+}
+
+.change-list .hiddenfields { display:none; }
+
+.change-list .filtered table {
+ border-right: none;
+}
+
+.change-list .filtered {
+ min-height: 400px;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator,
+.filtered #toolbar, .filtered div.xfull {
+ margin-right: 280px;
+ width: auto;
+}
+
+.change-list .filtered table tbody th {
+ padding-right: 1em;
+}
+
+#changelist-form .results {
+ overflow-x: auto;
+}
+
+#changelist .toplinks {
+ border-bottom: 1px solid #ddd;
+}
+
+#changelist .paginator {
+ color: #666;
+ border-bottom: 1px solid #eee;
+ background: #fff;
+ overflow: hidden;
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table thead th {
+ padding: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+#changelist table thead th.action-checkbox-column {
+ width: 1.5em;
+ text-align: center;
+}
+
+#changelist table tbody td.action-checkbox {
+ text-align: center;
+}
+
+#changelist table tfoot {
+ color: #666;
+}
+
+/* TOOLBAR */
+
+#changelist #toolbar {
+ padding: 8px 10px;
+ margin-bottom: 15px;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+ background: #f8f8f8;
+ color: #666;
+}
+
+#changelist #toolbar form input {
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 5px;
+ color: #333;
+}
+
+#changelist #toolbar form #searchbar {
+ height: 19px;
+ border: 1px solid #ccc;
+ padding: 2px 5px;
+ margin: 0;
+ vertical-align: top;
+ font-size: 13px;
+}
+
+#changelist #toolbar form #searchbar:focus {
+ border-color: #999;
+}
+
+#changelist #toolbar form input[type="submit"] {
+ border: 1px solid #ccc;
+ padding: 2px 10px;
+ margin: 0;
+ vertical-align: middle;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ color: #333;
+}
+
+#changelist #toolbar form input[type="submit"]:focus,
+#changelist #toolbar form input[type="submit"]:hover {
+ border-color: #999;
+}
+
+#changelist #changelist-search img {
+ vertical-align: middle;
+ margin-right: 4px;
+}
+
+/* FILTER COLUMN */
+
+#changelist-filter {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1000;
+ width: 240px;
+ background: #f8f8f8;
+ border-left: none;
+ margin: 0;
+}
+
+#changelist-filter h2 {
+ font-size: 14px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ padding: 5px 15px;
+ margin-bottom: 12px;
+ border-bottom: none;
+}
+
+#changelist-filter h3 {
+ font-weight: 400;
+ font-size: 14px;
+ padding: 0 15px;
+ margin-bottom: 10px;
+}
+
+#changelist-filter ul {
+ margin: 5px 0;
+ padding: 0 15px 15px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+#changelist-filter ul:last-child {
+ border-bottom: none;
+ padding-bottom: none;
+}
+
+#changelist-filter li {
+ list-style-type: none;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+#changelist-filter a {
+ display: block;
+ color: #999;
+}
+
+#changelist-filter li.selected {
+ border-left: 5px solid #eaeaea;
+ padding-left: 10px;
+ margin-left: -15px;
+}
+
+#changelist-filter li.selected a {
+ color: #5b80b2;
+}
+
+#changelist-filter a:focus, #changelist-filter a:hover,
+#changelist-filter li.selected a:focus,
+#changelist-filter li.selected a:hover {
+ color: #036;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+ display: block;
+ float: left;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+}
+
+.change-list ul.toplinks li {
+ padding: 3px 6px;
+ font-weight: bold;
+ list-style-type: none;
+ display: inline-block;
+}
+
+.change-list ul.toplinks .date-back a {
+ color: #999;
+}
+
+.change-list ul.toplinks .date-back a:focus,
+.change-list ul.toplinks .date-back a:hover {
+ color: #036;
+}
+
+/* PAGINATOR */
+
+.paginator {
+ font-size: 13px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 22px;
+ margin: 0;
+ border-top: 1px solid #ddd;
+}
+
+.paginator a:link, .paginator a:visited {
+ padding: 2px 6px;
+ background: #79aec8;
+ text-decoration: none;
+ color: #fff;
+}
+
+.paginator a.showall {
+ padding: 0;
+ border: none;
+ background: none;
+ color: #5b80b2;
+}
+
+.paginator a.showall:focus, .paginator a.showall:hover {
+ background: none;
+ color: #036;
+}
+
+.paginator .end {
+ margin-right: 6px;
+}
+
+.paginator .this-page {
+ padding: 2px 6px;
+ font-weight: bold;
+ font-size: 13px;
+ vertical-align: top;
+}
+
+.paginator a:focus, .paginator a:hover {
+ color: white;
+ background: #036;
+}
+
+/* ACTIONS */
+
+.filtered .actions {
+ margin-right: 280px;
+ border-right: none;
+}
+
+#changelist table input {
+ margin: 0;
+ vertical-align: baseline;
+}
+
+#changelist table tbody tr.selected {
+ background-color: #FFFFCC;
+}
+
+#changelist .actions {
+ padding: 10px;
+ background: #fff;
+ border-top: none;
+ border-bottom: none;
+ line-height: 24px;
+ color: #999;
+}
+
+#changelist .actions.selected {
+ background: #fffccf;
+ border-top: 1px solid #fffee8;
+ border-bottom: 1px solid #edecd6;
+}
+
+#changelist .actions span.all,
+#changelist .actions span.action-counter,
+#changelist .actions span.clear,
+#changelist .actions span.question {
+ font-size: 13px;
+ margin: 0 0.5em;
+ display: none;
+}
+
+#changelist .actions:last-child {
+ border-bottom: none;
+}
+
+#changelist .actions select {
+ vertical-align: top;
+ height: 24px;
+ background: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 0 0 0 4px;
+ margin: 0;
+ margin-left: 10px;
+}
+
+#changelist .actions select:focus {
+ border-color: #999;
+}
+
+#changelist .actions label {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 13px;
+}
+
+#changelist .actions .button {
+ font-size: 13px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ height: 24px;
+ line-height: 1;
+ padding: 4px 8px;
+ margin: 0;
+ color: #333;
+}
+
+#changelist .actions .button:focus, #changelist .actions .button:hover {
+ border-color: #999;
+}
diff --git a/tbc/static/admin/css/dashboard.css b/tbc/static/admin/css/dashboard.css
new file mode 100644
index 0000000..05808bc
--- /dev/null
+++ b/tbc/static/admin/css/dashboard.css
@@ -0,0 +1,30 @@
+/* DASHBOARD */
+
+.dashboard .module table th {
+ width: 100%;
+}
+
+.dashboard .module table td {
+ white-space: nowrap;
+}
+
+.dashboard .module table td a {
+ display: block;
+ padding-right: .6em;
+}
+
+/* RECENT ACTIONS MODULE */
+
+.module ul.actionlist {
+ margin-left: 0;
+}
+
+ul.actionlist li {
+ list-style-type: none;
+}
+
+ul.actionlist li {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+}
diff --git a/tbc/static/admin/css/fonts.css b/tbc/static/admin/css/fonts.css
new file mode 100644
index 0000000..c837e01
--- /dev/null
+++ b/tbc/static/admin/css/fonts.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Bold-webfont.woff');
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Regular-webfont.woff');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Light-webfont.woff');
+ font-weight: 300;
+ font-style: normal;
+}
diff --git a/tbc/static/admin/css/forms.css b/tbc/static/admin/css/forms.css
new file mode 100644
index 0000000..2a21257
--- /dev/null
+++ b/tbc/static/admin/css/forms.css
@@ -0,0 +1,499 @@
+@import url('widgets.css');
+
+/* FORM ROWS */
+
+.form-row {
+ overflow: hidden;
+ padding: 10px;
+ font-size: 13px;
+ border-bottom: 1px solid #eee;
+}
+
+.form-row img, .form-row input {
+ vertical-align: middle;
+}
+
+.form-row label input[type="checkbox"] {
+ margin-top: 0;
+ vertical-align: 0;
+}
+
+form .form-row p {
+ padding-left: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* FORM LABELS */
+
+label {
+ font-weight: normal;
+ color: #666;
+ font-size: 13px;
+}
+
+.required label, label.required {
+ font-weight: bold;
+ color: #333;
+}
+
+/* RADIO BUTTONS */
+
+form ul.radiolist li {
+ list-style-type: none;
+}
+
+form ul.radiolist label {
+ float: none;
+ display: inline;
+}
+
+form ul.radiolist input[type="radio"] {
+ margin: -2px 4px 0 0;
+ padding: 0;
+}
+
+form ul.inline {
+ margin-left: 0;
+ padding: 0;
+}
+
+form ul.inline li {
+ float: left;
+ padding-right: 7px;
+}
+
+/* ALIGNED FIELDSETS */
+
+.aligned label {
+ display: block;
+ padding: 4px 10px 0 0;
+ float: left;
+ width: 160px;
+ word-wrap: break-word;
+ line-height: 1;
+}
+
+.aligned label:not(.vCheckboxLabel):after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 26px;
+}
+
+.aligned label + p {
+ padding: 6px 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 170px;
+}
+
+.aligned ul label {
+ display: inline;
+ float: none;
+ width: auto;
+}
+
+.aligned .form-row input {
+ margin-bottom: 0;
+}
+
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+ width: 350px;
+}
+
+form .aligned ul {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul.radiolist {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+}
+
+form .aligned p.help {
+ clear: left;
+ margin-top: 0;
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned label + p.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+form .aligned p.help:last-child {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+form .aligned input + p.help,
+form .aligned textarea + p.help,
+form .aligned select + p.help {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul li {
+ list-style: none;
+}
+
+form .aligned table p {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.aligned .vCheckboxLabel {
+ float: none;
+ width: auto;
+ display: inline-block;
+ vertical-align: -3px;
+ padding: 0 0 5px 5px;
+}
+
+.aligned .vCheckboxLabel + p.help {
+ margin-top: -4px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+ width: 610px;
+}
+
+.checkbox-row p.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+fieldset .field-box {
+ float: left;
+ margin-right: 20px;
+}
+
+/* WIDE FIELDSETS */
+
+.wide label {
+ width: 200px;
+}
+
+form .wide p, form .wide input + p.help {
+ margin-left: 200px;
+}
+
+form .wide p.help {
+ padding-left: 38px;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+ width: 450px;
+}
+
+/* COLLAPSED FIELDSETS */
+
+fieldset.collapsed * {
+ display: none;
+}
+
+fieldset.collapsed h2, fieldset.collapsed {
+ display: block;
+}
+
+fieldset.collapsed {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+fieldset.collapsed h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+fieldset .collapse-toggle {
+ color: #fff;
+}
+
+fieldset.collapsed .collapse-toggle {
+ background: transparent;
+ display: inline;
+ color: #447e9b;
+}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+ padding: 12px 14px;
+ margin: 0 0 20px;
+ background: #f8f8f8;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ text-align: right;
+ overflow: hidden;
+}
+
+body.popup .submit-row {
+ overflow: auto;
+}
+
+.submit-row input {
+ height: 35px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+}
+
+.submit-row input.default {
+ margin: 0 0 0 8px;
+ text-transform: uppercase;
+}
+
+.submit-row p {
+ margin: 0.3em;
+}
+
+.submit-row p.deletelink-box {
+ float: left;
+ margin: 0;
+}
+
+.submit-row a.deletelink {
+ display: block;
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ color: #fff;
+}
+
+.submit-row a.deletelink:focus,
+.submit-row a.deletelink:hover,
+.submit-row a.deletelink:active {
+ background: #a41515;
+}
+
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+ vertical-align: top;
+}
+
+.vCheckboxField {
+ border: none;
+}
+
+.vDateField, .vTimeField {
+ margin-right: 2px;
+ margin-bottom: 4px;
+}
+
+.vDateField {
+ min-width: 6.85em;
+}
+
+.vTimeField {
+ min-width: 4.7em;
+}
+
+.vURLField {
+ width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+ width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+ height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+ width: 2.2em;
+}
+
+.vTextField {
+ width: 20em;
+}
+
+.vIntegerField {
+ width: 5em;
+}
+
+.vBigIntegerField {
+ width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+ width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+ padding: 0;
+ margin: 0 0 30px;
+}
+
+.inline-group thead th {
+ padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+ width: 160px;
+}
+
+.inline-related {
+ position: relative;
+}
+
+.inline-related h3 {
+ margin: 0;
+ color: #666;
+ padding: 5px;
+ font-size: 13px;
+ background: #f8f8f8;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-related h3 span.delete {
+ float: right;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: 2px;
+ font-size: 11px;
+}
+
+.inline-related fieldset {
+ margin: 0;
+ background: #fff;
+ border: none;
+ width: 100%;
+}
+
+.inline-related fieldset.module h3 {
+ margin: 0;
+ padding: 2px 5px 3px 5px;
+ font-size: 11px;
+ text-align: left;
+ font-weight: bold;
+ background: #bcd;
+ color: #fff;
+}
+
+.inline-group .tabular fieldset.module {
+ border: none;
+}
+
+.inline-related.tabular fieldset.module table {
+ width: 100%;
+}
+
+.last-related fieldset {
+ border: none;
+}
+
+.inline-group .tabular tr.has_original td {
+ padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+ padding: 2px 0 0 0;
+ width: 0;
+ _position: relative;
+}
+
+.inline-group .tabular th.original {
+ width: 0px;
+ padding: 0;
+}
+
+.inline-group .tabular td.original p {
+ position: absolute;
+ left: 0;
+ height: 1.1em;
+ padding: 2px 9px;
+ overflow: hidden;
+ font-size: 9px;
+ font-weight: bold;
+ color: #666;
+ _width: 700px;
+}
+
+.inline-group ul.tools {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.inline-group ul.tools li {
+ display: inline;
+ padding: 0 5px;
+}
+
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+ color: #666;
+ background: #f8f8f8;
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+ padding-left: 16px;
+ font-size: 12px;
+}
+
+.empty-form {
+ display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+ margin-left: 5px;
+ display: inline-block;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-size: 14px;
+}
+
+.add-another {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/icon-addlink.svg);
+}
+
+.related-lookup {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/search.svg);
+}
+
+form .related-widget-wrapper ul {
+ display: inline-block;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.clearable-file-input input {
+ margin-top: 0;
+}
diff --git a/tbc/static/admin/css/login.css b/tbc/static/admin/css/login.css
new file mode 100644
index 0000000..cab3bbf
--- /dev/null
+++ b/tbc/static/admin/css/login.css
@@ -0,0 +1,78 @@
+/* LOGIN FORM */
+
+body.login {
+ background: #f8f8f8;
+}
+
+.login #header {
+ height: auto;
+ padding: 5px 16px;
+}
+
+.login #header h1 {
+ font-size: 18px;
+}
+
+.login #header h1 a {
+ color: #fff;
+}
+
+.login #content {
+ padding: 20px 20px 0;
+}
+
+.login #container {
+ background: #fff;
+ border: 1px solid #eaeaea;
+ border-radius: 4px;
+ overflow: hidden;
+ width: 28em;
+ min-width: 300px;
+ margin: 100px auto;
+}
+
+.login #content-main {
+ width: 100%;
+}
+
+.login .form-row {
+ padding: 4px 0;
+ float: left;
+ width: 100%;
+ border-bottom: none;
+}
+
+.login .form-row label {
+ padding-right: 0.5em;
+ line-height: 2em;
+ font-size: 1em;
+ clear: both;
+ color: #333;
+}
+
+.login .form-row #id_username, .login .form-row #id_password {
+ clear: both;
+ padding: 8px;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.login span.help {
+ font-size: 10px;
+ display: block;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 0 0 9.4em;
+ margin: 0;
+ border: none;
+ background: none;
+ text-align: left;
+}
+
+.login .password-reset-link {
+ text-align: center;
+}
diff --git a/tbc/static/admin/css/rtl.css b/tbc/static/admin/css/rtl.css
new file mode 100644
index 0000000..8c1ceb4
--- /dev/null
+++ b/tbc/static/admin/css/rtl.css
@@ -0,0 +1,256 @@
+body {
+ direction: rtl;
+}
+
+/* LOGIN */
+
+.login .form-row {
+ float: right;
+}
+
+.login .form-row label {
+ float: right;
+ padding-left: 0.5em;
+ padding-right: 0;
+ text-align: left;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 9.4em 0 0;
+}
+
+/* GLOBAL */
+
+th {
+ text-align: right;
+}
+
+.module h2, .module caption {
+ text-align: right;
+}
+
+.module ul, .module ol {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+.addlink, .changelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.deletelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.object-tools {
+ float: left;
+}
+
+thead th:first-child,
+tfoot td:first-child {
+ border-left: none;
+}
+
+/* LAYOUT */
+
+#user-tools {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
+
+div.breadcrumbs {
+ text-align: right;
+}
+
+#content-main {
+ float: right;
+}
+
+#content-related {
+ float: left;
+ margin-left: -300px;
+ margin-right: auto;
+}
+
+.colMS {
+ margin-left: 300px;
+ margin-right: 0;
+}
+
+/* SORTABLE TABLES */
+
+table thead th.sorted .sortoptions {
+ float: left;
+}
+
+thead th.sorted .text {
+ padding-right: 0;
+ padding-left: 42px;
+}
+
+/* dashboard styles */
+
+.dashboard .module table td a {
+ padding-left: .6em;
+ padding-right: 16px;
+}
+
+/* changelists styles */
+
+.change-list .filtered table {
+ border-left: none;
+ border-right: 0px none;
+}
+
+#changelist-filter {
+ right: auto;
+ left: 0;
+ border-left: none;
+ border-right: none;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
+ margin-right: 0;
+ margin-left: 280px;
+}
+
+#changelist-filter li.selected {
+ border-left: none;
+ padding-left: 10px;
+ margin-left: 0;
+ border-right: 5px solid #eaeaea;
+ padding-right: 10px;
+ margin-right: -15px;
+}
+
+.filtered .actions {
+ margin-left: 280px;
+ margin-right: 0;
+}
+
+#changelist table tbody td:first-child, #changelist table tbody th:first-child {
+ border-right: none;
+ border-left: none;
+}
+
+/* FORMS */
+
+.aligned label {
+ padding: 0 0 3px 1em;
+ float: right;
+}
+
+.submit-row {
+ text-align: left
+}
+
+.submit-row p.deletelink-box {
+ float: right;
+}
+
+.submit-row input.default {
+ margin-left: 0;
+}
+
+.vDateField, .vTimeField {
+ margin-left: 2px;
+}
+
+.aligned .form-row input {
+ margin-left: 5px;
+}
+
+form ul.inline li {
+ float: right;
+ padding-right: 0;
+ padding-left: 7px;
+}
+
+input[type=submit].default, .submit-row input.default {
+ float: left;
+}
+
+fieldset .field-box {
+ float: right;
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.errorlist li {
+ background-position: 100% 12px;
+ padding: 0;
+}
+
+.errornote {
+ background-position: 100% 12px;
+ padding: 10px 12px;
+}
+
+/* WIDGETS */
+
+.calendarnav-previous {
+ top: 0;
+ left: auto;
+ right: 10px;
+}
+
+.calendarnav-next {
+ top: 0;
+ right: auto;
+ left: 10px;
+}
+
+.calendar caption, .calendarbox h2 {
+ text-align: center;
+}
+
+.selector {
+ float: right;
+}
+
+.selector .selector-filter {
+ text-align: right;
+}
+
+.inline-deletelink {
+ float: left;
+}
+
+form .form-row p.datetime {
+ overflow: hidden;
+}
+
+/* MISC */
+
+.inline-related h2, .inline-group h2 {
+ text-align: right
+}
+
+.inline-related h3 span.delete {
+ padding-right: 20px;
+ padding-left: inherit;
+ left: 10px;
+ right: inherit;
+ float:left;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: inherit;
+ margin-right: 2px;
+}
+
+/* IE7 specific bug fixes */
+
+div.colM {
+ position: relative;
+}
+
+.submit-row input {
+ float: left;
+}
diff --git a/tbc/static/admin/css/widgets.css b/tbc/static/admin/css/widgets.css
new file mode 100644
index 0000000..d3bd67a
--- /dev/null
+++ b/tbc/static/admin/css/widgets.css
@@ -0,0 +1,565 @@
+/* SELECTOR (FILTER INTERFACE) */
+
+.selector {
+ width: 800px;
+ float: left;
+}
+
+.selector select {
+ width: 380px;
+ height: 17.2em;
+}
+
+.selector-available, .selector-chosen {
+ float: left;
+ width: 380px;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.selector-chosen select {
+ border-top: none;
+}
+
+.selector-available h2, .selector-chosen h2 {
+ border: 1px solid #ccc;
+ border-radius: 4px 4px 0 0;
+}
+
+.selector-chosen h2 {
+ background: #79aec8;
+ color: #fff;
+}
+
+.selector .selector-available h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+.selector .selector-filter {
+ background: white;
+ border: 1px solid #ccc;
+ border-width: 0 1px;
+ padding: 8px;
+ color: #999;
+ font-size: 10px;
+ margin: 0;
+ text-align: left;
+}
+
+.selector .selector-filter label,
+.inline-group .aligned .selector .selector-filter label {
+ float: left;
+ margin: 7px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ overflow: hidden;
+ line-height: 1;
+}
+
+.selector .selector-available input {
+ width: 320px;
+ margin-left: 8px;
+}
+
+.selector ul.selector-chooser {
+ float: left;
+ width: 22px;
+ background-color: #eee;
+ border-radius: 10px;
+ margin: 10em 5px 0 5px;
+ padding: 0;
+}
+
+.selector-chooser li {
+ margin: 0;
+ padding: 3px;
+ list-style-type: none;
+}
+
+.selector select {
+ padding: 0 10px;
+ margin: 0 0 10px;
+ border-radius: 0 0 4px 4px;
+}
+
+.selector-add, .selector-remove {
+ width: 16px;
+ height: 16px;
+ display: block;
+ text-indent: -3000px;
+ overflow: hidden;
+ cursor: default;
+ opacity: 0.3;
+}
+
+.active.selector-add, .active.selector-remove {
+ opacity: 1;
+}
+
+.active.selector-add:hover, .active.selector-remove:hover {
+ cursor: pointer;
+}
+
+.selector-add {
+ background: url(../img/selector-icons.svg) 0 -96px no-repeat;
+}
+
+.active.selector-add:focus, .active.selector-add:hover {
+ background-position: 0 -112px;
+}
+
+.selector-remove {
+ background: url(../img/selector-icons.svg) 0 -64px no-repeat;
+}
+
+.active.selector-remove:focus, .active.selector-remove:hover {
+ background-position: 0 -80px;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ display: inline-block;
+ height: 16px;
+ text-align: left;
+ margin: 1px auto 3px;
+ overflow: hidden;
+ font-weight: bold;
+ line-height: 16px;
+ color: #666;
+ text-decoration: none;
+ opacity: 0.3;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ color: #447e9b;
+}
+
+a.active.selector-chooseall, a.active.selector-clearall {
+ opacity: 1;
+}
+
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ cursor: pointer;
+}
+
+a.selector-chooseall {
+ padding: 0 18px 0 0;
+ background: url(../img/selector-icons.svg) right -160px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
+ background-position: 100% -176px;
+}
+
+a.selector-clearall {
+ padding: 0 0 0 18px;
+ background: url(../img/selector-icons.svg) 0 -128px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-clearall:focus, a.active.selector-clearall:hover {
+ background-position: 0 -144px;
+}
+
+/* STACKED SELECTORS */
+
+.stacked {
+ float: left;
+ width: 490px;
+}
+
+.stacked select {
+ width: 480px;
+ height: 10.1em;
+}
+
+.stacked .selector-available, .stacked .selector-chosen {
+ width: 480px;
+}
+
+.stacked .selector-available {
+ margin-bottom: 0;
+}
+
+.stacked .selector-available input {
+ width: 422px;
+}
+
+.stacked ul.selector-chooser {
+ height: 22px;
+ width: 50px;
+ margin: 0 0 10px 40%;
+ background-color: #eee;
+ border-radius: 10px;
+}
+
+.stacked .selector-chooser li {
+ float: left;
+ padding: 3px 3px 3px 5px;
+}
+
+.stacked .selector-chooseall, .stacked .selector-clearall {
+ display: none;
+}
+
+.stacked .selector-add {
+ background: url(../img/selector-icons.svg) 0 -32px no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-add {
+ background-position: 0 -48px;
+ cursor: pointer;
+}
+
+.stacked .selector-remove {
+ background: url(../img/selector-icons.svg) 0 0 no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-remove {
+ background-position: 0 -16px;
+ cursor: pointer;
+}
+
+.selector .help-icon {
+ background: url(../img/icon-unknown.svg) 0 0 no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 2px;
+ width: 13px;
+ height: 13px;
+}
+
+.selector .selector-chosen .help-icon {
+ background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat;
+}
+
+.selector .search-label-icon {
+ background: url(../img/search.svg) 0 0 no-repeat;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+}
+
+/* DATE AND TIME */
+
+p.datetime {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-weight: bold;
+}
+
+.datetime span {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 11px;
+ color: #ccc;
+}
+
+.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ min-width: 0;
+ margin-left: 5px;
+ margin-bottom: 4px;
+}
+
+table p.datetime {
+ font-size: 11px;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+}
+
+.datetimeshortcuts .clock-icon {
+ background: url(../img/icon-clock.svg) 0 0 no-repeat;
+}
+
+.datetimeshortcuts a:focus .clock-icon,
+.datetimeshortcuts a:hover .clock-icon {
+ background-position: 0 -16px;
+}
+
+.datetimeshortcuts .date-icon {
+ background: url(../img/icon-calendar.svg) 0 0 no-repeat;
+ top: -1px;
+}
+
+.datetimeshortcuts a:focus .date-icon,
+.datetimeshortcuts a:hover .date-icon {
+ background-position: 0 -16px;
+}
+
+.timezonewarning {
+ font-size: 11px;
+ color: #999;
+}
+
+/* URL */
+
+p.url {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.url a {
+ font-weight: normal;
+}
+
+/* FILE UPLOADS */
+
+p.file-upload {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.aligned p.file-upload {
+ margin-left: 170px;
+}
+
+.file-upload a {
+ font-weight: normal;
+}
+
+.file-upload .deletelink {
+ margin-left: 5px;
+}
+
+span.clearable-file-input label {
+ color: #333;
+ font-size: 11px;
+ display: inline;
+ float: none;
+}
+
+/* CALENDARS & CLOCKS */
+
+.calendarbox, .clockbox {
+ margin: 5px auto;
+ font-size: 12px;
+ width: 19em;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+ position: relative;
+}
+
+.clockbox {
+ width: auto;
+}
+
+.calendar {
+ margin: 0;
+ padding: 0;
+}
+
+.calendar table {
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+ background: white;
+ width: 100%;
+}
+
+.calendar caption, .calendarbox h2 {
+ margin: 0;
+ text-align: center;
+ border-top: none;
+ background: #f5dd5d;
+ font-weight: 700;
+ font-size: 12px;
+ color: #333;
+}
+
+.calendar th {
+ padding: 8px 5px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #ddd;
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ color: #666;
+}
+
+.calendar td {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ padding: 0;
+ border-top: 1px solid #eee;
+ border-bottom: none;
+}
+
+.calendar td.selected a {
+ background: #79aec8;
+ color: #fff;
+}
+
+.calendar td.nonday {
+ background: #f8f8f8;
+}
+
+.calendar td.today a {
+ font-weight: 700;
+}
+
+.calendar td a, .timelist a {
+ display: block;
+ font-weight: 400;
+ padding: 6px;
+ text-decoration: none;
+ color: #444;
+}
+
+.calendar td a:focus, .timelist a:focus,
+.calendar td a:hover, .timelist a:hover {
+ background: #79aec8;
+ color: white;
+}
+
+.calendar td a:active, .timelist a:active {
+ background: #417690;
+ color: white;
+}
+
+.calendarnav {
+ font-size: 10px;
+ text-align: center;
+ color: #ccc;
+ margin: 0;
+ padding: 1px 3px;
+}
+
+.calendarnav a:link, #calendarnav a:visited,
+#calendarnav a:focus, #calendarnav a:hover {
+ color: #999;
+}
+
+.calendar-shortcuts {
+ background: white;
+ font-size: 11px;
+ line-height: 11px;
+ border-top: 1px solid #eee;
+ padding: 8px 0;
+ color: #ccc;
+}
+
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ display: block;
+ position: absolute;
+ top: 8px;
+ width: 15px;
+ height: 15px;
+ text-indent: -9999px;
+ padding: 0;
+}
+
+.calendarnav-previous {
+ left: 10px;
+ background: url(../img/calendar-icons.svg) 0 0 no-repeat;
+}
+
+.calendarbox .calendarnav-previous:focus,
+.calendarbox .calendarnav-previous:hover {
+ background-position: 0 -15px;
+}
+
+.calendarnav-next {
+ right: 10px;
+ background: url(../img/calendar-icons.svg) 0 -30px no-repeat;
+}
+
+.calendarbox .calendarnav-next:focus,
+.calendarbox .calendarnav-next:hover {
+ background-position: 0 -45px;
+}
+
+.calendar-cancel {
+ margin: 0;
+ padding: 4px 0;
+ font-size: 12px;
+ background: #eee;
+ border-top: 1px solid #ddd;
+ color: #333;
+}
+
+.calendar-cancel:focus, .calendar-cancel:hover {
+ background: #ddd;
+}
+
+.calendar-cancel a {
+ color: black;
+ display: block;
+}
+
+ul.timelist, .timelist li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.timelist a {
+ padding: 2px;
+}
+
+/* EDIT INLINE */
+
+.inline-deletelink {
+ float: right;
+ text-indent: -9999px;
+ background: url(../img/inline-delete.svg) 0 0 no-repeat;
+ width: 16px;
+ height: 16px;
+ border: 0px none;
+}
+
+.inline-deletelink:focus, .inline-deletelink:hover {
+ cursor: pointer;
+}
+
+/* RELATED WIDGET WRAPPER */
+.related-widget-wrapper {
+ float: left; /* display properly in form rows with multiple fields */
+ overflow: hidden; /* clear floated contents */
+}
+
+.related-widget-wrapper-link {
+ opacity: 0.3;
+}
+
+.related-widget-wrapper-link:link {
+ opacity: .8;
+}
+
+.related-widget-wrapper-link:link:focus,
+.related-widget-wrapper-link:link:hover {
+ opacity: 1;
+}
+
+select + .related-widget-wrapper-link,
+.related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 7px;
+}
diff --git a/tbc/static/admin/decorators.py b/tbc/static/admin/decorators.py
new file mode 100644
index 0000000..5862bb5
--- /dev/null
+++ b/tbc/static/admin/decorators.py
@@ -0,0 +1,28 @@
+def register(*models, **kwargs):
+ """
+ Registers the given model(s) classes and wrapped ModelAdmin class with
+ admin site:
+
+ @register(Author)
+ class AuthorAdmin(admin.ModelAdmin):
+ pass
+
+ A kwarg of `site` can be passed as the admin site, otherwise the default
+ admin site will be used.
+ """
+ from django.contrib.admin import ModelAdmin
+ from django.contrib.admin.sites import site, AdminSite
+
+ def _model_admin_wrapper(admin_class):
+ admin_site = kwargs.pop('site', site)
+
+ if not isinstance(admin_site, AdminSite):
+ raise ValueError('site must subclass AdminSite')
+
+ if not issubclass(admin_class, ModelAdmin):
+ raise ValueError('Wrapped class must subclass ModelAdmin.')
+
+ admin_site.register(models, admin_class=admin_class)
+
+ return admin_class
+ return _model_admin_wrapper
diff --git a/tbc/static/admin/exceptions.py b/tbc/static/admin/exceptions.py
new file mode 100644
index 0000000..f619bc2
--- /dev/null
+++ b/tbc/static/admin/exceptions.py
@@ -0,0 +1,11 @@
+from django.core.exceptions import SuspiciousOperation
+
+
+class DisallowedModelAdminLookup(SuspiciousOperation):
+ """Invalid filter was passed to admin view via URL querystring"""
+ pass
+
+
+class DisallowedModelAdminToField(SuspiciousOperation):
+ """Invalid to_field was passed to admin view via URL query string"""
+ pass
diff --git a/tbc/static/admin/filters.py b/tbc/static/admin/filters.py
new file mode 100644
index 0000000..f7c520a
--- /dev/null
+++ b/tbc/static/admin/filters.py
@@ -0,0 +1,416 @@
+"""
+This encapsulates the logic for displaying filters in the Django admin.
+Filters are specified in models with the "list_filter" option.
+
+Each filter subclass knows how to display a filter for a field that passes a
+certain test -- e.g. being a DateField or ForeignKey.
+"""
+import datetime
+
+from django.contrib.admin.options import IncorrectLookupParameters
+from django.contrib.admin.utils import (
+ get_model_from_relation, prepare_lookup_value, reverse_field_path,
+)
+from django.core.exceptions import ImproperlyConfigured, ValidationError
+from django.db import models
+from django.utils import timezone
+from django.utils.encoding import force_text, smart_text
+from django.utils.translation import ugettext_lazy as _
+
+
+class ListFilter(object):
+ title = None # Human-readable title to appear in the right sidebar.
+ template = 'admin/filter.html'
+
+ def __init__(self, request, params, model, model_admin):
+ # This dictionary will eventually contain the request's query string
+ # parameters actually used by this filter.
+ self.used_parameters = {}
+ if self.title is None:
+ raise ImproperlyConfigured(
+ "The list filter '%s' does not specify "
+ "a 'title'." % self.__class__.__name__)
+
+ def has_output(self):
+ """
+ Returns True if some choices would be output for this filter.
+ """
+ raise NotImplementedError('subclasses of ListFilter must provide a has_output() method')
+
+ def choices(self, cl):
+ """
+ Returns choices ready to be output in the template.
+ """
+ raise NotImplementedError('subclasses of ListFilter must provide a choices() method')
+
+ def queryset(self, request, queryset):
+ """
+ Returns the filtered queryset.
+ """
+ raise NotImplementedError('subclasses of ListFilter must provide a queryset() method')
+
+ def expected_parameters(self):
+ """
+ Returns the list of parameter names that are expected from the
+ request's query string and that will be used by this filter.
+ """
+ raise NotImplementedError('subclasses of ListFilter must provide an expected_parameters() method')
+
+
+class SimpleListFilter(ListFilter):
+ # The parameter that should be used in the query string for that filter.
+ parameter_name = None
+
+ def __init__(self, request, params, model, model_admin):
+ super(SimpleListFilter, self).__init__(
+ request, params, model, model_admin)
+ if self.parameter_name is None:
+ raise ImproperlyConfigured(
+ "The list filter '%s' does not specify "
+ "a 'parameter_name'." % self.__class__.__name__)
+ if self.parameter_name in params:
+ value = params.pop(self.parameter_name)
+ self.used_parameters[self.parameter_name] = value
+ lookup_choices = self.lookups(request, model_admin)
+ if lookup_choices is None:
+ lookup_choices = ()
+ self.lookup_choices = list(lookup_choices)
+
+ def has_output(self):
+ return len(self.lookup_choices) > 0
+
+ def value(self):
+ """
+ Returns the value (in string format) provided in the request's
+ query string for this filter, if any. If the value wasn't provided then
+ returns None.
+ """
+ return self.used_parameters.get(self.parameter_name)
+
+ def lookups(self, request, model_admin):
+ """
+ Must be overridden to return a list of tuples (value, verbose value)
+ """
+ raise NotImplementedError(
+ 'The SimpleListFilter.lookups() method must be overridden to '
+ 'return a list of tuples (value, verbose value)')
+
+ def expected_parameters(self):
+ return [self.parameter_name]
+
+ def choices(self, cl):
+ yield {
+ 'selected': self.value() is None,
+ 'query_string': cl.get_query_string({}, [self.parameter_name]),
+ 'display': _('All'),
+ }
+ for lookup, title in self.lookup_choices:
+ yield {
+ 'selected': self.value() == force_text(lookup),
+ 'query_string': cl.get_query_string({
+ self.parameter_name: lookup,
+ }, []),
+ 'display': title,
+ }
+
+
+class FieldListFilter(ListFilter):
+ _field_list_filters = []
+ _take_priority_index = 0
+
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ self.field = field
+ self.field_path = field_path
+ self.title = getattr(field, 'verbose_name', field_path)
+ super(FieldListFilter, self).__init__(
+ request, params, model, model_admin)
+ for p in self.expected_parameters():
+ if p in params:
+ value = params.pop(p)
+ self.used_parameters[p] = prepare_lookup_value(p, value)
+
+ def has_output(self):
+ return True
+
+ def queryset(self, request, queryset):
+ try:
+ return queryset.filter(**self.used_parameters)
+ except ValidationError as e:
+ raise IncorrectLookupParameters(e)
+
+ @classmethod
+ def register(cls, test, list_filter_class, take_priority=False):
+ if take_priority:
+ # This is to allow overriding the default filters for certain types
+ # of fields with some custom filters. The first found in the list
+ # is used in priority.
+ cls._field_list_filters.insert(
+ cls._take_priority_index, (test, list_filter_class))
+ cls._take_priority_index += 1
+ else:
+ cls._field_list_filters.append((test, list_filter_class))
+
+ @classmethod
+ def create(cls, field, request, params, model, model_admin, field_path):
+ for test, list_filter_class in cls._field_list_filters:
+ if not test(field):
+ continue
+ return list_filter_class(field, request, params,
+ model, model_admin, field_path=field_path)
+
+
+class RelatedFieldListFilter(FieldListFilter):
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ other_model = get_model_from_relation(field)
+ self.lookup_kwarg = '%s__%s__exact' % (field_path, field.target_field.name)
+ self.lookup_kwarg_isnull = '%s__isnull' % field_path
+ self.lookup_val = request.GET.get(self.lookup_kwarg)
+ self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull)
+ self.lookup_choices = self.field_choices(field, request, model_admin)
+ super(RelatedFieldListFilter, self).__init__(
+ field, request, params, model, model_admin, field_path)
+ if hasattr(field, 'verbose_name'):
+ self.lookup_title = field.verbose_name
+ else:
+ self.lookup_title = other_model._meta.verbose_name
+ self.title = self.lookup_title
+ self.empty_value_display = model_admin.get_empty_value_display()
+
+ @property
+ def include_empty_choice(self):
+ """
+ Return True if a "(None)" choice should be included, which filters
+ out everything except empty relationships.
+ """
+ return self.field.null or (self.field.is_relation and self.field.many_to_many)
+
+ def has_output(self):
+ if self.include_empty_choice:
+ extra = 1
+ else:
+ extra = 0
+ return len(self.lookup_choices) + extra > 1
+
+ def expected_parameters(self):
+ return [self.lookup_kwarg, self.lookup_kwarg_isnull]
+
+ def field_choices(self, field, request, model_admin):
+ return field.get_choices(include_blank=False)
+
+ def choices(self, cl):
+ yield {
+ 'selected': self.lookup_val is None and not self.lookup_val_isnull,
+ 'query_string': cl.get_query_string({},
+ [self.lookup_kwarg, self.lookup_kwarg_isnull]),
+ 'display': _('All'),
+ }
+ for pk_val, val in self.lookup_choices:
+ yield {
+ 'selected': self.lookup_val == smart_text(pk_val),
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg: pk_val,
+ }, [self.lookup_kwarg_isnull]),
+ 'display': val,
+ }
+ if self.include_empty_choice:
+ yield {
+ 'selected': bool(self.lookup_val_isnull),
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg_isnull: 'True',
+ }, [self.lookup_kwarg]),
+ 'display': self.empty_value_display,
+ }
+
+FieldListFilter.register(lambda f: f.remote_field, RelatedFieldListFilter)
+
+
+class BooleanFieldListFilter(FieldListFilter):
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ self.lookup_kwarg = '%s__exact' % field_path
+ self.lookup_kwarg2 = '%s__isnull' % field_path
+ self.lookup_val = request.GET.get(self.lookup_kwarg)
+ self.lookup_val2 = request.GET.get(self.lookup_kwarg2)
+ super(BooleanFieldListFilter, self).__init__(field,
+ request, params, model, model_admin, field_path)
+
+ def expected_parameters(self):
+ return [self.lookup_kwarg, self.lookup_kwarg2]
+
+ def choices(self, cl):
+ for lookup, title in (
+ (None, _('All')),
+ ('1', _('Yes')),
+ ('0', _('No'))):
+ yield {
+ 'selected': self.lookup_val == lookup and not self.lookup_val2,
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg: lookup,
+ }, [self.lookup_kwarg2]),
+ 'display': title,
+ }
+ if isinstance(self.field, models.NullBooleanField):
+ yield {
+ 'selected': self.lookup_val2 == 'True',
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg2: 'True',
+ }, [self.lookup_kwarg]),
+ 'display': _('Unknown'),
+ }
+
+FieldListFilter.register(lambda f: isinstance(f,
+ (models.BooleanField, models.NullBooleanField)), BooleanFieldListFilter)
+
+
+class ChoicesFieldListFilter(FieldListFilter):
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ self.lookup_kwarg = '%s__exact' % field_path
+ self.lookup_val = request.GET.get(self.lookup_kwarg)
+ super(ChoicesFieldListFilter, self).__init__(
+ field, request, params, model, model_admin, field_path)
+
+ def expected_parameters(self):
+ return [self.lookup_kwarg]
+
+ def choices(self, cl):
+ yield {
+ 'selected': self.lookup_val is None,
+ 'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
+ 'display': _('All')
+ }
+ for lookup, title in self.field.flatchoices:
+ yield {
+ 'selected': smart_text(lookup) == self.lookup_val,
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg: lookup}),
+ 'display': title,
+ }
+
+FieldListFilter.register(lambda f: bool(f.choices), ChoicesFieldListFilter)
+
+
+class DateFieldListFilter(FieldListFilter):
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ self.field_generic = '%s__' % field_path
+ self.date_params = {k: v for k, v in params.items()
+ if k.startswith(self.field_generic)}
+
+ now = timezone.now()
+ # When time zone support is enabled, convert "now" to the user's time
+ # zone so Django's definition of "Today" matches what the user expects.
+ if timezone.is_aware(now):
+ now = timezone.localtime(now)
+
+ if isinstance(field, models.DateTimeField):
+ today = now.replace(hour=0, minute=0, second=0, microsecond=0)
+ else: # field is a models.DateField
+ today = now.date()
+ tomorrow = today + datetime.timedelta(days=1)
+ if today.month == 12:
+ next_month = today.replace(year=today.year + 1, month=1, day=1)
+ else:
+ next_month = today.replace(month=today.month + 1, day=1)
+ next_year = today.replace(year=today.year + 1, month=1, day=1)
+
+ self.lookup_kwarg_since = '%s__gte' % field_path
+ self.lookup_kwarg_until = '%s__lt' % field_path
+ self.links = (
+ (_('Any date'), {}),
+ (_('Today'), {
+ self.lookup_kwarg_since: str(today),
+ self.lookup_kwarg_until: str(tomorrow),
+ }),
+ (_('Past 7 days'), {
+ self.lookup_kwarg_since: str(today - datetime.timedelta(days=7)),
+ self.lookup_kwarg_until: str(tomorrow),
+ }),
+ (_('This month'), {
+ self.lookup_kwarg_since: str(today.replace(day=1)),
+ self.lookup_kwarg_until: str(next_month),
+ }),
+ (_('This year'), {
+ self.lookup_kwarg_since: str(today.replace(month=1, day=1)),
+ self.lookup_kwarg_until: str(next_year),
+ }),
+ )
+ super(DateFieldListFilter, self).__init__(
+ field, request, params, model, model_admin, field_path)
+
+ def expected_parameters(self):
+ return [self.lookup_kwarg_since, self.lookup_kwarg_until]
+
+ def choices(self, cl):
+ for title, param_dict in self.links:
+ yield {
+ 'selected': self.date_params == param_dict,
+ 'query_string': cl.get_query_string(
+ param_dict, [self.field_generic]),
+ 'display': title,
+ }
+
+FieldListFilter.register(
+ lambda f: isinstance(f, models.DateField), DateFieldListFilter)
+
+
+# This should be registered last, because it's a last resort. For example,
+# if a field is eligible to use the BooleanFieldListFilter, that'd be much
+# more appropriate, and the AllValuesFieldListFilter won't get used for it.
+class AllValuesFieldListFilter(FieldListFilter):
+ def __init__(self, field, request, params, model, model_admin, field_path):
+ self.lookup_kwarg = field_path
+ self.lookup_kwarg_isnull = '%s__isnull' % field_path
+ self.lookup_val = request.GET.get(self.lookup_kwarg)
+ self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull)
+ self.empty_value_display = model_admin.get_empty_value_display()
+ parent_model, reverse_path = reverse_field_path(model, field_path)
+ # Obey parent ModelAdmin queryset when deciding which options to show
+ if model == parent_model:
+ queryset = model_admin.get_queryset(request)
+ else:
+ queryset = parent_model._default_manager.all()
+ self.lookup_choices = (queryset
+ .distinct()
+ .order_by(field.name)
+ .values_list(field.name, flat=True))
+ super(AllValuesFieldListFilter, self).__init__(
+ field, request, params, model, model_admin, field_path)
+
+ def expected_parameters(self):
+ return [self.lookup_kwarg, self.lookup_kwarg_isnull]
+
+ def choices(self, cl):
+ yield {
+ 'selected': (self.lookup_val is None
+ and self.lookup_val_isnull is None),
+ 'query_string': cl.get_query_string({},
+ [self.lookup_kwarg, self.lookup_kwarg_isnull]),
+ 'display': _('All'),
+ }
+ include_none = False
+ for val in self.lookup_choices:
+ if val is None:
+ include_none = True
+ continue
+ val = smart_text(val)
+ yield {
+ 'selected': self.lookup_val == val,
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg: val,
+ }, [self.lookup_kwarg_isnull]),
+ 'display': val,
+ }
+ if include_none:
+ yield {
+ 'selected': bool(self.lookup_val_isnull),
+ 'query_string': cl.get_query_string({
+ self.lookup_kwarg_isnull: 'True',
+ }, [self.lookup_kwarg]),
+ 'display': self.empty_value_display,
+ }
+
+FieldListFilter.register(lambda f: True, AllValuesFieldListFilter)
+
+
+class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
+ def field_choices(self, field, request, model_admin):
+ limit_choices_to = {'pk__in': set(model_admin.get_queryset(request).values_list(field.name, flat=True))}
+ return field.get_choices(include_blank=False, limit_choices_to=limit_choices_to)
diff --git a/tbc/static/admin/fonts/LICENSE.txt b/tbc/static/admin/fonts/LICENSE.txt
new file mode 100755
index 0000000..75b5248
--- /dev/null
+++ b/tbc/static/admin/fonts/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/tbc/static/admin/fonts/README.txt b/tbc/static/admin/fonts/README.txt
new file mode 100644
index 0000000..cc2135a
--- /dev/null
+++ b/tbc/static/admin/fonts/README.txt
@@ -0,0 +1,2 @@
+Roboto webfont source: https://www.google.com/fonts/specimen/Roboto
+Weights used in this project: Light (300), Regular (400), Bold (700)
diff --git a/tbc/static/admin/fonts/Roboto-Bold-webfont.woff b/tbc/static/admin/fonts/Roboto-Bold-webfont.woff
new file mode 100644
index 0000000..03357ce
--- /dev/null
+++ b/tbc/static/admin/fonts/Roboto-Bold-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/fonts/Roboto-Light-webfont.woff b/tbc/static/admin/fonts/Roboto-Light-webfont.woff
new file mode 100644
index 0000000..f6abd87
--- /dev/null
+++ b/tbc/static/admin/fonts/Roboto-Light-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/fonts/Roboto-Regular-webfont.woff b/tbc/static/admin/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..6ff6afd
--- /dev/null
+++ b/tbc/static/admin/fonts/Roboto-Regular-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/forms.py b/tbc/static/admin/forms.py
new file mode 100644
index 0000000..2e482b9
--- /dev/null
+++ b/tbc/static/admin/forms.py
@@ -0,0 +1,29 @@
+from __future__ import unicode_literals
+
+from django import forms
+from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
+from django.utils.translation import ugettext_lazy as _
+
+
+class AdminAuthenticationForm(AuthenticationForm):
+ """
+ A custom authentication form used in the admin app.
+ """
+ error_messages = {
+ 'invalid_login': _("Please enter the correct %(username)s and password "
+ "for a staff account. Note that both fields may be "
+ "case-sensitive."),
+ }
+ required_css_class = 'required'
+
+ def confirm_login_allowed(self, user):
+ if not user.is_active or not user.is_staff:
+ raise forms.ValidationError(
+ self.error_messages['invalid_login'],
+ code='invalid_login',
+ params={'username': self.username_field.verbose_name}
+ )
+
+
+class AdminPasswordChangeForm(PasswordChangeForm):
+ required_css_class = 'required'
diff --git a/tbc/static/admin/helpers.py b/tbc/static/admin/helpers.py
new file mode 100644
index 0000000..e673199
--- /dev/null
+++ b/tbc/static/admin/helpers.py
@@ -0,0 +1,371 @@
+from __future__ import unicode_literals
+
+import warnings
+
+from django import forms
+from django.conf import settings
+from django.contrib.admin.templatetags.admin_static import static
+from django.contrib.admin.utils import (
+ display_for_field, flatten_fieldsets, help_text_for_field, label_for_field,
+ lookup_field,
+)
+from django.core.exceptions import ObjectDoesNotExist
+from django.db.models.fields.related import ManyToManyRel
+from django.forms.utils import flatatt
+from django.template.defaultfilters import capfirst, linebreaksbr
+from django.utils import six
+from django.utils.deprecation import (
+ RemovedInDjango20Warning, RemovedInDjango110Warning,
+)
+from django.utils.encoding import force_text, smart_text
+from django.utils.functional import cached_property
+from django.utils.html import conditional_escape, format_html
+from django.utils.safestring import mark_safe
+from django.utils.translation import ugettext_lazy as _
+
+ACTION_CHECKBOX_NAME = '_selected_action'
+
+
+class ActionForm(forms.Form):
+ action = forms.ChoiceField(label=_('Action:'))
+ select_across = forms.BooleanField(label='', required=False, initial=0,
+ widget=forms.HiddenInput({'class': 'select-across'}))
+
+checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False)
+
+
+class AdminForm(object):
+ def __init__(self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None):
+ self.form, self.fieldsets = form, fieldsets
+ self.prepopulated_fields = [{
+ 'field': form[field_name],
+ 'dependencies': [form[f] for f in dependencies]
+ } for field_name, dependencies in prepopulated_fields.items()]
+ self.model_admin = model_admin
+ if readonly_fields is None:
+ readonly_fields = ()
+ self.readonly_fields = readonly_fields
+
+ def __iter__(self):
+ for name, options in self.fieldsets:
+ yield Fieldset(
+ self.form, name,
+ readonly_fields=self.readonly_fields,
+ model_admin=self.model_admin,
+ **options
+ )
+
+ def _media(self):
+ media = self.form.media
+ for fs in self:
+ media = media + fs.media
+ return media
+ media = property(_media)
+
+
+class Fieldset(object):
+ def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(),
+ description=None, model_admin=None):
+ self.form = form
+ self.name, self.fields = name, fields
+ self.classes = ' '.join(classes)
+ self.description = description
+ self.model_admin = model_admin
+ self.readonly_fields = readonly_fields
+
+ def _media(self):
+ if 'collapse' in self.classes:
+ extra = '' if settings.DEBUG else '.min'
+ js = ['vendor/jquery/jquery%s.js' % extra,
+ 'jquery.init.js',
+ 'collapse%s.js' % extra]
+ return forms.Media(js=[static('admin/js/%s' % url) for url in js])
+ return forms.Media()
+ media = property(_media)
+
+ def __iter__(self):
+ for field in self.fields:
+ yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin)
+
+
+class Fieldline(object):
+ def __init__(self, form, field, readonly_fields=None, model_admin=None):
+ self.form = form # A django.forms.Form instance
+ if not hasattr(field, "__iter__") or isinstance(field, six.text_type):
+ self.fields = [field]
+ else:
+ self.fields = field
+ self.has_visible_field = not all(field in self.form.fields and
+ self.form.fields[field].widget.is_hidden
+ for field in self.fields)
+ self.model_admin = model_admin
+ if readonly_fields is None:
+ readonly_fields = ()
+ self.readonly_fields = readonly_fields
+
+ def __iter__(self):
+ for i, field in enumerate(self.fields):
+ if field in self.readonly_fields:
+ yield AdminReadonlyField(self.form, field, is_first=(i == 0),
+ model_admin=self.model_admin)
+ else:
+ yield AdminField(self.form, field, is_first=(i == 0))
+
+ def errors(self):
+ return mark_safe(
+ '\n'.join(self.form[f].errors.as_ul()
+ for f in self.fields if f not in self.readonly_fields).strip('\n')
+ )
+
+
+class AdminField(object):
+ def __init__(self, form, field, is_first):
+ self.field = form[field] # A django.forms.BoundField instance
+ self.is_first = is_first # Whether this field is first on the line
+ self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput)
+ self.is_readonly = False
+
+ def label_tag(self):
+ classes = []
+ contents = conditional_escape(force_text(self.field.label))
+ if self.is_checkbox:
+ classes.append('vCheckboxLabel')
+
+ if self.field.field.required:
+ classes.append('required')
+ if not self.is_first:
+ classes.append('inline')
+ attrs = {'class': ' '.join(classes)} if classes else {}
+ # checkboxes should not have a label suffix as the checkbox appears
+ # to the left of the label.
+ return self.field.label_tag(contents=mark_safe(contents), attrs=attrs,
+ label_suffix='' if self.is_checkbox else None)
+
+ def errors(self):
+ return mark_safe(self.field.errors.as_ul())
+
+
+class AdminReadonlyField(object):
+ def __init__(self, form, field, is_first, model_admin=None):
+ # Make self.field look a little bit like a field. This means that
+ # {{ field.name }} must be a useful class name to identify the field.
+ # For convenience, store other field-related data here too.
+ if callable(field):
+ class_name = field.__name__ if field.__name__ != '<lambda>' else ''
+ else:
+ class_name = field
+
+ if form._meta.labels and class_name in form._meta.labels:
+ label = form._meta.labels[class_name]
+ else:
+ label = label_for_field(field, form._meta.model, model_admin)
+
+ if form._meta.help_texts and class_name in form._meta.help_texts:
+ help_text = form._meta.help_texts[class_name]
+ else:
+ help_text = help_text_for_field(class_name, form._meta.model)
+
+ self.field = {
+ 'name': class_name,
+ 'label': label,
+ 'help_text': help_text,
+ 'field': field,
+ }
+ self.form = form
+ self.model_admin = model_admin
+ self.is_first = is_first
+ self.is_checkbox = False
+ self.is_readonly = True
+ self.empty_value_display = model_admin.get_empty_value_display()
+
+ def label_tag(self):
+ attrs = {}
+ if not self.is_first:
+ attrs["class"] = "inline"
+ label = self.field['label']
+ return format_html('<label{}>{}:</label>',
+ flatatt(attrs),
+ capfirst(force_text(label)))
+
+ def contents(self):
+ from django.contrib.admin.templatetags.admin_list import _boolean_icon
+ field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin
+ try:
+ f, attr, value = lookup_field(field, obj, model_admin)
+ except (AttributeError, ValueError, ObjectDoesNotExist):
+ result_repr = self.empty_value_display
+ else:
+ if f is None:
+ boolean = getattr(attr, "boolean", False)
+ if boolean:
+ result_repr = _boolean_icon(value)
+ else:
+ if hasattr(value, "__html__"):
+ result_repr = value
+ else:
+ result_repr = smart_text(value)
+ if getattr(attr, "allow_tags", False):
+ warnings.warn(
+ "Deprecated allow_tags attribute used on %s. "
+ "Use django.utils.safestring.format_html(), "
+ "format_html_join(), or mark_safe() instead." % attr,
+ RemovedInDjango20Warning
+ )
+ result_repr = mark_safe(value)
+ else:
+ result_repr = linebreaksbr(result_repr)
+ else:
+ if isinstance(f.remote_field, ManyToManyRel) and value is not None:
+ result_repr = ", ".join(map(six.text_type, value.all()))
+ else:
+ result_repr = display_for_field(value, f, self.empty_value_display)
+ return conditional_escape(result_repr)
+
+
+class InlineAdminFormSet(object):
+ """
+ A wrapper around an inline formset for use in the admin system.
+ """
+ def __init__(self, inline, formset, fieldsets, prepopulated_fields=None,
+ readonly_fields=None, model_admin=None):
+ self.opts = inline
+ self.formset = formset
+ self.fieldsets = fieldsets
+ self.model_admin = model_admin
+ if readonly_fields is None:
+ readonly_fields = ()
+ self.readonly_fields = readonly_fields
+ if prepopulated_fields is None:
+ prepopulated_fields = {}
+ self.prepopulated_fields = prepopulated_fields
+
+ def __iter__(self):
+ for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()):
+ view_on_site_url = self.opts.get_view_on_site_url(original)
+ yield InlineAdminForm(self.formset, form, self.fieldsets,
+ self.prepopulated_fields, original, self.readonly_fields,
+ model_admin=self.opts, view_on_site_url=view_on_site_url)
+ for form in self.formset.extra_forms:
+ yield InlineAdminForm(self.formset, form, self.fieldsets,
+ self.prepopulated_fields, None, self.readonly_fields,
+ model_admin=self.opts)
+ yield InlineAdminForm(self.formset, self.formset.empty_form,
+ self.fieldsets, self.prepopulated_fields, None,
+ self.readonly_fields, model_admin=self.opts)
+
+ def fields(self):
+ fk = getattr(self.formset, "fk", None)
+ for i, field_name in enumerate(flatten_fieldsets(self.fieldsets)):
+ if fk and fk.name == field_name:
+ continue
+ if field_name in self.readonly_fields:
+ yield {
+ 'label': label_for_field(field_name, self.opts.model, self.opts),
+ 'widget': {
+ 'is_hidden': False
+ },
+ 'required': False,
+ 'help_text': help_text_for_field(field_name, self.opts.model),
+ }
+ else:
+ yield self.formset.form.base_fields[field_name]
+
+ def _media(self):
+ media = self.opts.media + self.formset.media
+ for fs in self:
+ media = media + fs.media
+ return media
+ media = property(_media)
+
+
+class InlineAdminForm(AdminForm):
+ """
+ A wrapper around an inline form for use in the admin system.
+ """
+ def __init__(self, formset, form, fieldsets, prepopulated_fields, original,
+ readonly_fields=None, model_admin=None, view_on_site_url=None):
+ self.formset = formset
+ self.model_admin = model_admin
+ self.original = original
+ self.show_url = original and view_on_site_url is not None
+ self.absolute_url = view_on_site_url
+ super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields,
+ readonly_fields, model_admin)
+
+ @cached_property
+ def original_content_type_id(self):
+ warnings.warn(
+ 'InlineAdminForm.original_content_type_id is deprecated and will be '
+ 'removed in Django 1.10. If you were using this attribute to construct '
+ 'the "view on site" URL, use the `absolute_url` attribute instead.',
+ RemovedInDjango110Warning, stacklevel=2
+ )
+ if self.original is not None:
+ # Since this module gets imported in the application's root package,
+ # it cannot import models from other applications at the module level.
+ from django.contrib.contenttypes.models import ContentType
+ return ContentType.objects.get_for_model(self.original).pk
+ raise AttributeError
+
+ def __iter__(self):
+ for name, options in self.fieldsets:
+ yield InlineFieldset(self.formset, self.form, name,
+ self.readonly_fields, model_admin=self.model_admin, **options)
+
+ def needs_explicit_pk_field(self):
+ # Auto fields are editable (oddly), so need to check for auto or non-editable pk
+ if self.form._meta.model._meta.has_auto_field or not self.form._meta.model._meta.pk.editable:
+ return True
+ # Also search any parents for an auto field. (The pk info is propagated to child
+ # models so that does not need to be checked in parents.)
+ for parent in self.form._meta.model._meta.get_parent_list():
+ if parent._meta.has_auto_field:
+ return True
+ return False
+
+ def pk_field(self):
+ return AdminField(self.form, self.formset._pk_field.name, False)
+
+ def fk_field(self):
+ fk = getattr(self.formset, "fk", None)
+ if fk:
+ return AdminField(self.form, fk.name, False)
+ else:
+ return ""
+
+ def deletion_field(self):
+ from django.forms.formsets import DELETION_FIELD_NAME
+ return AdminField(self.form, DELETION_FIELD_NAME, False)
+
+ def ordering_field(self):
+ from django.forms.formsets import ORDERING_FIELD_NAME
+ return AdminField(self.form, ORDERING_FIELD_NAME, False)
+
+
+class InlineFieldset(Fieldset):
+ def __init__(self, formset, *args, **kwargs):
+ self.formset = formset
+ super(InlineFieldset, self).__init__(*args, **kwargs)
+
+ def __iter__(self):
+ fk = getattr(self.formset, "fk", None)
+ for field in self.fields:
+ if fk and fk.name == field:
+ continue
+ yield Fieldline(self.form, field, self.readonly_fields,
+ model_admin=self.model_admin)
+
+
+class AdminErrorList(forms.utils.ErrorList):
+ """
+ Stores all errors for the form/formsets in an add/change stage view.
+ """
+ def __init__(self, form, inline_formsets):
+ super(AdminErrorList, self).__init__()
+
+ if form.is_bound:
+ self.extend(form.errors.values())
+ for inline_formset in inline_formsets:
+ self.extend(inline_formset.non_form_errors())
+ for errors_in_inline_form in inline_formset.errors:
+ self.extend(errors_in_inline_form.values())
diff --git a/tbc/static/admin/img/LICENSE b/tbc/static/admin/img/LICENSE
new file mode 100644
index 0000000..a4faaa1
--- /dev/null
+++ b/tbc/static/admin/img/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Code Charm Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tbc/static/admin/img/README.txt b/tbc/static/admin/img/README.txt
new file mode 100644
index 0000000..43373ad
--- /dev/null
+++ b/tbc/static/admin/img/README.txt
@@ -0,0 +1,7 @@
+All icons are taken from Font Awesome (http://fontawesome.io/) project.
+The Font Awesome font is licensed under the SIL OFL 1.1:
+- http://scripts.sil.org/OFL
+
+SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
+Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
+in current folder).
diff --git a/tbc/static/admin/img/calendar-icons.svg b/tbc/static/admin/img/calendar-icons.svg
new file mode 100644
index 0000000..dbf21c3
--- /dev/null
+++ b/tbc/static/admin/img/calendar-icons.svg
@@ -0,0 +1,14 @@
+<svg width="15" height="60" viewBox="0 0 1792 7168" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="previous">
+ <path d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="next">
+ <path d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#previous" x="0" y="0" fill="#333333" />
+ <use xlink:href="#previous" x="0" y="1792" fill="#000000" />
+ <use xlink:href="#next" x="0" y="3584" fill="#333333" />
+ <use xlink:href="#next" x="0" y="5376" fill="#000000" />
+</svg>
diff --git a/tbc/static/admin/img/gis/move_vertex_off.svg b/tbc/static/admin/img/gis/move_vertex_off.svg
new file mode 100644
index 0000000..228854f
--- /dev/null
+++ b/tbc/static/admin/img/gis/move_vertex_off.svg
@@ -0,0 +1 @@
+<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file
diff --git a/tbc/static/admin/img/gis/move_vertex_on.svg b/tbc/static/admin/img/gis/move_vertex_on.svg
new file mode 100644
index 0000000..96b87fd
--- /dev/null
+++ b/tbc/static/admin/img/gis/move_vertex_on.svg
@@ -0,0 +1 @@
+<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file
diff --git a/tbc/static/admin/img/icon-addlink.svg b/tbc/static/admin/img/icon-addlink.svg
new file mode 100644
index 0000000..e004fb1
--- /dev/null
+++ b/tbc/static/admin/img/icon-addlink.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#70bf2b" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-alert.svg b/tbc/static/admin/img/icon-alert.svg
new file mode 100644
index 0000000..e51ea83
--- /dev/null
+++ b/tbc/static/admin/img/icon-alert.svg
@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#efb80b" d="M1024 1375v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-calendar.svg b/tbc/static/admin/img/icon-calendar.svg
new file mode 100644
index 0000000..97910a9
--- /dev/null
+++ b/tbc/static/admin/img/icon-calendar.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="icon">
+ <path d="M192 1664h288v-288h-288v288zm352 0h320v-288h-320v288zm-352-352h288v-320h-288v320zm352 0h320v-320h-320v320zm-352-384h288v-288h-288v288zm736 736h320v-288h-320v288zm-384-736h320v-288h-320v288zm768 736h288v-288h-288v288zm-384-352h320v-320h-320v320zm-352-864v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm736 864h288v-320h-288v320zm-384-384h320v-288h-320v288zm384 0h288v-288h-288v288zm32-480v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z"/>
+ </g>
+ </defs>
+ <use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
+ <use xlink:href="#icon" x="0" y="1792" fill="#003366" />
+</svg>
diff --git a/tbc/static/admin/img/icon-changelink.svg b/tbc/static/admin/img/icon-changelink.svg
new file mode 100644
index 0000000..bbb137a
--- /dev/null
+++ b/tbc/static/admin/img/icon-changelink.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#efb80b" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-clock.svg b/tbc/static/admin/img/icon-clock.svg
new file mode 100644
index 0000000..bf9985d
--- /dev/null
+++ b/tbc/static/admin/img/icon-clock.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="icon">
+ <path d="M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
+ <use xlink:href="#icon" x="0" y="1792" fill="#003366" />
+</svg>
diff --git a/tbc/static/admin/img/icon-deletelink.svg b/tbc/static/admin/img/icon-deletelink.svg
new file mode 100644
index 0000000..4059b15
--- /dev/null
+++ b/tbc/static/admin/img/icon-deletelink.svg
@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#dd4646" d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-no.svg b/tbc/static/admin/img/icon-no.svg
new file mode 100644
index 0000000..2e0d383
--- /dev/null
+++ b/tbc/static/admin/img/icon-no.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-unknown-alt.svg b/tbc/static/admin/img/icon-unknown-alt.svg
new file mode 100644
index 0000000..1c6b99f
--- /dev/null
+++ b/tbc/static/admin/img/icon-unknown-alt.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-unknown.svg b/tbc/static/admin/img/icon-unknown.svg
new file mode 100644
index 0000000..50b4f97
--- /dev/null
+++ b/tbc/static/admin/img/icon-unknown.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#666666" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/img/icon-yes.svg b/tbc/static/admin/img/icon-yes.svg
new file mode 100644
index 0000000..5883d87
--- /dev/null
+++ b/tbc/static/admin/img/icon-yes.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/img/inline-delete.svg b/tbc/static/admin/img/inline-delete.svg
new file mode 100644
index 0000000..17d1ad6
--- /dev/null
+++ b/tbc/static/admin/img/inline-delete.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/img/search.svg b/tbc/static/admin/img/search.svg
new file mode 100644
index 0000000..c8c69b2
--- /dev/null
+++ b/tbc/static/admin/img/search.svg
@@ -0,0 +1,3 @@
+<svg width="15" height="15" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#555555" d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/>
+</svg>
diff --git a/tbc/static/admin/img/selector-icons.svg b/tbc/static/admin/img/selector-icons.svg
new file mode 100644
index 0000000..926b8e2
--- /dev/null
+++ b/tbc/static/admin/img/selector-icons.svg
@@ -0,0 +1,34 @@
+<svg width="16" height="192" viewBox="0 0 1792 21504" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="up">
+ <path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="down">
+ <path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="left">
+ <path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="right">
+ <path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="clearall">
+ <path transform="translate(336, 336) scale(0.75)" d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="chooseall">
+ <path transform="translate(336, 336) scale(0.75)" d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#up" x="0" y="0" fill="#666666" />
+ <use xlink:href="#up" x="0" y="1792" fill="#447e9b" />
+ <use xlink:href="#down" x="0" y="3584" fill="#666666" />
+ <use xlink:href="#down" x="0" y="5376" fill="#447e9b" />
+ <use xlink:href="#left" x="0" y="7168" fill="#666666" />
+ <use xlink:href="#left" x="0" y="8960" fill="#447e9b" />
+ <use xlink:href="#right" x="0" y="10752" fill="#666666" />
+ <use xlink:href="#right" x="0" y="12544" fill="#447e9b" />
+ <use xlink:href="#clearall" x="0" y="14336" fill="#666666" />
+ <use xlink:href="#clearall" x="0" y="16128" fill="#447e9b" />
+ <use xlink:href="#chooseall" x="0" y="17920" fill="#666666" />
+ <use xlink:href="#chooseall" x="0" y="19712" fill="#447e9b" />
+</svg>
diff --git a/tbc/static/admin/img/sorting-icons.svg b/tbc/static/admin/img/sorting-icons.svg
new file mode 100644
index 0000000..7c31ec9
--- /dev/null
+++ b/tbc/static/admin/img/sorting-icons.svg
@@ -0,0 +1,19 @@
+<svg width="14" height="84" viewBox="0 0 1792 10752" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="sort">
+ <path d="M1408 1088q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45zm0-384q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
+ </g>
+ <g id="ascending">
+ <path d="M1408 1216q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
+ </g>
+ <g id="descending">
+ <path d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/>
+ </g>
+ </defs>
+ <use xlink:href="#sort" x="0" y="0" fill="#999999" />
+ <use xlink:href="#sort" x="0" y="1792" fill="#447e9b" />
+ <use xlink:href="#ascending" x="0" y="3584" fill="#999999" />
+ <use xlink:href="#ascending" x="0" y="5376" fill="#447e9b" />
+ <use xlink:href="#descending" x="0" y="7168" fill="#999999" />
+ <use xlink:href="#descending" x="0" y="8960" fill="#447e9b" />
+</svg>
diff --git a/tbc/static/admin/img/tooltag-add.svg b/tbc/static/admin/img/tooltag-add.svg
new file mode 100644
index 0000000..1ca64ae
--- /dev/null
+++ b/tbc/static/admin/img/tooltag-add.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
+</svg>
diff --git a/tbc/static/admin/img/tooltag-arrowright.svg b/tbc/static/admin/img/tooltag-arrowright.svg
new file mode 100644
index 0000000..b664d61
--- /dev/null
+++ b/tbc/static/admin/img/tooltag-arrowright.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45l166-166q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/>
+</svg>
diff --git a/tbc/static/admin/js/SelectBox.js b/tbc/static/admin/js/SelectBox.js
new file mode 100644
index 0000000..95825d8
--- /dev/null
+++ b/tbc/static/admin/js/SelectBox.js
@@ -0,0 +1,135 @@
+(function() {
+ 'use strict';
+ var SelectBox = {
+ cache: {},
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = [];
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = box.options.length; i < j; i++) {
+ node = box.options[i];
+ cache.push({value: node.value, text: node.text, displayed: 1});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+ var node;
+ box.options.length = 0; // clear all options
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.displayed) {
+ var new_option = new Option(node.text, node.value, false, false);
+ // Shows a tooltip when hovering over the option
+ new_option.setAttribute("title", node.text);
+ box.options[box.options.length] = new_option;
+ }
+ }
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ node.displayed = 1;
+ var numTokens = tokens.length;
+ for (var k = 0; k < numTokens; k++) {
+ token = tokens[k];
+ if (node.text.toLowerCase().indexOf(token) === -1) {
+ node.displayed = 0;
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ delete_index = i;
+ break;
+ }
+ }
+ var k = cache.length - 1;
+ for (i = delete_index; i < k; i++) {
+ cache[i] = cache[i + 1];
+ }
+ cache.length--;
+ },
+ add_to_cache: function(id, option) {
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ for (var i = 0, j = boxOptions.length; i < j; i++) {
+ option = boxOptions[i];
+ if (option.selected && SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ for (var i = 0, j = boxOptions.length; i < j; i++) {
+ option = boxOptions[i];
+ if (SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort(function(a, b) {
+ a = a.text.toLowerCase();
+ b = b.text.toLowerCase();
+ try {
+ if (a > b) {
+ return 1;
+ }
+ if (a < b) {
+ return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ for (var i = 0; i < box.options.length; i++) {
+ box.options[i].selected = 'selected';
+ }
+ }
+ };
+ window.SelectBox = SelectBox;
+})();
diff --git a/tbc/static/admin/js/SelectFilter2.js b/tbc/static/admin/js/SelectFilter2.js
new file mode 100644
index 0000000..acf3996
--- /dev/null
+++ b/tbc/static/admin/js/SelectFilter2.js
@@ -0,0 +1,198 @@
+/*global SelectBox, addEvent, gettext, interpolate, quickElement, SelectFilter*/
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Requires core.js, SelectBox.js and addevent.js.
+*/
+(function($) {
+ 'use strict';
+ function findForm(node) {
+ // returns the node of the form containing the given node
+ if (node.tagName.toLowerCase() !== 'form') {
+ return findForm(node.parentNode);
+ }
+ return node;
+ }
+
+ window.SelectFilter = {
+ init: function(field_id, field_name, is_stacked) {
+ if (field_id.match(/__prefix__/)) {
+ // Don't initialize on empty forms.
+ return;
+ }
+ var from_box = document.getElementById(field_id);
+ from_box.id += '_from'; // change its ID
+ from_box.className = 'filtered';
+
+ var ps = from_box.parentNode.getElementsByTagName('p');
+ for (var i = 0; i < ps.length; i++) {
+ if (ps[i].className.indexOf("info") !== -1) {
+ // Remove <p class="info">, because it just gets in the way.
+ from_box.parentNode.removeChild(ps[i]);
+ } else if (ps[i].className.indexOf("help") !== -1) {
+ // Move help text up to the top so it isn't below the select
+ // boxes or wrapped off on the side to the right of the add
+ // button:
+ from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
+ }
+ }
+
+ // <div class="selector"> or <div class="selector stacked">
+ var selector_div = quickElement('div', from_box.parentNode);
+ selector_div.className = is_stacked ? 'selector stacked' : 'selector';
+
+ // <div class="selector-available">
+ var selector_available = quickElement('div', selector_div);
+ selector_available.className = 'selector-available';
+ var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
+ quickElement(
+ 'span', title_available, '',
+ 'class', 'help help-tooltip help-icon',
+ 'title', interpolate(
+ gettext(
+ 'This is the list of available %s. You may choose some by ' +
+ 'selecting them in the box below and then clicking the ' +
+ '"Choose" arrow between the two boxes.'
+ ),
+ [field_name]
+ )
+ );
+
+ var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
+ filter_p.className = 'selector-filter';
+
+ var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input');
+
+ quickElement(
+ 'span', search_filter_label, '',
+ 'class', 'help-tooltip search-label-icon',
+ 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])
+ );
+
+ filter_p.appendChild(document.createTextNode(' '));
+
+ var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
+ filter_input.id = field_id + '_input';
+
+ selector_available.appendChild(from_box);
+ var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript:void(0);', 'id', field_id + '_add_all_link');
+ choose_all.className = 'selector-chooseall';
+
+ // <ul class="selector-chooser">
+ var selector_chooser = quickElement('ul', selector_div);
+ selector_chooser.className = 'selector-chooser';
+ var add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript:void(0);', 'id', field_id + '_add_link');
+ add_link.className = 'selector-add';
+ var remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript:void(0);', 'id', field_id + '_remove_link');
+ remove_link.className = 'selector-remove';
+
+ // <div class="selector-chosen">
+ var selector_chosen = quickElement('div', selector_div);
+ selector_chosen.className = 'selector-chosen';
+ var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
+ quickElement(
+ 'span', title_chosen, '',
+ 'class', 'help help-tooltip help-icon',
+ 'title', interpolate(
+ gettext(
+ 'This is the list of chosen %s. You may remove some by ' +
+ 'selecting them in the box below and then clicking the ' +
+ '"Remove" arrow between the two boxes.'
+ ),
+ [field_name]
+ )
+ );
+
+ var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
+ to_box.className = 'filtered';
+ var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript:void(0);', 'id', field_id + '_remove_all_link');
+ clear_all.className = 'selector-clearall';
+
+ from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+
+ // Set up the JavaScript event handlers for the select box filter interface
+ addEvent(choose_all, 'click', function() { SelectBox.move_all(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(add_link, 'click', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(remove_link, 'click', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(clear_all, 'click', function() { SelectBox.move_all(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(filter_input, 'keypress', function(e) { SelectFilter.filter_key_press(e, field_id); });
+ addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
+ addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
+ addEvent(from_box, 'change', function(e) { SelectFilter.refresh_icons(field_id); });
+ addEvent(to_box, 'change', function(e) { SelectFilter.refresh_icons(field_id); });
+ addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
+ SelectBox.init(field_id + '_from');
+ SelectBox.init(field_id + '_to');
+ // Move selected from_box options to to_box
+ SelectBox.move(field_id + '_from', field_id + '_to');
+
+ if (!is_stacked) {
+ // In horizontal mode, give the same height to the two boxes.
+ var j_from_box = $(from_box);
+ var j_to_box = $(to_box);
+ var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); };
+ if (j_from_box.outerHeight() > 0) {
+ resize_filters(); // This fieldset is already open. Resize now.
+ } else {
+ // This fieldset is probably collapsed. Wait for its 'show' event.
+ j_to_box.closest('fieldset').one('show.fieldset', resize_filters);
+ }
+ }
+
+ // Initial icon refresh
+ SelectFilter.refresh_icons(field_id);
+ },
+ refresh_icons: function(field_id) {
+ var from = $('#' + field_id + '_from');
+ var to = $('#' + field_id + '_to');
+ var is_from_selected = from.find('option:selected').length > 0;
+ var is_to_selected = to.find('option:selected').length > 0;
+ // Active if at least one item is selected
+ $('#' + field_id + '_add_link').toggleClass('active', is_from_selected);
+ $('#' + field_id + '_remove_link').toggleClass('active', is_to_selected);
+ // Active if the corresponding box isn't empty
+ $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0);
+ $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0);
+ },
+ filter_key_press: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // don't submit form if user pressed Enter
+ if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
+ from.selectedIndex = 0;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = 0;
+ event.preventDefault();
+ return false;
+ }
+ },
+ filter_key_up: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ var temp = from.selectedIndex;
+ SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+ from.selectedIndex = temp;
+ return true;
+ },
+ filter_key_down: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // right arrow -- move across
+ if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) {
+ var old_index = from.selectedIndex;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index;
+ return false;
+ }
+ // down arrow -- wrap around
+ if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
+ from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+ }
+ // up arrow -- wrap around
+ if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
+ from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
+ }
+ return true;
+ }
+ };
+
+})(django.jQuery);
diff --git a/tbc/static/admin/js/actions.js b/tbc/static/admin/js/actions.js
new file mode 100644
index 0000000..95e8492
--- /dev/null
+++ b/tbc/static/admin/js/actions.js
@@ -0,0 +1,146 @@
+/*global _actions_icnt, gettext, interpolate, ngettext*/
+(function($) {
+ 'use strict';
+ var lastChecked;
+
+ $.fn.actions = function(opts) {
+ var options = $.extend({}, $.fn.actions.defaults, opts);
+ var actionCheckboxes = $(this);
+ var list_editable_changed = false;
+ var showQuestion = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).show();
+ $(options.allContainer).hide();
+ },
+ showClear = function() {
+ $(options.acrossClears).show();
+ $(options.acrossQuestions).hide();
+ $(options.actionContainer).toggleClass(options.selectedClass);
+ $(options.allContainer).show();
+ $(options.counterContainer).hide();
+ },
+ reset = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).hide();
+ $(options.allContainer).hide();
+ $(options.counterContainer).show();
+ },
+ clearAcross = function() {
+ reset();
+ $(options.acrossInput).val(0);
+ $(options.actionContainer).removeClass(options.selectedClass);
+ },
+ checker = function(checked) {
+ if (checked) {
+ showQuestion();
+ } else {
+ reset();
+ }
+ $(actionCheckboxes).prop("checked", checked)
+ .parent().parent().toggleClass(options.selectedClass, checked);
+ },
+ updateCounter = function() {
+ var sel = $(actionCheckboxes).filter(":checked").length;
+ // _actions_icnt is defined in the generated HTML
+ // and contains the total amount of objects in the queryset
+ $(options.counterContainer).html(interpolate(
+ ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
+ sel: sel,
+ cnt: _actions_icnt
+ }, true));
+ $(options.allToggle).prop("checked", function() {
+ var value;
+ if (sel === actionCheckboxes.length) {
+ value = true;
+ showQuestion();
+ } else {
+ value = false;
+ clearAcross();
+ }
+ return value;
+ });
+ };
+ // Show counter by default
+ $(options.counterContainer).show();
+ // Check state of checkboxes and reinit state if needed
+ $(this).filter(":checked").each(function(i) {
+ $(this).parent().parent().toggleClass(options.selectedClass);
+ updateCounter();
+ if ($(options.acrossInput).val() === 1) {
+ showClear();
+ }
+ });
+ $(options.allToggle).show().click(function() {
+ checker($(this).prop("checked"));
+ updateCounter();
+ });
+ $("a", options.acrossQuestions).click(function(event) {
+ event.preventDefault();
+ $(options.acrossInput).val(1);
+ showClear();
+ });
+ $("a", options.acrossClears).click(function(event) {
+ event.preventDefault();
+ $(options.allToggle).prop("checked", false);
+ clearAcross();
+ checker(0);
+ updateCounter();
+ });
+ lastChecked = null;
+ $(actionCheckboxes).click(function(event) {
+ if (!event) { event = window.event; }
+ var target = event.target ? event.target : event.srcElement;
+ if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) {
+ var inrange = false;
+ $(lastChecked).prop("checked", target.checked)
+ .parent().parent().toggleClass(options.selectedClass, target.checked);
+ $(actionCheckboxes).each(function() {
+ if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) {
+ inrange = (inrange) ? false : true;
+ }
+ if (inrange) {
+ $(this).prop("checked", target.checked)
+ .parent().parent().toggleClass(options.selectedClass, target.checked);
+ }
+ });
+ }
+ $(target).parent().parent().toggleClass(options.selectedClass, target.checked);
+ lastChecked = target;
+ updateCounter();
+ });
+ $('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() {
+ list_editable_changed = true;
+ });
+ $('form#changelist-form button[name="index"]').click(function(event) {
+ if (list_editable_changed) {
+ return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
+ }
+ });
+ $('form#changelist-form input[name="_save"]').click(function(event) {
+ var action_changed = false;
+ $('select option:selected', options.actionContainer).each(function() {
+ if ($(this).val()) {
+ action_changed = true;
+ }
+ });
+ if (action_changed) {
+ if (list_editable_changed) {
+ return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action."));
+ } else {
+ return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."));
+ }
+ }
+ });
+ };
+ /* Setup plugin defaults */
+ $.fn.actions.defaults = {
+ actionContainer: "div.actions",
+ counterContainer: "span.action-counter",
+ allContainer: "div.actions span.all",
+ acrossInput: "div.actions input.select-across",
+ acrossQuestions: "div.actions span.question",
+ acrossClears: "div.actions span.clear",
+ allToggle: "#action-toggle",
+ selectedClass: "selected"
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/js/actions.min.js b/tbc/static/admin/js/actions.min.js
new file mode 100644
index 0000000..d0e87bc
--- /dev/null
+++ b/tbc/static/admin/js/actions.min.js
@@ -0,0 +1,6 @@
+(function(a){var f;a.fn.actions=function(q){var b=a.extend({},a.fn.actions.defaults,q),g=a(this),e=!1,k=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},l=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},m=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},n=function(){m();
+a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},p=function(c){c?k():m();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,k()):(a=!1,n());return a})};a(b.counterContainer).show();a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);
+h();1===a(b.acrossInput).val()&&l()});a(b.allToggle).show().click(function(){p(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);l()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);n();p(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&&a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,
+d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){e=!0});a('form#changelist-form button[name="index"]').click(function(a){if(e)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});
+a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return e?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};
+a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery);
diff --git a/tbc/static/admin/js/admin/DateTimeShortcuts.js b/tbc/static/admin/js/admin/DateTimeShortcuts.js
new file mode 100644
index 0000000..d0acc23
--- /dev/null
+++ b/tbc/static/admin/js/admin/DateTimeShortcuts.js
@@ -0,0 +1,364 @@
+/*global addEvent, Calendar, cancelEventPropagation, findPosX, findPosY, getStyle, get_format, gettext, interpolate, ngettext, quickElement, removeEvent*/
+// Inserts shortcut buttons after all of the following:
+// <input type="text" class="vDateField">
+// <input type="text" class="vTimeField">
+(function() {
+ 'use strict';
+ var DateTimeShortcuts = {
+ calendars: [],
+ calendarInputs: [],
+ clockInputs: [],
+ dismissClockFunc: [],
+ dismissCalendarFunc: [],
+ calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
+ calendarDivName2: 'calendarin', // name of <div> that contains calendar
+ calendarLinkName: 'calendarlink',// name of the link that is used to toggle
+ clockDivName: 'clockbox', // name of clock <div> that gets toggled
+ clockLinkName: 'clocklink', // name of the link that is used to toggle
+ shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
+ timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
+ timezoneOffset: 0,
+ init: function() {
+ var body = document.getElementsByTagName('body')[0];
+ var serverOffset = body.getAttribute('data-admin-utc-offset');
+ if (serverOffset !== undefined) {
+ var localOffset = new Date().getTimezoneOffset() * -60;
+ DateTimeShortcuts.timezoneOffset = localOffset - serverOffset;
+ }
+
+ var inputs = document.getElementsByTagName('input');
+ for (var i = 0; i < inputs.length; i++) {
+ var inp = inputs[i];
+ if (inp.getAttribute('type') === 'text' && inp.className.match(/vTimeField/)) {
+ DateTimeShortcuts.addClock(inp);
+ DateTimeShortcuts.addTimezoneWarning(inp);
+ }
+ else if (inp.getAttribute('type') === 'text' && inp.className.match(/vDateField/)) {
+ DateTimeShortcuts.addCalendar(inp);
+ DateTimeShortcuts.addTimezoneWarning(inp);
+ }
+ }
+ },
+ // Return the current time while accounting for the server timezone.
+ now: function() {
+ var body = document.getElementsByTagName('body')[0];
+ var serverOffset = body.getAttribute('data-admin-utc-offset');
+ if (serverOffset !== undefined) {
+ var localNow = new Date();
+ var localOffset = localNow.getTimezoneOffset() * -60;
+ localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset));
+ return localNow;
+ } else {
+ return new Date();
+ }
+ },
+ // Add a warning when the time zone in the browser and backend do not match.
+ addTimezoneWarning: function(inp) {
+ var $ = django.jQuery;
+ var warningClass = DateTimeShortcuts.timezoneWarningClass;
+ var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;
+
+ // Only warn if there is a time zone mismatch.
+ if (!timezoneOffset) {
+ return;
+ }
+
+ // Check if warning is already there.
+ if ($(inp).siblings('.' + warningClass).length) {
+ return;
+ }
+
+ var message;
+ if (timezoneOffset > 0) {
+ message = ngettext(
+ 'Note: You are %s hour ahead of server time.',
+ 'Note: You are %s hours ahead of server time.',
+ timezoneOffset
+ );
+ }
+ else {
+ timezoneOffset *= -1;
+ message = ngettext(
+ 'Note: You are %s hour behind server time.',
+ 'Note: You are %s hours behind server time.',
+ timezoneOffset
+ );
+ }
+ message = interpolate(message, [timezoneOffset]);
+
+ var $warning = $('<span>');
+ $warning.attr('class', warningClass);
+ $warning.text(message);
+
+ $(inp).parent()
+ .append($('<br>'))
+ .append($warning);
+ },
+ // Add clock widget to a given field
+ addClock: function(inp) {
+ var num = DateTimeShortcuts.clockInputs.length;
+ DateTimeShortcuts.clockInputs[num] = inp;
+ DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };
+
+ // Shortcut links (clock icon and "Now" link)
+ var shortcuts_span = document.createElement('span');
+ shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
+ inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+ var now_link = document.createElement('a');
+ now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
+ now_link.appendChild(document.createTextNode(gettext('Now')));
+ var clock_link = document.createElement('a');
+ clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
+ clock_link.id = DateTimeShortcuts.clockLinkName + num;
+ quickElement(
+ 'span', clock_link, '',
+ 'class', 'clock-icon',
+ 'title', gettext('Choose a Time')
+ );
+ shortcuts_span.appendChild(document.createTextNode('\u00A0'));
+ shortcuts_span.appendChild(now_link);
+ shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ shortcuts_span.appendChild(clock_link);
+
+ // Create clock link div
+ //
+ // Markup looks like:
+ // <div id="clockbox1" class="clockbox module">
+ // <h2>Choose a time</h2>
+ // <ul class="timelist">
+ // <li><a href="#">Now</a></li>
+ // <li><a href="#">Midnight</a></li>
+ // <li><a href="#">6 a.m.</a></li>
+ // <li><a href="#">Noon</a></li>
+ // <li><a href="#">6 p.m.</a></li>
+ // </ul>
+ // <p class="calendar-cancel"><a href="#">Cancel</a></p>
+ // </div>
+
+ var clock_box = document.createElement('div');
+ clock_box.style.display = 'none';
+ clock_box.style.position = 'absolute';
+ clock_box.className = 'clockbox module';
+ clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
+ document.body.appendChild(clock_box);
+ addEvent(clock_box, 'click', cancelEventPropagation);
+
+ quickElement('h2', clock_box, gettext('Choose a time'));
+ var time_list = quickElement('ul', clock_box);
+ time_list.className = 'timelist';
+ quickElement("a", quickElement("li", time_list), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
+ quickElement("a", quickElement("li", time_list), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 0);");
+ quickElement("a", quickElement("li", time_list), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 6);");
+ quickElement("a", quickElement("li", time_list), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 12);");
+ quickElement("a", quickElement("li", time_list), gettext("6 p.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 18);");
+
+ var cancel_p = quickElement('p', clock_box);
+ cancel_p.className = 'calendar-cancel';
+ quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
+ django.jQuery(document).bind('keyup', function(event) {
+ if (event.which === 27) {
+ // ESC key closes popup
+ DateTimeShortcuts.dismissClock(num);
+ event.preventDefault();
+ }
+ });
+ },
+ openClock: function(num) {
+ var clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num);
+ var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num);
+
+ // Recalculate the clockbox position
+ // is it left-to-right or right-to-left layout ?
+ if (getStyle(document.body, 'direction') !== 'rtl') {
+ clock_box.style.left = findPosX(clock_link) + 17 + 'px';
+ }
+ else {
+ // since style's width is in em, it'd be tough to calculate
+ // px value of it. let's use an estimated px for now
+ // TODO: IE returns wrong value for findPosX when in rtl mode
+ // (it returns as it was left aligned), needs to be fixed.
+ clock_box.style.left = findPosX(clock_link) - 110 + 'px';
+ }
+ clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';
+
+ // Show the clock box
+ clock_box.style.display = 'block';
+ addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
+ },
+ dismissClock: function(num) {
+ document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
+ removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
+ },
+ handleClockQuicklink: function(num, val) {
+ var d;
+ if (val === -1) {
+ d = DateTimeShortcuts.now();
+ }
+ else {
+ d = new Date(1970, 1, 1, val, 0, 0, 0);
+ }
+ DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
+ DateTimeShortcuts.clockInputs[num].focus();
+ DateTimeShortcuts.dismissClock(num);
+ },
+ // Add calendar widget to a given field.
+ addCalendar: function(inp) {
+ var num = DateTimeShortcuts.calendars.length;
+
+ DateTimeShortcuts.calendarInputs[num] = inp;
+ DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };
+
+ // Shortcut links (calendar icon and "Today" link)
+ var shortcuts_span = document.createElement('span');
+ shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
+ inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+ var today_link = document.createElement('a');
+ today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+ today_link.appendChild(document.createTextNode(gettext('Today')));
+ var cal_link = document.createElement('a');
+ cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
+ cal_link.id = DateTimeShortcuts.calendarLinkName + num;
+ quickElement(
+ 'span', cal_link, '',
+ 'class', 'date-icon',
+ 'title', gettext('Choose a Date')
+ );
+ shortcuts_span.appendChild(document.createTextNode('\u00A0'));
+ shortcuts_span.appendChild(today_link);
+ shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ shortcuts_span.appendChild(cal_link);
+
+ // Create calendarbox div.
+ //
+ // Markup looks like:
+ //
+ // <div id="calendarbox3" class="calendarbox module">
+ // <h2>
+ // <a href="#" class="link-previous">&lsaquo;</a>
+ // <a href="#" class="link-next">&rsaquo;</a> February 2003
+ // </h2>
+ // <div class="calendar" id="calendarin3">
+ // <!-- (cal) -->
+ // </div>
+ // <div class="calendar-shortcuts">
+ // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
+ // </div>
+ // <p class="calendar-cancel"><a href="#">Cancel</a></p>
+ // </div>
+ var cal_box = document.createElement('div');
+ cal_box.style.display = 'none';
+ cal_box.style.position = 'absolute';
+ cal_box.className = 'calendarbox module';
+ cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
+ document.body.appendChild(cal_box);
+ addEvent(cal_box, 'click', cancelEventPropagation);
+
+ // next-prev links
+ var cal_nav = quickElement('div', cal_box);
+ var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev(' + num + ');');
+ cal_nav_prev.className = 'calendarnav-previous';
+ var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext(' + num + ');');
+ cal_nav_next.className = 'calendarnav-next';
+
+ // main box
+ var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
+ cal_main.className = 'calendar';
+ DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
+ DateTimeShortcuts.calendars[num].drawCurrent();
+
+ // calendar shortcuts
+ var shortcuts = quickElement('div', cal_box);
+ shortcuts.className = 'calendar-shortcuts';
+ quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
+ shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+ shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
+
+ // cancel bar
+ var cancel_p = quickElement('p', cal_box);
+ cancel_p.className = 'calendar-cancel';
+ quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
+ django.jQuery(document).bind('keyup', function(event) {
+ if (event.which === 27) {
+ // ESC key closes popup
+ DateTimeShortcuts.dismissCalendar(num);
+ event.preventDefault();
+ }
+ });
+ },
+ openCalendar: function(num) {
+ var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num);
+ var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num);
+ var inp = DateTimeShortcuts.calendarInputs[num];
+
+ // Determine if the current value in the input has a valid date.
+ // If so, draw the calendar with that date's year and month.
+ if (inp.value) {
+ var format = get_format('DATE_INPUT_FORMATS')[0];
+ var selected = inp.value.strptime(format);
+ var year = selected.getFullYear();
+ var month = selected.getMonth() + 1;
+ var re = /\d{4}/;
+ if (re.test(year.toString()) && month >= 1 && month <= 12) {
+ DateTimeShortcuts.calendars[num].drawDate(month, year, selected);
+ }
+ }
+
+ // Recalculate the clockbox position
+ // is it left-to-right or right-to-left layout ?
+ if (getStyle(document.body, 'direction') !== 'rtl') {
+ cal_box.style.left = findPosX(cal_link) + 17 + 'px';
+ }
+ else {
+ // since style's width is in em, it'd be tough to calculate
+ // px value of it. let's use an estimated px for now
+ // TODO: IE returns wrong value for findPosX when in rtl mode
+ // (it returns as it was left aligned), needs to be fixed.
+ cal_box.style.left = findPosX(cal_link) - 180 + 'px';
+ }
+ cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';
+
+ cal_box.style.display = 'block';
+ addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
+ },
+ dismissCalendar: function(num) {
+ document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none';
+ removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
+ },
+ drawPrev: function(num) {
+ DateTimeShortcuts.calendars[num].drawPreviousMonth();
+ },
+ drawNext: function(num) {
+ DateTimeShortcuts.calendars[num].drawNextMonth();
+ },
+ handleCalendarCallback: function(num) {
+ var format = get_format('DATE_INPUT_FORMATS')[0];
+ // the format needs to be escaped a little
+ format = format.replace('\\', '\\\\');
+ format = format.replace('\r', '\\r');
+ format = format.replace('\n', '\\n');
+ format = format.replace('\t', '\\t');
+ format = format.replace("'", "\\'");
+ return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",
+ num,
+ "].value = new Date(y, m-1, d).strftime('",
+ format,
+ "');DateTimeShortcuts.calendarInputs[",
+ num,
+ "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
+ num,
+ ").style.display='none';}"].join('');
+ },
+ handleCalendarQuickLink: function(num, offset) {
+ var d = DateTimeShortcuts.now();
+ d.setDate(d.getDate() + offset);
+ DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
+ DateTimeShortcuts.calendarInputs[num].focus();
+ DateTimeShortcuts.dismissCalendar(num);
+ }
+ };
+
+ addEvent(window, 'load', DateTimeShortcuts.init);
+ window.DateTimeShortcuts = DateTimeShortcuts;
+})();
diff --git a/tbc/static/admin/js/admin/RelatedObjectLookups.js b/tbc/static/admin/js/admin/RelatedObjectLookups.js
new file mode 100644
index 0000000..fa782fe
--- /dev/null
+++ b/tbc/static/admin/js/admin/RelatedObjectLookups.js
@@ -0,0 +1,160 @@
+/*global SelectBox, interpolate*/
+// Handles related-objects functionality: lookup link for raw_id_fields
+// and Add Another links.
+
+(function() {
+ 'use strict';
+
+ function html_unescape(text) {
+ // Unescape a string that was escaped using django.utils.html.escape.
+ text = text.replace(/&lt;/g, '<');
+ text = text.replace(/&gt;/g, '>');
+ text = text.replace(/&quot;/g, '"');
+ text = text.replace(/&#39;/g, "'");
+ text = text.replace(/&amp;/g, '&');
+ return text;
+ }
+
+ // IE doesn't accept periods or dashes in the window name, but the element IDs
+ // we use to generate popup window names may contain them, therefore we map them
+ // to allowed characters in a reversible way so that we can locate the correct
+ // element when the popup window is dismissed.
+ function id_to_windowname(text) {
+ text = text.replace(/\./g, '__dot__');
+ text = text.replace(/\-/g, '__dash__');
+ return text;
+ }
+
+ function windowname_to_id(text) {
+ text = text.replace(/__dot__/g, '.');
+ text = text.replace(/__dash__/g, '-');
+ return text;
+ }
+
+ function showAdminPopup(triggeringLink, name_regexp, add_popup) {
+ var name = triggeringLink.id.replace(name_regexp, '');
+ name = id_to_windowname(name);
+ var href = triggeringLink.href;
+ if (add_popup) {
+ if (href.indexOf('?') === -1) {
+ href += '?_popup=1';
+ } else {
+ href += '&_popup=1';
+ }
+ }
+ var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+ win.focus();
+ return false;
+ }
+
+ function showRelatedObjectLookupPopup(triggeringLink) {
+ return showAdminPopup(triggeringLink, /^lookup_/, true);
+ }
+
+ function dismissRelatedLookupPopup(win, chosenId) {
+ var name = windowname_to_id(win.name);
+ var elem = document.getElementById(name);
+ if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) {
+ elem.value += ',' + chosenId;
+ } else {
+ document.getElementById(name).value = chosenId;
+ }
+ win.close();
+ }
+
+ function showRelatedObjectPopup(triggeringLink) {
+ return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
+ }
+
+ function updateRelatedObjectLinks(triggeringLink) {
+ var $this = django.jQuery(triggeringLink);
+ var siblings = $this.nextAll('.change-related, .delete-related');
+ if (!siblings.length) {
+ return;
+ }
+ var value = $this.val();
+ if (value) {
+ siblings.each(function() {
+ var elm = django.jQuery(this);
+ elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
+ });
+ } else {
+ siblings.removeAttr('href');
+ }
+ }
+
+ function dismissAddRelatedObjectPopup(win, newId, newRepr) {
+ // newId and newRepr are expected to have previously been escaped by
+ // django.utils.html.escape.
+ newId = html_unescape(newId);
+ newRepr = html_unescape(newRepr);
+ var name = windowname_to_id(win.name);
+ var elem = document.getElementById(name);
+ if (elem) {
+ var elemName = elem.nodeName.toUpperCase();
+ if (elemName === 'SELECT') {
+ elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
+ } else if (elemName === 'INPUT') {
+ if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) {
+ elem.value += ',' + newId;
+ } else {
+ elem.value = newId;
+ }
+ }
+ // Trigger a change event to update related links if required.
+ django.jQuery(elem).trigger('change');
+ } else {
+ var toId = name + "_to";
+ var o = new Option(newRepr, newId);
+ SelectBox.add_to_cache(toId, o);
+ SelectBox.redisplay(toId);
+ }
+ win.close();
+ }
+
+ function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
+ objId = html_unescape(objId);
+ newRepr = html_unescape(newRepr);
+ var id = windowname_to_id(win.name).replace(/^edit_/, '');
+ var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+ var selects = django.jQuery(selectsSelector);
+ selects.find('option').each(function() {
+ if (this.value === objId) {
+ this.innerHTML = newRepr;
+ this.value = newId;
+ }
+ });
+ win.close();
+ }
+
+ function dismissDeleteRelatedObjectPopup(win, objId) {
+ objId = html_unescape(objId);
+ var id = windowname_to_id(win.name).replace(/^delete_/, '');
+ var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+ var selects = django.jQuery(selectsSelector);
+ selects.find('option').each(function() {
+ if (this.value === objId) {
+ django.jQuery(this).remove();
+ }
+ }).trigger('change');
+ win.close();
+ }
+
+ // Global for testing purposes
+ window.html_unescape = html_unescape;
+ window.id_to_windowname = id_to_windowname;
+ window.windowname_to_id = windowname_to_id;
+
+ window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
+ window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
+ window.showRelatedObjectPopup = showRelatedObjectPopup;
+ window.updateRelatedObjectLinks = updateRelatedObjectLinks;
+ window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
+ window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
+ window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
+
+ // Kept for backward compatibility
+ window.showAddAnotherPopup = showRelatedObjectPopup;
+ window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
+
+})();
diff --git a/tbc/static/admin/js/calendar.js b/tbc/static/admin/js/calendar.js
new file mode 100644
index 0000000..1043dd6
--- /dev/null
+++ b/tbc/static/admin/js/calendar.js
@@ -0,0 +1,178 @@
+/*global gettext, get_format, quickElement, removeChildren*/
+/*
+calendar.js - Calendar functions by Adrian Holovaty
+depends on core.js for utility functions like removeChildren or quickElement
+*/
+
+(function() {
+ 'use strict';
+ // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
+ var CalendarNamespace = {
+ monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
+ daysOfWeek: gettext('S M T W T F S').split(' '),
+ firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
+ isLeapYear: function(year) {
+ return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0));
+ },
+ getDaysInMonth: function(month, year) {
+ var days;
+ if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) {
+ days = 31;
+ }
+ else if (month === 4 || month === 6 || month === 9 || month === 11) {
+ days = 30;
+ }
+ else if (month === 2 && CalendarNamespace.isLeapYear(year)) {
+ days = 29;
+ }
+ else {
+ days = 28;
+ }
+ return days;
+ },
+ draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999
+ var today = new Date();
+ var todayDay = today.getDate();
+ var todayMonth = today.getMonth() + 1;
+ var todayYear = today.getFullYear();
+ var todayClass = '';
+
+ // Use UTC functions here because the date field does not contain time
+ // and using the UTC function variants prevent the local time offset
+ // from altering the date, specifically the day field. For example:
+ //
+ // ```
+ // var x = new Date('2013-10-02');
+ // var day = x.getDate();
+ // ```
+ //
+ // The day variable above will be 1 instead of 2 in, say, US Pacific time
+ // zone.
+ var isSelectedMonth = false;
+ if (typeof selected !== 'undefined') {
+ isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month);
+ }
+
+ month = parseInt(month);
+ year = parseInt(year);
+ var calDiv = document.getElementById(div_id);
+ removeChildren(calDiv);
+ var calTable = document.createElement('table');
+ quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year);
+ var tableBody = quickElement('tbody', calTable);
+
+ // Draw days-of-week header
+ var tableRow = quickElement('tr', tableBody);
+ for (var i = 0; i < 7; i++) {
+ quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);
+ }
+
+ var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
+ var days = CalendarNamespace.getDaysInMonth(month, year);
+
+ var nonDayCell;
+
+ // Draw blanks before first of month
+ tableRow = quickElement('tr', tableBody);
+ for (i = 0; i < startingPos; i++) {
+ nonDayCell = quickElement('td', tableRow, ' ');
+ nonDayCell.className = "nonday";
+ }
+
+ // Draw days of month
+ var currentDay = 1;
+ for (i = startingPos; currentDay <= days; i++) {
+ if (i % 7 === 0 && currentDay !== 1) {
+ tableRow = quickElement('tr', tableBody);
+ }
+ if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) {
+ todayClass = 'today';
+ } else {
+ todayClass = '';
+ }
+
+ // use UTC function; see above for explanation.
+ if (isSelectedMonth && currentDay === selected.getUTCDate()) {
+ if (todayClass !== '') {
+ todayClass += " ";
+ }
+ todayClass += "selected";
+ }
+
+ var cell = quickElement('td', tableRow, '', 'class', todayClass);
+
+ quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '(' + year + ',' + month + ',' + currentDay + '));');
+ currentDay++;
+ }
+
+ // Draw blanks after end of month (optional, but makes for valid code)
+ while (tableRow.childNodes.length < 7) {
+ nonDayCell = quickElement('td', tableRow, ' ');
+ nonDayCell.className = "nonday";
+ }
+
+ calDiv.appendChild(calTable);
+ }
+ };
+
+ // Calendar -- A calendar instance
+ function Calendar(div_id, callback, selected) {
+ // div_id (string) is the ID of the element in which the calendar will
+ // be displayed
+ // callback (string) is the name of a JavaScript function that will be
+ // called with the parameters (year, month, day) when a day in the
+ // calendar is clicked
+ this.div_id = div_id;
+ this.callback = callback;
+ this.today = new Date();
+ this.currentMonth = this.today.getMonth() + 1;
+ this.currentYear = this.today.getFullYear();
+ if (typeof selected !== 'undefined') {
+ this.selected = selected;
+ }
+ }
+ Calendar.prototype = {
+ drawCurrent: function() {
+ CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected);
+ },
+ drawDate: function(month, year, selected) {
+ this.currentMonth = month;
+ this.currentYear = year;
+
+ if(selected) {
+ this.selected = selected;
+ }
+
+ this.drawCurrent();
+ },
+ drawPreviousMonth: function() {
+ if (this.currentMonth === 1) {
+ this.currentMonth = 12;
+ this.currentYear--;
+ }
+ else {
+ this.currentMonth--;
+ }
+ this.drawCurrent();
+ },
+ drawNextMonth: function() {
+ if (this.currentMonth === 12) {
+ this.currentMonth = 1;
+ this.currentYear++;
+ }
+ else {
+ this.currentMonth++;
+ }
+ this.drawCurrent();
+ },
+ drawPreviousYear: function() {
+ this.currentYear--;
+ this.drawCurrent();
+ },
+ drawNextYear: function() {
+ this.currentYear++;
+ this.drawCurrent();
+ }
+ };
+ window.Calendar = Calendar;
+})();
diff --git a/tbc/static/admin/js/collapse.js b/tbc/static/admin/js/collapse.js
new file mode 100644
index 0000000..7cb9362
--- /dev/null
+++ b/tbc/static/admin/js/collapse.js
@@ -0,0 +1,26 @@
+/*global gettext*/
+(function($) {
+ 'use strict';
+ $(document).ready(function() {
+ // Add anchor tag for Show/Hide link
+ $("fieldset.collapse").each(function(i, elem) {
+ // Don't hide if fields in this fieldset have errors
+ if ($(elem).find("div.errors").length === 0) {
+ $(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' +
+ i + '" class="collapse-toggle" href="#">' + gettext("Show") +
+ '</a>)');
+ }
+ });
+ // Add toggle to anchor tag
+ $("fieldset.collapse a.collapse-toggle").click(function(ev) {
+ if ($(this).closest("fieldset").hasClass("collapsed")) {
+ // Show
+ $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]);
+ } else {
+ // Hide
+ $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]);
+ }
+ return false;
+ });
+ });
+})(django.jQuery);
diff --git a/tbc/static/admin/js/collapse.min.js b/tbc/static/admin/js/collapse.min.js
new file mode 100644
index 0000000..6251d91
--- /dev/null
+++ b/tbc/static/admin/js/collapse.min.js
@@ -0,0 +1,2 @@
+(function(a){a(document).ready(function(){a("fieldset.collapse").each(function(b,c){0===a(c).find("div.errors").length&&a(c).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser'+b+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")});a("fieldset.collapse a.collapse-toggle").click(function(b){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset",
+[a(this).attr("id")]);return!1})})})(django.jQuery);
diff --git a/tbc/static/admin/js/core.js b/tbc/static/admin/js/core.js
new file mode 100644
index 0000000..34f9926
--- /dev/null
+++ b/tbc/static/admin/js/core.js
@@ -0,0 +1,263 @@
+// Core javascript helper functions
+
+// basic browser identification & version
+var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion);
+var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
+
+// Cross-browser event handlers.
+function addEvent(obj, evType, fn) {
+ 'use strict';
+ if (obj.addEventListener) {
+ obj.addEventListener(evType, fn, false);
+ return true;
+ } else if (obj.attachEvent) {
+ var r = obj.attachEvent("on" + evType, fn);
+ return r;
+ } else {
+ return false;
+ }
+}
+
+function removeEvent(obj, evType, fn) {
+ 'use strict';
+ if (obj.removeEventListener) {
+ obj.removeEventListener(evType, fn, false);
+ return true;
+ } else if (obj.detachEvent) {
+ obj.detachEvent("on" + evType, fn);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+function cancelEventPropagation(e) {
+ 'use strict';
+ if (!e) {
+ e = window.event;
+ }
+ e.cancelBubble = true;
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+}
+
+// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
+function quickElement() {
+ 'use strict';
+ var obj = document.createElement(arguments[0]);
+ if (arguments[2]) {
+ var textNode = document.createTextNode(arguments[2]);
+ obj.appendChild(textNode);
+ }
+ var len = arguments.length;
+ for (var i = 3; i < len; i += 2) {
+ obj.setAttribute(arguments[i], arguments[i + 1]);
+ }
+ arguments[1].appendChild(obj);
+ return obj;
+}
+
+// "a" is reference to an object
+function removeChildren(a) {
+ 'use strict';
+ while (a.hasChildNodes()) {
+ a.removeChild(a.lastChild);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Cross-browser xmlhttp object
+// from http://jibbering.com/2002/4/httprequest.html
+// ----------------------------------------------------------------------------
+var xmlhttp;
+/*@cc_on @*/
+/*@if (@_jscript_version >= 5)
+ try {
+ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ try {
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (E) {
+ xmlhttp = false;
+ }
+ }
+@else
+ xmlhttp = false;
+@end @*/
+if (!xmlhttp && typeof XMLHttpRequest !== 'undefined') {
+ xmlhttp = new XMLHttpRequest();
+}
+
+// ----------------------------------------------------------------------------
+// Find-position functions by PPK
+// See http://www.quirksmode.org/js/findpos.html
+// ----------------------------------------------------------------------------
+function findPosX(obj) {
+ 'use strict';
+ var curleft = 0;
+ if (obj.offsetParent) {
+ while (obj.offsetParent) {
+ curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
+ obj = obj.offsetParent;
+ }
+ // IE offsetParent does not include the top-level
+ if (isIE && obj.parentElement) {
+ curleft += obj.offsetLeft - obj.scrollLeft;
+ }
+ } else if (obj.x) {
+ curleft += obj.x;
+ }
+ return curleft;
+}
+
+function findPosY(obj) {
+ 'use strict';
+ var curtop = 0;
+ if (obj.offsetParent) {
+ while (obj.offsetParent) {
+ curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
+ obj = obj.offsetParent;
+ }
+ // IE offsetParent does not include the top-level
+ if (isIE && obj.parentElement) {
+ curtop += obj.offsetTop - obj.scrollTop;
+ }
+ } else if (obj.y) {
+ curtop += obj.y;
+ }
+ return curtop;
+}
+
+//-----------------------------------------------------------------------------
+// Date object extensions
+// ----------------------------------------------------------------------------
+(function() {
+ 'use strict';
+ Date.prototype.getTwelveHours = function() {
+ var hours = this.getHours();
+ if (hours === 0) {
+ return 12;
+ }
+ else {
+ return hours <= 12 ? hours : hours - 12;
+ }
+ };
+
+ Date.prototype.getTwoDigitMonth = function() {
+ return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
+ };
+
+ Date.prototype.getTwoDigitDate = function() {
+ return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
+ };
+
+ Date.prototype.getTwoDigitTwelveHour = function() {
+ return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
+ };
+
+ Date.prototype.getTwoDigitHour = function() {
+ return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
+ };
+
+ Date.prototype.getTwoDigitMinute = function() {
+ return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
+ };
+
+ Date.prototype.getTwoDigitSecond = function() {
+ return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
+ };
+
+ Date.prototype.getHourMinute = function() {
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
+ };
+
+ Date.prototype.getHourMinuteSecond = function() {
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
+ };
+
+ Date.prototype.strftime = function(format) {
+ var fields = {
+ c: this.toString(),
+ d: this.getTwoDigitDate(),
+ H: this.getTwoDigitHour(),
+ I: this.getTwoDigitTwelveHour(),
+ m: this.getTwoDigitMonth(),
+ M: this.getTwoDigitMinute(),
+ p: (this.getHours() >= 12) ? 'PM' : 'AM',
+ S: this.getTwoDigitSecond(),
+ w: '0' + this.getDay(),
+ x: this.toLocaleDateString(),
+ X: this.toLocaleTimeString(),
+ y: ('' + this.getFullYear()).substr(2, 4),
+ Y: '' + this.getFullYear(),
+ '%': '%'
+ };
+ var result = '', i = 0;
+ while (i < format.length) {
+ if (format.charAt(i) === '%') {
+ result = result + fields[format.charAt(i + 1)];
+ ++i;
+ }
+ else {
+ result = result + format.charAt(i);
+ }
+ ++i;
+ }
+ return result;
+ };
+
+// ----------------------------------------------------------------------------
+// String object extensions
+// ----------------------------------------------------------------------------
+ String.prototype.pad_left = function(pad_length, pad_string) {
+ var new_string = this;
+ for (var i = 0; new_string.length < pad_length; i++) {
+ new_string = pad_string + new_string;
+ }
+ return new_string;
+ };
+
+ String.prototype.strptime = function(format) {
+ var split_format = format.split(/[.\-/]/);
+ var date = this.split(/[.\-/]/);
+ var i = 0;
+ var day, month, year;
+ while (i < split_format.length) {
+ switch (split_format[i]) {
+ case "%d":
+ day = date[i];
+ break;
+ case "%m":
+ month = date[i] - 1;
+ break;
+ case "%Y":
+ year = date[i];
+ break;
+ case "%y":
+ year = date[i];
+ break;
+ }
+ ++i;
+ }
+ return new Date(year, month, day);
+ };
+
+})();
+// ----------------------------------------------------------------------------
+// Get the computed style for and element
+// ----------------------------------------------------------------------------
+function getStyle(oElm, strCssRule) {
+ 'use strict';
+ var strValue = "";
+ if(document.defaultView && document.defaultView.getComputedStyle) {
+ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
+ }
+ else if(oElm.currentStyle) {
+ strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
+ return p1.toUpperCase();
+ });
+ strValue = oElm.currentStyle[strCssRule];
+ }
+ return strValue;
+}
diff --git a/tbc/static/admin/js/inlines.js b/tbc/static/admin/js/inlines.js
new file mode 100644
index 0000000..c725e30
--- /dev/null
+++ b/tbc/static/admin/js/inlines.js
@@ -0,0 +1,275 @@
+/*global DateTimeShortcuts, SelectFilter*/
+/**
+ * Django admin inlines
+ *
+ * Based on jQuery Formset 1.1
+ * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
+ * @requires jQuery 1.2.6 or later
+ *
+ * Copyright (c) 2009, Stanislaus Madueke
+ * All rights reserved.
+ *
+ * Spiced up with Code from Zain Memon's GSoC project 2009
+ * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip.
+ *
+ * Licensed under the New BSD License
+ * See: http://www.opensource.org/licenses/bsd-license.php
+ */
+(function($) {
+ 'use strict';
+ $.fn.formset = function(opts) {
+ var options = $.extend({}, $.fn.formset.defaults, opts);
+ var $this = $(this);
+ var $parent = $this.parent();
+ var updateElementIndex = function(el, prefix, ndx) {
+ var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
+ var replacement = prefix + "-" + ndx;
+ if ($(el).prop("for")) {
+ $(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
+ }
+ if (el.id) {
+ el.id = el.id.replace(id_regex, replacement);
+ }
+ if (el.name) {
+ el.name = el.name.replace(id_regex, replacement);
+ }
+ };
+ var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
+ var nextIndex = parseInt(totalForms.val(), 10);
+ var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
+ // only show the add button if we are allowed to add more items,
+ // note that max_num = None translates to a blank string.
+ var showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0;
+ $this.each(function(i) {
+ $(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
+ });
+ if ($this.length && showAddButton) {
+ var addButton;
+ if ($this.prop("tagName") === "TR") {
+ // If forms are laid out as table rows, insert the
+ // "add" button in a new table row:
+ var numCols = this.eq(-1).children().length;
+ $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
+ addButton = $parent.find("tr:last a");
+ } else {
+ // Otherwise, insert it immediately after the last form:
+ $this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
+ addButton = $this.filter(":last").next().find("a");
+ }
+ addButton.click(function(e) {
+ e.preventDefault();
+ var template = $("#" + options.prefix + "-empty");
+ var row = template.clone(true);
+ row.removeClass(options.emptyCssClass)
+ .addClass(options.formCssClass)
+ .attr("id", options.prefix + "-" + nextIndex);
+ if (row.is("tr")) {
+ // If the forms are laid out in table rows, insert
+ // the remove button into the last table cell:
+ row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></div>");
+ } else if (row.is("ul") || row.is("ol")) {
+ // If they're laid out as an ordered/unordered list,
+ // insert an <li> after the last list item:
+ row.append('<li><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></li>");
+ } else {
+ // Otherwise, just insert the remove button as the
+ // last child element of the form's container:
+ row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
+ }
+ row.find("*").each(function() {
+ updateElementIndex(this, options.prefix, totalForms.val());
+ });
+ // Insert the new form when it has been fully edited
+ row.insertBefore($(template));
+ // Update number of total forms
+ $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
+ nextIndex += 1;
+ // Hide add button in case we've hit the max, except we want to add infinitely
+ if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) {
+ addButton.parent().hide();
+ }
+ // The delete button of each row triggers a bunch of other things
+ row.find("a." + options.deleteCssClass).click(function(e1) {
+ e1.preventDefault();
+ // Remove the parent form containing this button:
+ row.remove();
+ nextIndex -= 1;
+ // If a post-delete callback was provided, call it with the deleted form:
+ if (options.removed) {
+ options.removed(row);
+ }
+ $(document).trigger('formset:removed', [row, options.prefix]);
+ // Update the TOTAL_FORMS form count.
+ var forms = $("." + options.formCssClass);
+ $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
+ // Show add button again once we drop below max
+ if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) {
+ addButton.parent().show();
+ }
+ // Also, update names and ids for all remaining form controls
+ // so they remain in sequence:
+ var i, formCount;
+ var updateElementCallback = function() {
+ updateElementIndex(this, options.prefix, i);
+ };
+ for (i = 0, formCount = forms.length; i < formCount; i++) {
+ updateElementIndex($(forms).get(i), options.prefix, i);
+ $(forms.get(i)).find("*").each(updateElementCallback);
+ }
+ });
+ // If a post-add callback was supplied, call it with the added form:
+ if (options.added) {
+ options.added(row);
+ }
+ $(document).trigger('formset:added', [row, options.prefix]);
+ });
+ }
+ return this;
+ };
+
+ /* Setup plugin defaults */
+ $.fn.formset.defaults = {
+ prefix: "form", // The form prefix for your django formset
+ addText: "add another", // Text for the add link
+ deleteText: "remove", // Text for the delete link
+ addCssClass: "add-row", // CSS class applied to the add link
+ deleteCssClass: "delete-row", // CSS class applied to the delete link
+ emptyCssClass: "empty-row", // CSS class applied to the empty row
+ formCssClass: "dynamic-form", // CSS class applied to each form in a formset
+ added: null, // Function called each time a new form is added
+ removed: null // Function called each time a form is deleted
+ };
+
+
+ // Tabular inlines ---------------------------------------------------------
+ $.fn.tabularFormset = function(options) {
+ var $rows = $(this);
+ var alternatingRows = function(row) {
+ $($rows.selector).not(".add-row").removeClass("row1 row2")
+ .filter(":even").addClass("row1").end()
+ .filter(":odd").addClass("row2");
+ };
+
+ var reinitDateTimeShortCuts = function() {
+ // Reinitialize the calendar and clock widgets by force
+ if (typeof DateTimeShortcuts !== "undefined") {
+ $(".datetimeshortcuts").remove();
+ DateTimeShortcuts.init();
+ }
+ };
+
+ var updateSelectFilter = function() {
+ // If any SelectFilter widgets are a part of the new form,
+ // instantiate a new SelectFilter instance for it.
+ if (typeof SelectFilter !== 'undefined') {
+ $('.selectfilter').each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], false);
+ });
+ $('.selectfilterstacked').each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], true);
+ });
+ }
+ };
+
+ var initPrepopulatedFields = function(row) {
+ row.find('.prepopulated_field').each(function() {
+ var field = $(this),
+ input = field.find('input, select, textarea'),
+ dependency_list = input.data('dependency_list') || [],
+ dependencies = [];
+ $.each(dependency_list, function(i, field_name) {
+ dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
+ });
+ if (dependencies.length) {
+ input.prepopulate(dependencies, input.attr('maxlength'));
+ }
+ });
+ };
+
+ $rows.formset({
+ prefix: options.prefix,
+ addText: options.addText,
+ formCssClass: "dynamic-" + options.prefix,
+ deleteCssClass: "inline-deletelink",
+ deleteText: options.deleteText,
+ emptyCssClass: "empty-form",
+ removed: alternatingRows,
+ added: function(row) {
+ initPrepopulatedFields(row);
+ reinitDateTimeShortCuts();
+ updateSelectFilter();
+ alternatingRows(row);
+ }
+ });
+
+ return $rows;
+ };
+
+ // Stacked inlines ---------------------------------------------------------
+ $.fn.stackedFormset = function(options) {
+ var $rows = $(this);
+ var updateInlineLabel = function(row) {
+ $($rows.selector).find(".inline_label").each(function(i) {
+ var count = i + 1;
+ $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
+ });
+ };
+
+ var reinitDateTimeShortCuts = function() {
+ // Reinitialize the calendar and clock widgets by force, yuck.
+ if (typeof DateTimeShortcuts !== "undefined") {
+ $(".datetimeshortcuts").remove();
+ DateTimeShortcuts.init();
+ }
+ };
+
+ var updateSelectFilter = function() {
+ // If any SelectFilter widgets were added, instantiate a new instance.
+ if (typeof SelectFilter !== "undefined") {
+ $(".selectfilter").each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], false);
+ });
+ $(".selectfilterstacked").each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], true);
+ });
+ }
+ };
+
+ var initPrepopulatedFields = function(row) {
+ row.find('.prepopulated_field').each(function() {
+ var field = $(this),
+ input = field.find('input, select, textarea'),
+ dependency_list = input.data('dependency_list') || [],
+ dependencies = [];
+ $.each(dependency_list, function(i, field_name) {
+ dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
+ });
+ if (dependencies.length) {
+ input.prepopulate(dependencies, input.attr('maxlength'));
+ }
+ });
+ };
+
+ $rows.formset({
+ prefix: options.prefix,
+ addText: options.addText,
+ formCssClass: "dynamic-" + options.prefix,
+ deleteCssClass: "inline-deletelink",
+ deleteText: options.deleteText,
+ emptyCssClass: "empty-form",
+ removed: updateInlineLabel,
+ added: function(row) {
+ initPrepopulatedFields(row);
+ reinitDateTimeShortCuts();
+ updateSelectFilter();
+ updateInlineLabel(row);
+ }
+ });
+
+ return $rows;
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/js/inlines.min.js b/tbc/static/admin/js/inlines.min.js
new file mode 100644
index 0000000..f83cbec
--- /dev/null
+++ b/tbc/static/admin/js/inlines.min.js
@@ -0,0 +1,9 @@
+(function(b){b.fn.formset=function(d){var a=b.extend({},b.fn.formset.defaults,d),e=b(this);d=e.parent();var k=function(a,f,l){var c=new RegExp("("+f+"-(\\d+|__prefix__))");f=f+"-"+l;b(a).prop("for")&&b(a).prop("for",b(a).prop("for").replace(c,f));a.id&&(a.id=a.id.replace(c,f));a.name&&(a.name=a.name.replace(c,f))},h=b("#id_"+a.prefix+"-TOTAL_FORMS").prop("autocomplete","off"),l=parseInt(h.val(),10),f=b("#id_"+a.prefix+"-MAX_NUM_FORMS").prop("autocomplete","off"),c=""===f.val()||0<f.val()-h.val();
+e.each(function(f){b(this).not("."+a.emptyCssClass).addClass(a.formCssClass)});if(e.length&&c){var m;"TR"===e.prop("tagName")?(e=this.eq(-1).children().length,d.append('<tr class="'+a.addCssClass+'"><td colspan="'+e+'"><a href="javascript:void(0)">'+a.addText+"</a></tr>"),m=d.find("tr:last a")):(e.filter(":last").after('<div class="'+a.addCssClass+'"><a href="javascript:void(0)">'+a.addText+"</a></div>"),m=e.filter(":last").next().find("a"));m.click(function(c){c.preventDefault();c=b("#"+a.prefix+
+"-empty");var g=c.clone(!0);g.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+l);g.is("tr")?g.children(":last").append('<div><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></div>"):g.is("ul")||g.is("ol")?g.append('<li><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></li>"):g.children(":first").append('<span><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></span>");g.find("*").each(function(){k(this,
+a.prefix,h.val())});g.insertBefore(b(c));b(h).val(parseInt(h.val(),10)+1);l+=1;""!==f.val()&&0>=f.val()-h.val()&&m.parent().hide();g.find("a."+a.deleteCssClass).click(function(c){c.preventDefault();g.remove();--l;a.removed&&a.removed(g);b(document).trigger("formset:removed",[g,a.prefix]);c=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(c.length);(""===f.val()||0<f.val()-c.length)&&m.parent().show();var d,e,h=function(){k(this,a.prefix,d)};d=0;for(e=c.length;d<e;d++)k(b(c).get(d),a.prefix,
+d),b(c.get(d)).find("*").each(h)});a.added&&a.added(g);b(document).trigger("formset:added",[g,a.prefix])})}return this};b.fn.formset.defaults={prefix:"form",addText:"add another",deleteText:"remove",addCssClass:"add-row",deleteCssClass:"delete-row",emptyCssClass:"empty-row",formCssClass:"dynamic-form",added:null,removed:null};b.fn.tabularFormset=function(d){var a=b(this),e=function(l){b(a.selector).not(".add-row").removeClass("row1 row2").filter(":even").addClass("row1").end().filter(":odd").addClass("row2")},
+k=function(){"undefined"!==typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!1)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!0)}))},h=function(a){a.find(".prepopulated_field").each(function(){var f=b(this).find("input, select, textarea"),c=f.data("dependency_list")||[],d=[];b.each(c,function(b,c){d.push("#"+a.find(".field-"+c).find("input, select, textarea").attr("id"))});
+d.length&&f.prepopulate(d,f.attr("maxlength"))})};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:e,added:function(a){h(a);"undefined"!==typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());k();e(a)}});return a};b.fn.stackedFormset=function(d){var a=b(this),e=function(d){b(a.selector).find(".inline_label").each(function(a){a+=1;b(this).html(b(this).html().replace(/(#\d+)/g,
+"#"+a))})},k=function(){"undefined"!==typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!1)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!0)}))},h=function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(b,c){e.push("#"+a.find(".form-row .field-"+c).find("input, select, textarea").attr("id"))});
+e.length&&d.prepopulate(e,d.attr("maxlength"))})};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:e,added:function(a){h(a);"undefined"!==typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());k();e(a)}});return a}})(django.jQuery);
diff --git a/tbc/static/admin/js/jquery.init.js b/tbc/static/admin/js/jquery.init.js
new file mode 100644
index 0000000..f3ac162
--- /dev/null
+++ b/tbc/static/admin/js/jquery.init.js
@@ -0,0 +1,8 @@
+/*global django:true, jQuery:false*/
+/* Puts the included jQuery into our own namespace using noConflict and passing
+ * it 'true'. This ensures that the included jQuery doesn't pollute the global
+ * namespace (i.e. this preserves pre-existing values for both window.$ and
+ * window.jQuery).
+ */
+var django = django || {};
+django.jQuery = jQuery.noConflict(true);
diff --git a/tbc/static/admin/js/prepopulate.js b/tbc/static/admin/js/prepopulate.js
new file mode 100644
index 0000000..5d4b0e8
--- /dev/null
+++ b/tbc/static/admin/js/prepopulate.js
@@ -0,0 +1,42 @@
+/*global URLify*/
+(function($) {
+ 'use strict';
+ $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
+ /*
+ Depends on urlify.js
+ Populates a selected field with the values of the dependent fields,
+ URLifies and shortens the string.
+ dependencies - array of dependent fields ids
+ maxLength - maximum length of the URLify'd string
+ allowUnicode - Unicode support of the URLify'd string
+ */
+ return this.each(function() {
+ var prepopulatedField = $(this);
+
+ var populate = function() {
+ // Bail if the field's value has been changed by the user
+ if (prepopulatedField.data('_changed')) {
+ return;
+ }
+
+ var values = [];
+ $.each(dependencies, function(i, field) {
+ field = $(field);
+ if (field.val().length > 0) {
+ values.push(field.val());
+ }
+ });
+ prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
+ };
+
+ prepopulatedField.data('_changed', false);
+ prepopulatedField.change(function() {
+ prepopulatedField.data('_changed', true);
+ });
+
+ if (!prepopulatedField.val()) {
+ $(dependencies.join(',')).keyup(populate).change(populate).focus(populate);
+ }
+ });
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/js/prepopulate.min.js b/tbc/static/admin/js/prepopulate.min.js
new file mode 100644
index 0000000..75f3c17
--- /dev/null
+++ b/tbc/static/admin/js/prepopulate.min.js
@@ -0,0 +1 @@
+(function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);0<d.val().length&&b.push(d.val())});a.val(URLify(b.join(" "),f,g))}};a.data("_changed",!1);a.change(function(){a.data("_changed",!0)});a.val()||c(e.join(",")).keyup(b).change(b).focus(b)})}})(django.jQuery);
diff --git a/tbc/static/admin/js/timeparse.js b/tbc/static/admin/js/timeparse.js
new file mode 100644
index 0000000..3cdc7ec
--- /dev/null
+++ b/tbc/static/admin/js/timeparse.js
@@ -0,0 +1,106 @@
+(function() {
+ 'use strict';
+ var timeParsePatterns = [
+ // 9
+ {
+ re: /^\d{1,2}$/i,
+ handler: function(bits) {
+ if (bits[0].length === 1) {
+ return '0' + bits[0] + ':00';
+ } else {
+ return bits[0] + ':00';
+ }
+ }
+ },
+ // 13:00
+ {
+ re: /^\d{2}[:.]\d{2}$/i,
+ handler: function(bits) {
+ return bits[0].replace('.', ':');
+ }
+ },
+ // 9:00
+ {
+ re: /^\d[:.]\d{2}$/i,
+ handler: function(bits) {
+ return '0' + bits[0].replace('.', ':');
+ }
+ },
+ // 3 am / 3 a.m. / 3am
+ {
+ re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
+ handler: function(bits) {
+ var hour = parseInt(bits[1]);
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (bits[2].toLowerCase() === 'p') {
+ if (hour === 12) {
+ hour = 0;
+ }
+ return (hour + 12) + ':00';
+ } else {
+ if (hour < 10) {
+ return '0' + hour + ':00';
+ } else {
+ return hour + ':00';
+ }
+ }
+ }
+ },
+ // 3.30 am / 3:15 a.m. / 3.00am
+ {
+ re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
+ handler: function(bits) {
+ var hour = parseInt(bits[1]);
+ var mins = parseInt(bits[2]);
+ if (mins < 10) {
+ mins = '0' + mins;
+ }
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (bits[3].toLowerCase() === 'p') {
+ if (hour === 12) {
+ hour = 0;
+ }
+ return (hour + 12) + ':' + mins;
+ } else {
+ if (hour < 10) {
+ return '0' + hour + ':' + mins;
+ } else {
+ return hour + ':' + mins;
+ }
+ }
+ }
+ },
+ // noon
+ {
+ re: /^no/i,
+ handler: function(bits) {
+ return '12:00';
+ }
+ },
+ // midnight
+ {
+ re: /^mid/i,
+ handler: function(bits) {
+ return '00:00';
+ }
+ }
+ ];
+
+ function parseTimeString(s) {
+ for (var i = 0; i < timeParsePatterns.length; i++) {
+ var re = timeParsePatterns[i].re;
+ var handler = timeParsePatterns[i].handler;
+ var bits = re.exec(s);
+ if (bits) {
+ return handler(bits);
+ }
+ }
+ return s;
+ }
+
+ window.parseTimeString = parseTimeString;
+})();
diff --git a/tbc/static/admin/js/urlify.js b/tbc/static/admin/js/urlify.js
new file mode 100644
index 0000000..b27325e
--- /dev/null
+++ b/tbc/static/admin/js/urlify.js
@@ -0,0 +1,171 @@
+/*global XRegExp*/
+(function() {
+ 'use strict';
+
+ var LATIN_MAP = {
+ 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE',
+ 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I',
+ 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O',
+ 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U',
+ 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a',
+ 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c',
+ 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i',
+ 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o',
+ 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
+ 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
+ };
+ var LATIN_SYMBOLS_MAP = {
+ '©': '(c)'
+ };
+ var GREEK_MAP = {
+ 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h',
+ 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3',
+ 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f',
+ 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o',
+ 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y',
+ 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z',
+ 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N',
+ 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y',
+ 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I',
+ 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y'
+ };
+ var TURKISH_MAP = {
+ 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u',
+ 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G'
+ };
+ var ROMANIAN_MAP = {
+ 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a',
+ 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A'
+ };
+ var RUSSIAN_MAP = {
+ 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo',
+ 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm',
+ 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
+ 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '',
+ 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya',
+ 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo',
+ 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M',
+ 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
+ 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '',
+ 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya'
+ };
+ var UKRAINIAN_MAP = {
+ 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i',
+ 'ї': 'yi', 'ґ': 'g'
+ };
+ var CZECH_MAP = {
+ 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't',
+ 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R',
+ 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z'
+ };
+ var POLISH_MAP = {
+ 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's',
+ 'ź': 'z', 'ż': 'z',
+ 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S',
+ 'Ź': 'Z', 'Ż': 'Z'
+ };
+ var LATVIAN_MAP = {
+ 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l',
+ 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z',
+ 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L',
+ 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z'
+ };
+ var ARABIC_MAP = {
+ 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd',
+ 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't',
+ 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm',
+ 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y'
+ };
+ var LITHUANIAN_MAP = {
+ 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u',
+ 'ū': 'u', 'ž': 'z',
+ 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U',
+ 'Ū': 'U', 'Ž': 'Z'
+ };
+ var SERBIAN_MAP = {
+ 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz',
+ 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C',
+ 'Џ': 'Dz', 'Đ': 'Dj'
+ };
+ var AZERBAIJANI_MAP = {
+ 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u',
+ 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U'
+ };
+
+ var ALL_DOWNCODE_MAPS = [
+ LATIN_MAP,
+ LATIN_SYMBOLS_MAP,
+ GREEK_MAP,
+ TURKISH_MAP,
+ ROMANIAN_MAP,
+ RUSSIAN_MAP,
+ UKRAINIAN_MAP,
+ CZECH_MAP,
+ POLISH_MAP,
+ LATVIAN_MAP,
+ ARABIC_MAP,
+ LITHUANIAN_MAP,
+ SERBIAN_MAP,
+ AZERBAIJANI_MAP
+ ];
+
+ var Downcoder = {
+ 'Initialize': function() {
+ if (Downcoder.map) { // already made
+ return;
+ }
+ Downcoder.map = {};
+ Downcoder.chars = [];
+ for (var i = 0; i < ALL_DOWNCODE_MAPS.length; i++) {
+ var lookup = ALL_DOWNCODE_MAPS[i];
+ for (var c in lookup) {
+ if (lookup.hasOwnProperty(c)) {
+ Downcoder.map[c] = lookup[c];
+ }
+ }
+ }
+ for (var k in Downcoder.map) {
+ if (Downcoder.map.hasOwnProperty(k)) {
+ Downcoder.chars.push(k);
+ }
+ }
+ Downcoder.regex = new RegExp(Downcoder.chars.join('|'), 'g');
+ }
+ };
+
+ function downcode(slug) {
+ Downcoder.Initialize();
+ return slug.replace(Downcoder.regex, function(m) {
+ return Downcoder.map[m];
+ });
+ }
+
+
+ function URLify(s, num_chars, allowUnicode) {
+ // changes, e.g., "Petty theft" to "petty-theft"
+ // remove all these words from the string before urlifying
+ if (!allowUnicode) {
+ s = downcode(s);
+ }
+ var removelist = [
+ "a", "an", "as", "at", "before", "but", "by", "for", "from", "is",
+ "in", "into", "like", "of", "off", "on", "onto", "per", "since",
+ "than", "the", "this", "that", "to", "up", "via", "with"
+ ];
+ var r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
+ s = s.replace(r, '');
+ // if downcode doesn't hit, the char will be stripped here
+ if (allowUnicode) {
+ // Keep Unicode letters including both lowercase and uppercase
+ // characters, whitespace, and dash; remove other characters.
+ s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), '');
+ } else {
+ s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
+ }
+ s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
+ s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
+ s = s.toLowerCase(); // convert to lowercase
+ return s.substring(0, num_chars); // trim to first num_chars chars
+ }
+ window.URLify = URLify;
+})();
diff --git a/tbc/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt b/tbc/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt
new file mode 100644
index 0000000..d930e62
--- /dev/null
+++ b/tbc/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt
@@ -0,0 +1,26 @@
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tbc/static/admin/js/vendor/jquery/jquery.js b/tbc/static/admin/js/vendor/jquery/jquery.js
new file mode 100644
index 0000000..eed1777
--- /dev/null
+++ b/tbc/static/admin/js/vendor/jquery/jquery.js
@@ -0,0 +1,9210 @@
+/*!
+ * jQuery JavaScript Library v2.1.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-04-28T16:01Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+ nodeType = context.nodeType;
+
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ if ( !seed && documentIsHTML ) {
+
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType !== 1 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+ parent = doc.defaultView;
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\f]' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Support: Firefox, Chrome, Safari
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optimization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ if ( elem.ownerDocument.defaultView.opener ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ }
+
+ return window.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') (#12537)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE9-11+
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+ div.removeChild( marginDiv );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // Shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // Both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // At this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // At this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // At this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // Use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Support: IE9-11+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur(),
+ // break the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // Handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // Ensure the complete handler is called before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // Store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // Support: Android 2.3
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS<=5.1, Android<=4.2+
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE<=11+
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: Android<=2.3
+ // Options inside disabled selects are incorrectly marked as disabled
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<=11+
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // Toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // Handle most common string cases
+ ret.replace(rreturn, "") :
+ // Handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Document location
+ ajaxLocation = window.location.href,
+
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // Shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+ window.attachEvent( "onunload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // Support: BlackBerry 5, iOS 3 (original iPhone)
+ // If we don't have gBCR, just use 0,0 rather than error
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // Assume getBoundingClientRect is there when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Support: Safari<7+, Chrome<37+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/tbc/static/admin/js/vendor/jquery/jquery.min.js b/tbc/static/admin/js/vendor/jquery/jquery.min.js
new file mode 100644
index 0000000..49990d6
--- /dev/null
+++ b/tbc/static/admin/js/vendor/jquery/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
diff --git a/tbc/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt b/tbc/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt
new file mode 100644
index 0000000..341652a
--- /dev/null
+++ b/tbc/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2007-2012 Steven Levithan <http://xregexp.com/>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tbc/static/admin/js/vendor/xregexp/xregexp.min.js b/tbc/static/admin/js/vendor/xregexp/xregexp.min.js
new file mode 100644
index 0000000..a190558
--- /dev/null
+++ b/tbc/static/admin/js/vendor/xregexp/xregexp.min.js
@@ -0,0 +1,18 @@
+//XRegExp 2.0.0 <xregexp.com> MIT License
+var XRegExp;XRegExp=XRegExp||function(n){"use strict";function v(n,i,r){var u;for(u in t.prototype)t.prototype.hasOwnProperty(u)&&(n[u]=t.prototype[u]);return n.xregexp={captureNames:i,isNative:!!r},n}function g(n){return(n.global?"g":"")+(n.ignoreCase?"i":"")+(n.multiline?"m":"")+(n.extended?"x":"")+(n.sticky?"y":"")}function o(n,r,u){if(!t.isRegExp(n))throw new TypeError("type RegExp expected");var f=i.replace.call(g(n)+(r||""),h,"");return u&&(f=i.replace.call(f,new RegExp("["+u+"]+","g"),"")),n=n.xregexp&&!n.xregexp.isNative?v(t(n.source,f),n.xregexp.captureNames?n.xregexp.captureNames.slice(0):null):v(new RegExp(n.source,f),null,!0)}function a(n,t){var i=n.length;if(Array.prototype.lastIndexOf)return n.lastIndexOf(t);while(i--)if(n[i]===t)return i;return-1}function s(n,t){return Object.prototype.toString.call(n).toLowerCase()==="[object "+t+"]"}function d(n){return n=n||{},n==="all"||n.all?n={natives:!0,extensibility:!0}:s(n,"string")&&(n=t.forEach(n,/[^\s,]+/,function(n){this[n]=!0},{})),n}function ut(n,t,i,u){var o=p.length,s=null,e,f;y=!0;try{while(o--)if(f=p[o],(f.scope==="all"||f.scope===i)&&(!f.trigger||f.trigger.call(u))&&(f.pattern.lastIndex=t,e=r.exec.call(f.pattern,n),e&&e.index===t)){s={output:f.handler.call(u,e,i),match:e};break}}catch(h){throw h;}finally{y=!1}return s}function b(n){t.addToken=c[n?"on":"off"],f.extensibility=n}function tt(n){RegExp.prototype.exec=(n?r:i).exec,RegExp.prototype.test=(n?r:i).test,String.prototype.match=(n?r:i).match,String.prototype.replace=(n?r:i).replace,String.prototype.split=(n?r:i).split,f.natives=n}var t,c,u,f={natives:!1,extensibility:!1},i={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},k={},p=[],e="default",rt="class",it={"default":/^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/,"class":/^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/},et=/\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,h=/([\s\S])(?=[\s\S]*\1)/g,nt=/^(?:[?*+]|{\d+(?:,\d*)?})\??/,ft=i.exec.call(/()??/,"")[1]===n,l=RegExp.prototype.sticky!==n,y=!1,w="gim"+(l?"y":"");return t=function(r,u){if(t.isRegExp(r)){if(u!==n)throw new TypeError("can't supply flags when constructing one RegExp from another");return o(r)}if(y)throw new Error("can't call the XRegExp constructor within token definition functions");var l=[],a=e,b={hasNamedCapture:!1,captureNames:[],hasFlag:function(n){return u.indexOf(n)>-1}},f=0,c,s,p;if(r=r===n?"":String(r),u=u===n?"":String(u),i.match.call(u,h))throw new SyntaxError("invalid duplicate regular expression flag");for(r=i.replace.call(r,/^\(\?([\w$]+)\)/,function(n,t){if(i.test.call(/[gy]/,t))throw new SyntaxError("can't use flag g or y in mode modifier");return u=i.replace.call(u+t,h,""),""}),t.forEach(u,/[\s\S]/,function(n){if(w.indexOf(n[0])<0)throw new SyntaxError("invalid regular expression flag "+n[0]);});f<r.length;)c=ut(r,f,a,b),c?(l.push(c.output),f+=c.match[0].length||1):(s=i.exec.call(it[a],r.slice(f)),s?(l.push(s[0]),f+=s[0].length):(p=r.charAt(f),p==="["?a=rt:p==="]"&&(a=e),l.push(p),++f));return v(new RegExp(l.join(""),i.replace.call(u,/[^gimy]+/g,"")),b.hasNamedCapture?b.captureNames:null)},c={on:function(n,t,r){r=r||{},n&&p.push({pattern:o(n,"g"+(l?"y":"")),handler:t,scope:r.scope||e,trigger:r.trigger||null}),r.customFlags&&(w=i.replace.call(w+r.customFlags,h,""))},off:function(){throw new Error("extensibility must be installed before using addToken");}},t.addToken=c.off,t.cache=function(n,i){var r=n+"/"+(i||"");return k[r]||(k[r]=t(n,i))},t.escape=function(n){return i.replace.call(n,/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},t.exec=function(n,t,i,u){var e=o(t,"g"+(u&&l?"y":""),u===!1?"y":""),f;return e.lastIndex=i=i||0,f=r.exec.call(e,n),u&&f&&f.index!==i&&(f=null),t.global&&(t.lastIndex=f?e.lastIndex:0),f},t.forEach=function(n,i,r,u){for(var e=0,o=-1,f;f=t.exec(n,i,e);)r.call(u,f,++o,n,i),e=f.index+(f[0].length||1);return u},t.globalize=function(n){return o(n,"g")},t.install=function(n){n=d(n),!f.natives&&n.natives&&tt(!0),!f.extensibility&&n.extensibility&&b(!0)},t.isInstalled=function(n){return!!f[n]},t.isRegExp=function(n){return s(n,"regexp")},t.matchChain=function(n,i){return function r(n,u){for(var o=i[u].regex?i[u]:{regex:i[u]},f=[],s=function(n){f.push(o.backref?n[o.backref]||"":n[0])},e=0;e<n.length;++e)t.forEach(n[e],o.regex,s);return u===i.length-1||!f.length?f:r(f,u+1)}([n],0)},t.replace=function(i,u,f,e){var c=t.isRegExp(u),s=u,h;return c?(e===n&&u.global&&(e="all"),s=o(u,e==="all"?"g":"",e==="all"?"":"g")):e==="all"&&(s=new RegExp(t.escape(String(u)),"g")),h=r.replace.call(String(i),s,f),c&&u.global&&(u.lastIndex=0),h},t.split=function(n,t,i){return r.split.call(n,t,i)},t.test=function(n,i,r,u){return!!t.exec(n,i,r,u)},t.uninstall=function(n){n=d(n),f.natives&&n.natives&&tt(!1),f.extensibility&&n.extensibility&&b(!1)},t.union=function(n,i){var l=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,o=0,f,h,c=function(n,t,i){var r=h[o-f];if(t){if(++o,r)return"(?<"+r+">"}else if(i)return"\\"+(+i+f);return n},e=[],r,u;if(!(s(n,"array")&&n.length))throw new TypeError("patterns must be a nonempty array");for(u=0;u<n.length;++u)r=n[u],t.isRegExp(r)?(f=o,h=r.xregexp&&r.xregexp.captureNames||[],e.push(t(r.source).source.replace(l,c))):e.push(t.escape(r));return t(e.join("|"),i)},t.version="2.0.0",r.exec=function(t){var r,f,e,o,u;if(this.global||(o=this.lastIndex),r=i.exec.apply(this,arguments),r){if(!ft&&r.length>1&&a(r,"")>-1&&(e=new RegExp(this.source,i.replace.call(g(this),"g","")),i.replace.call(String(t).slice(r.index),e,function(){for(var t=1;t<arguments.length-2;++t)arguments[t]===n&&(r[t]=n)})),this.xregexp&&this.xregexp.captureNames)for(u=1;u<r.length;++u)f=this.xregexp.captureNames[u-1],f&&(r[f]=r[u]);this.global&&!r[0].length&&this.lastIndex>r.index&&(this.lastIndex=r.index)}return this.global||(this.lastIndex=o),r},r.test=function(n){return!!r.exec.call(this,n)},r.match=function(n){if(t.isRegExp(n)){if(n.global){var u=i.match.apply(this,arguments);return n.lastIndex=0,u}}else n=new RegExp(n);return r.exec.call(n,this)},r.replace=function(n,r){var e=t.isRegExp(n),u,f,h,o;return e?(n.xregexp&&(u=n.xregexp.captureNames),n.global||(o=n.lastIndex)):n+="",s(r,"function")?f=i.replace.call(String(this),n,function(){var t=arguments,i;if(u)for(t[0]=new String(t[0]),i=0;i<u.length;++i)u[i]&&(t[0][u[i]]=t[i+1]);return e&&n.global&&(n.lastIndex=t[t.length-2]+t[0].length),r.apply(null,t)}):(h=String(this),f=i.replace.call(h,n,function(){var n=arguments;return i.replace.call(String(r),et,function(t,i,r){var f;if(i){if(f=+i,f<=n.length-3)return n[f]||"";if(f=u?a(u,i):-1,f<0)throw new SyntaxError("backreference to undefined group "+t);return n[f+1]||""}if(r==="$")return"$";if(r==="&"||+r==0)return n[0];if(r==="`")return n[n.length-1].slice(0,n[n.length-2]);if(r==="'")return n[n.length-1].slice(n[n.length-2]+n[0].length);if(r=+r,!isNaN(r)){if(r>n.length-3)throw new SyntaxError("backreference to undefined group "+t);return n[r]||""}throw new SyntaxError("invalid token "+t);})})),e&&(n.lastIndex=n.global?0:o),f},r.split=function(r,u){if(!t.isRegExp(r))return i.split.apply(this,arguments);var e=String(this),h=r.lastIndex,f=[],o=0,s;return u=(u===n?-1:u)>>>0,t.forEach(e,r,function(n){n.index+n[0].length>o&&(f.push(e.slice(o,n.index)),n.length>1&&n.index<e.length&&Array.prototype.push.apply(f,n.slice(1)),s=n[0].length,o=n.index+s)}),o===e.length?(!i.test.call(r,"")||s)&&f.push(""):f.push(e.slice(o)),r.lastIndex=h,f.length>u?f.slice(0,u):f},u=c.on,u(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4})|x(?![\dA-Fa-f]{2}))/,function(n,t){if(n[1]==="B"&&t===e)return n[0];throw new SyntaxError("invalid escape "+n[0]);},{scope:"all"}),u(/\[(\^?)]/,function(n){return n[1]?"[\\s\\S]":"\\b\\B"}),u(/(?:\(\?#[^)]*\))+/,function(n){return i.test.call(nt,n.input.slice(n.index+n[0].length))?"":"(?:)"}),u(/\\k<([\w$]+)>/,function(n){var t=isNaN(n[1])?a(this.captureNames,n[1])+1:+n[1],i=n.index+n[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("backreference to undefined group "+n[0]);return"\\"+t+(i===n.input.length||isNaN(n.input.charAt(i))?"":"(?:)")}),u(/(?:\s+|#.*)+/,function(n){return i.test.call(nt,n.input.slice(n.index+n[0].length))?"":"(?:)"},{trigger:function(){return this.hasFlag("x")},customFlags:"x"}),u(/\./,function(){return"[\\s\\S]"},{trigger:function(){return this.hasFlag("s")},customFlags:"s"}),u(/\(\?P?<([\w$]+)>/,function(n){if(!isNaN(n[1]))throw new SyntaxError("can't use integer as capture name "+n[0]);return this.captureNames.push(n[1]),this.hasNamedCapture=!0,"("}),u(/\\(\d+)/,function(n,t){if(!(t===e&&/^[1-9]/.test(n[1])&&+n[1]<=this.captureNames.length)&&n[1]!=="0")throw new SyntaxError("can't use octal escape or backreference to undefined group "+n[0]);return n[0]},{scope:"all"}),u(/\((?!\?)/,function(){return this.hasFlag("n")?"(?:":(this.captureNames.push(null),"(")},{customFlags:"n"}),typeof exports!="undefined"&&(exports.XRegExp=t),t}();
+//XRegExp Unicode Base 1.0.0
+(function(n){"use strict";function i(n){return n.replace(/[- _]+/g,"").toLowerCase()}function s(n){return n.replace(/\w{4}/g,"\\u$&")}function u(n){while(n.length<4)n="0"+n;return n}function f(n){return parseInt(n,16)}function r(n){return parseInt(n,10).toString(16)}function o(t){var e=[],i=-1,o;return n.forEach(t,/\\u(\w{4})(?:-\\u(\w{4}))?/,function(n){o=f(n[1]),o>i+1&&(e.push("\\u"+u(r(i+1))),o>i+2&&e.push("-\\u"+u(r(o-1)))),i=f(n[2]||n[1])}),i<65535&&(e.push("\\u"+u(r(i+1))),i<65534&&e.push("-\\uFFFF")),e.join("")}function e(n){return t["^"+n]||(t["^"+n]=o(t[n]))}var t={};n.install("extensibility"),n.addUnicodePackage=function(r,u){var f;if(!n.isInstalled("extensibility"))throw new Error("extensibility must be installed before adding Unicode packages");if(r)for(f in r)r.hasOwnProperty(f)&&(t[i(f)]=s(r[f]));if(u)for(f in u)u.hasOwnProperty(f)&&(t[i(u[f])]=t[i(f)])},n.addUnicodePackage({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05270531-055605590561-058705D0-05EA05F0-05F20620-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280840-085808A008A2-08AC0904-0939093D09500958-09610971-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDAAE0-AAEAAAF2-AAF4AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC"},{L:"Letter"}),n.addToken(/\\([pP]){(\^?)([^}]*)}/,function(n,r){var f=n[1]==="P"||n[2]?"^":"",u=i(n[3]);if(n[1]==="P"&&n[2])throw new SyntaxError("invalid double negation \\P{^");if(!t.hasOwnProperty(u))throw new SyntaxError("invalid or unknown Unicode property "+n[0]);return r==="class"?f?e(u):t[u]:"["+f+t[u]+"]"},{scope:"all"})})(XRegExp);
+//XRegExp Unicode Categories 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");n.install("extensibility"),n.addUnicodePackage({Ll:"0061-007A00B500DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F05210523052505270561-05871D00-1D2B1D6B-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7B2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2CF32D00-2D252D272D2DA641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA661A663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CA78EA791A793A7A1A7A3A7A5A7A7A7A9A7FAFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E05200522052405260531-055610A0-10C510C710CD1E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CED2CF2A640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA660A662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BA78DA790A792A7A0A7A2A7A4A7A6A7A8A7AAFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D6A1D781D9B-1DBF2071207F2090-209C2C7C2C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A7F8A7F9A9CFAA70AADDAAF3AAF4FF70FF9EFF9F",Lo:"00AA00BA01BB01C0-01C3029405D0-05EA05F0-05F20620-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150840-085808A008A2-08AC0904-0939093D09500958-09610972-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA10FD-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF11CF51CF62135-21382D30-2D672D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCAAE0-AAEAAAF2AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065F067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0859-085B08E4-08FE0900-0903093A-093C093E-094F0951-0957096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F8D-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135D-135F1712-17141732-1734175217531772177317B4-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAD1BE6-1BF31C24-1C371CD0-1CD21CD4-1CE81CED1CF2-1CF41DC0-1DE61DFC-1DFF20D0-20F02CEF-2CF12D7F2DE0-2DFF302A-302F3099309AA66F-A672A674-A67DA69FA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1AAEB-AAEFAAF5AAF6ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065F067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0859-085B08E4-08FE0900-0902093A093C0941-0948094D0951-095709620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F8D-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135D-135F1712-17141732-1734175217531772177317B417B517B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91BAB1BE61BE81BE91BED1BEF-1BF11C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1CF41DC0-1DE61DFC-1DFF20D0-20DC20E120E5-20F02CEF-2CF12D7F2DE0-2DFF302A-302D3099309AA66FA674-A67DA69FA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1AAECAAEDAAF6ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093B093E-09400949-094C094E094F0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1BAC1BAD1BE71BEA-1BEC1BEE1BF21BF31C24-1C2B1C341C351CE11CF21CF3302E302FA823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BAAEBAAEEAAEFAAF5ABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048920DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0B72-0B770BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293248-324F3251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19D91A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90B72-0B770BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F919DA20702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293248-324F3251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100A700AB00B600B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E085E0964096509700AF00DF40E4F0E5A0E5B0F04-0F120F140F3A-0F3D0F850FD0-0FD40FD90FDA104A-104F10FB1360-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A194419451A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601BFC-1BFF1C3B-1C3F1C7E1C7F1CC0-1CC71CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2D702E00-2E2E2E30-2E3B3001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFAAF0AAF1ABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A2E3A2E3B301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100A700B600B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E085E0964096509700AF00DF40E4F0E5A0E5B0F04-0F120F140F850FD0-0FD40FD90FDA104A-104F10FB1360-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A194419451A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601BFC-1BFF1C3B-1C3F1C7E1C7F1CC0-1CC71CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2D702E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E30-2E393001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFAAF0AAF1ABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A600A800A900AC00AE-00B100B400B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F60482058F0606-0608060B060E060F06DE06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0D790E3F0F01-0F030F130F15-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F1390-139917DB194019DE-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B9210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23F32400-24262440-244A249C-24E92500-26FF2701-27672794-27C427C7-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-324732503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FBB2-FBC1FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C21182140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5058F060B09F209F309FB0AF10BF90E3F17DB20A0-20B9A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFBB2-FBC1FF3EFF40FFE3",So:"00A600A900AE00B00482060E060F06DE06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0D790F01-0F030F130F15-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F1390-1399194019DE-19FF1B61-1B6A1B74-1B7C210021012103-210621082109211421162117211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23F32400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26FF2701-27672794-27BF2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-324732503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20528-05300557055805600588058B-058E059005C8-05CF05EB-05EF05F5-0605061C061D06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F085C085D085F-089F08A108AD-08E308FF097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B78-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D3B0D3C0D450D490D4F-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EE0-0EFF0F480F6D-0F700F980FBD0FCD0FDB-0FFF10C610C8-10CC10CE10CF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B135C137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BF4-1BFB1C38-1C3A1C4A-1C4C1C80-1CBF1CC8-1CCF1CF7-1CFF1DE7-1DFB1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F209D-209F20BA-20CF20F1-20FF218A-218F23F4-23FF2427-243F244B-245F27002B4D-2B4F2B5A-2BFF2C2F2C5F2CF4-2CF82D262D28-2D2C2D2E2D2F2D68-2D6E2D71-2D7E2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E3C-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31BB-31BF31E4-31EF321F32FF4DB6-4DBF9FCD-9FFFA48D-A48FA4C7-A4CFA62C-A63FA698-A69EA6F8-A6FFA78FA794-A79FA7AB-A7F7A82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAF7-AB00AB07AB08AB0FAB10AB17-AB1FAB27AB2F-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBC2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060406DD070F200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20528-05300557055805600588058B-058E059005C8-05CF05EB-05EF05F5-05FF0605061C061D070E074B074C07B2-07BF07FB-07FF082E082F083F085C085D085F-089F08A108AD-08E308FF097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B78-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D3B0D3C0D450D490D4F-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EE0-0EFF0F480F6D-0F700F980FBD0FCD0FDB-0FFF10C610C8-10CC10CE10CF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B135C137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BF4-1BFB1C38-1C3A1C4A-1C4C1C80-1CBF1CC8-1CCF1CF7-1CFF1DE7-1DFB1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F209D-209F20BA-20CF20F1-20FF218A-218F23F4-23FF2427-243F244B-245F27002B4D-2B4F2B5A-2BFF2C2F2C5F2CF4-2CF82D262D28-2D2C2D2E2D2F2D68-2D6E2D71-2D7E2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E3C-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31BB-31BF31E4-31EF321F32FF4DB6-4DBF9FCD-9FFFA48D-A48FA4C7-A4CFA62C-A63FA698-A69EA6F8-A6FFA78FA794-A79FA7AB-A7F7A82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAF7-AB00AB07AB08AB0FAB10AB17-AB1FAB27AB2F-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBC2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"},{Ll:"Lowercase_Letter",Lu:"Uppercase_Letter",Lt:"Titlecase_Letter",Lm:"Modifier_Letter",Lo:"Other_Letter",M:"Mark",Mn:"Nonspacing_Mark",Mc:"Spacing_Mark",Me:"Enclosing_Mark",N:"Number",Nd:"Decimal_Number",Nl:"Letter_Number",No:"Other_Number",P:"Punctuation",Pd:"Dash_Punctuation",Ps:"Open_Punctuation",Pe:"Close_Punctuation",Pi:"Initial_Punctuation",Pf:"Final_Punctuation",Pc:"Connector_Punctuation",Po:"Other_Punctuation",S:"Symbol",Sm:"Math_Symbol",Sc:"Currency_Symbol",Sk:"Modifier_Symbol",So:"Other_Symbol",Z:"Separator",Zs:"Space_Separator",Zl:"Line_Separator",Zp:"Paragraph_Separator",C:"Other",Cc:"Control",Cf:"Format",Co:"Private_Use",Cs:"Surrogate",Cn:"Unassigned"})})(XRegExp);
+//XRegExp Unicode Scripts 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");n.install("extensibility"),n.addUnicodePackage({Arabic:"0600-06040606-060B060D-061A061E0620-063F0641-064A0656-065E066A-066F0671-06DC06DE-06FF0750-077F08A008A2-08AC08E4-08FEFB50-FBC1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFCFE70-FE74FE76-FEFC",Armenian:"0531-05560559-055F0561-0587058A058FFB13-FB17",Balinese:"1B00-1B4B1B50-1B7C",Bamum:"A6A0-A6F7",Batak:"1BC0-1BF31BFC-1BFF",Bengali:"0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BC-09C409C709C809CB-09CE09D709DC09DD09DF-09E309E6-09FB",Bopomofo:"02EA02EB3105-312D31A0-31BA",Braille:"2800-28FF",Buginese:"1A00-1A1B1A1E1A1F",Buhid:"1740-1753",Canadian_Aboriginal:"1400-167F18B0-18F5",Cham:"AA00-AA36AA40-AA4DAA50-AA59AA5C-AA5F",Cherokee:"13A0-13F4",Common:"0000-0040005B-0060007B-00A900AB-00B900BB-00BF00D700F702B9-02DF02E5-02E902EC-02FF0374037E038503870589060C061B061F06400660-066906DD096409650E3F0FD5-0FD810FB16EB-16ED173517361802180318051CD31CE11CE9-1CEC1CEE-1CF31CF51CF62000-200B200E-2064206A-20702074-207E2080-208E20A0-20B92100-21252127-2129212C-21312133-214D214F-215F21892190-23F32400-24262440-244A2460-26FF2701-27FF2900-2B4C2B50-2B592E00-2E3B2FF0-2FFB3000-300430063008-30203030-3037303C-303F309B309C30A030FB30FC3190-319F31C0-31E33220-325F327F-32CF3358-33FF4DC0-4DFFA700-A721A788-A78AA830-A839FD3EFD3FFDFDFE10-FE19FE30-FE52FE54-FE66FE68-FE6BFEFFFF01-FF20FF3B-FF40FF5B-FF65FF70FF9EFF9FFFE0-FFE6FFE8-FFEEFFF9-FFFD",Coptic:"03E2-03EF2C80-2CF32CF9-2CFF",Cyrillic:"0400-04840487-05271D2B1D782DE0-2DFFA640-A697A69F",Devanagari:"0900-09500953-09630966-09770979-097FA8E0-A8FB",Ethiopic:"1200-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135D-137C1380-13992D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDEAB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2E",Georgian:"10A0-10C510C710CD10D0-10FA10FC-10FF2D00-2D252D272D2D",Glagolitic:"2C00-2C2E2C30-2C5E",Greek:"0370-03730375-0377037A-037D038403860388-038A038C038E-03A103A3-03E103F0-03FF1D26-1D2A1D5D-1D611D66-1D6A1DBF1F00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FC41FC6-1FD31FD6-1FDB1FDD-1FEF1FF2-1FF41FF6-1FFE2126",Gujarati:"0A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABC-0AC50AC7-0AC90ACB-0ACD0AD00AE0-0AE30AE6-0AF1",Gurmukhi:"0A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3C0A3E-0A420A470A480A4B-0A4D0A510A59-0A5C0A5E0A66-0A75",Han:"2E80-2E992E9B-2EF32F00-2FD5300530073021-30293038-303B3400-4DB54E00-9FCCF900-FA6DFA70-FAD9",Hangul:"1100-11FF302E302F3131-318E3200-321E3260-327EA960-A97CAC00-D7A3D7B0-D7C6D7CB-D7FBFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Hanunoo:"1720-1734",Hebrew:"0591-05C705D0-05EA05F0-05F4FB1D-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FB4F",Hiragana:"3041-3096309D-309F",Inherited:"0300-036F04850486064B-0655065F0670095109521CD0-1CD21CD4-1CE01CE2-1CE81CED1CF41DC0-1DE61DFC-1DFF200C200D20D0-20F0302A-302D3099309AFE00-FE0FFE20-FE26",Javanese:"A980-A9CDA9CF-A9D9A9DEA9DF",Kannada:"0C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBC-0CC40CC6-0CC80CCA-0CCD0CD50CD60CDE0CE0-0CE30CE6-0CEF0CF10CF2",Katakana:"30A1-30FA30FD-30FF31F0-31FF32D0-32FE3300-3357FF66-FF6FFF71-FF9D",Kayah_Li:"A900-A92F",Khmer:"1780-17DD17E0-17E917F0-17F919E0-19FF",Lao:"0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60EC8-0ECD0ED0-0ED90EDC-0EDF",Latin:"0041-005A0061-007A00AA00BA00C0-00D600D8-00F600F8-02B802E0-02E41D00-1D251D2C-1D5C1D62-1D651D6B-1D771D79-1DBE1E00-1EFF2071207F2090-209C212A212B2132214E2160-21882C60-2C7FA722-A787A78B-A78EA790-A793A7A0-A7AAA7F8-A7FFFB00-FB06FF21-FF3AFF41-FF5A",Lepcha:"1C00-1C371C3B-1C491C4D-1C4F",Limbu:"1900-191C1920-192B1930-193B19401944-194F",Lisu:"A4D0-A4FF",Malayalam:"0D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4E0D570D60-0D630D66-0D750D79-0D7F",Mandaic:"0840-085B085E",Meetei_Mayek:"AAE0-AAF6ABC0-ABEDABF0-ABF9",Mongolian:"1800180118041806-180E1810-18191820-18771880-18AA",Myanmar:"1000-109FAA60-AA7B",New_Tai_Lue:"1980-19AB19B0-19C919D0-19DA19DE19DF",Nko:"07C0-07FA",Ogham:"1680-169C",Ol_Chiki:"1C50-1C7F",Oriya:"0B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3C-0B440B470B480B4B-0B4D0B560B570B5C0B5D0B5F-0B630B66-0B77",Phags_Pa:"A840-A877",Rejang:"A930-A953A95F",Runic:"16A0-16EA16EE-16F0",Samaritan:"0800-082D0830-083E",Saurashtra:"A880-A8C4A8CE-A8D9",Sinhala:"0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCA0DCF-0DD40DD60DD8-0DDF0DF2-0DF4",Sundanese:"1B80-1BBF1CC0-1CC7",Syloti_Nagri:"A800-A82B",Syriac:"0700-070D070F-074A074D-074F",Tagalog:"1700-170C170E-1714",Tagbanwa:"1760-176C176E-177017721773",Tai_Le:"1950-196D1970-1974",Tai_Tham:"1A20-1A5E1A60-1A7C1A7F-1A891A90-1A991AA0-1AAD",Tai_Viet:"AA80-AAC2AADB-AADF",Tamil:"0B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCD0BD00BD70BE6-0BFA",Telugu:"0C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4D0C550C560C580C590C60-0C630C66-0C6F0C78-0C7F",Thaana:"0780-07B1",Thai:"0E01-0E3A0E40-0E5B",Tibetan:"0F00-0F470F49-0F6C0F71-0F970F99-0FBC0FBE-0FCC0FCE-0FD40FD90FDA",Tifinagh:"2D30-2D672D6F2D702D7F",Vai:"A500-A62B",Yi:"A000-A48CA490-A4C6"})})(XRegExp);
+//XRegExp Unicode Blocks 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Blocks");n.install("extensibility"),n.addUnicodePackage({InBasic_Latin:"0000-007F",InLatin_1_Supplement:"0080-00FF",InLatin_Extended_A:"0100-017F",InLatin_Extended_B:"0180-024F",InIPA_Extensions:"0250-02AF",InSpacing_Modifier_Letters:"02B0-02FF",InCombining_Diacritical_Marks:"0300-036F",InGreek_and_Coptic:"0370-03FF",InCyrillic:"0400-04FF",InCyrillic_Supplement:"0500-052F",InArmenian:"0530-058F",InHebrew:"0590-05FF",InArabic:"0600-06FF",InSyriac:"0700-074F",InArabic_Supplement:"0750-077F",InThaana:"0780-07BF",InNKo:"07C0-07FF",InSamaritan:"0800-083F",InMandaic:"0840-085F",InArabic_Extended_A:"08A0-08FF",InDevanagari:"0900-097F",InBengali:"0980-09FF",InGurmukhi:"0A00-0A7F",InGujarati:"0A80-0AFF",InOriya:"0B00-0B7F",InTamil:"0B80-0BFF",InTelugu:"0C00-0C7F",InKannada:"0C80-0CFF",InMalayalam:"0D00-0D7F",InSinhala:"0D80-0DFF",InThai:"0E00-0E7F",InLao:"0E80-0EFF",InTibetan:"0F00-0FFF",InMyanmar:"1000-109F",InGeorgian:"10A0-10FF",InHangul_Jamo:"1100-11FF",InEthiopic:"1200-137F",InEthiopic_Supplement:"1380-139F",InCherokee:"13A0-13FF",InUnified_Canadian_Aboriginal_Syllabics:"1400-167F",InOgham:"1680-169F",InRunic:"16A0-16FF",InTagalog:"1700-171F",InHanunoo:"1720-173F",InBuhid:"1740-175F",InTagbanwa:"1760-177F",InKhmer:"1780-17FF",InMongolian:"1800-18AF",InUnified_Canadian_Aboriginal_Syllabics_Extended:"18B0-18FF",InLimbu:"1900-194F",InTai_Le:"1950-197F",InNew_Tai_Lue:"1980-19DF",InKhmer_Symbols:"19E0-19FF",InBuginese:"1A00-1A1F",InTai_Tham:"1A20-1AAF",InBalinese:"1B00-1B7F",InSundanese:"1B80-1BBF",InBatak:"1BC0-1BFF",InLepcha:"1C00-1C4F",InOl_Chiki:"1C50-1C7F",InSundanese_Supplement:"1CC0-1CCF",InVedic_Extensions:"1CD0-1CFF",InPhonetic_Extensions:"1D00-1D7F",InPhonetic_Extensions_Supplement:"1D80-1DBF",InCombining_Diacritical_Marks_Supplement:"1DC0-1DFF",InLatin_Extended_Additional:"1E00-1EFF",InGreek_Extended:"1F00-1FFF",InGeneral_Punctuation:"2000-206F",InSuperscripts_and_Subscripts:"2070-209F",InCurrency_Symbols:"20A0-20CF",InCombining_Diacritical_Marks_for_Symbols:"20D0-20FF",InLetterlike_Symbols:"2100-214F",InNumber_Forms:"2150-218F",InArrows:"2190-21FF",InMathematical_Operators:"2200-22FF",InMiscellaneous_Technical:"2300-23FF",InControl_Pictures:"2400-243F",InOptical_Character_Recognition:"2440-245F",InEnclosed_Alphanumerics:"2460-24FF",InBox_Drawing:"2500-257F",InBlock_Elements:"2580-259F",InGeometric_Shapes:"25A0-25FF",InMiscellaneous_Symbols:"2600-26FF",InDingbats:"2700-27BF",InMiscellaneous_Mathematical_Symbols_A:"27C0-27EF",InSupplemental_Arrows_A:"27F0-27FF",InBraille_Patterns:"2800-28FF",InSupplemental_Arrows_B:"2900-297F",InMiscellaneous_Mathematical_Symbols_B:"2980-29FF",InSupplemental_Mathematical_Operators:"2A00-2AFF",InMiscellaneous_Symbols_and_Arrows:"2B00-2BFF",InGlagolitic:"2C00-2C5F",InLatin_Extended_C:"2C60-2C7F",InCoptic:"2C80-2CFF",InGeorgian_Supplement:"2D00-2D2F",InTifinagh:"2D30-2D7F",InEthiopic_Extended:"2D80-2DDF",InCyrillic_Extended_A:"2DE0-2DFF",InSupplemental_Punctuation:"2E00-2E7F",InCJK_Radicals_Supplement:"2E80-2EFF",InKangxi_Radicals:"2F00-2FDF",InIdeographic_Description_Characters:"2FF0-2FFF",InCJK_Symbols_and_Punctuation:"3000-303F",InHiragana:"3040-309F",InKatakana:"30A0-30FF",InBopomofo:"3100-312F",InHangul_Compatibility_Jamo:"3130-318F",InKanbun:"3190-319F",InBopomofo_Extended:"31A0-31BF",InCJK_Strokes:"31C0-31EF",InKatakana_Phonetic_Extensions:"31F0-31FF",InEnclosed_CJK_Letters_and_Months:"3200-32FF",InCJK_Compatibility:"3300-33FF",InCJK_Unified_Ideographs_Extension_A:"3400-4DBF",InYijing_Hexagram_Symbols:"4DC0-4DFF",InCJK_Unified_Ideographs:"4E00-9FFF",InYi_Syllables:"A000-A48F",InYi_Radicals:"A490-A4CF",InLisu:"A4D0-A4FF",InVai:"A500-A63F",InCyrillic_Extended_B:"A640-A69F",InBamum:"A6A0-A6FF",InModifier_Tone_Letters:"A700-A71F",InLatin_Extended_D:"A720-A7FF",InSyloti_Nagri:"A800-A82F",InCommon_Indic_Number_Forms:"A830-A83F",InPhags_pa:"A840-A87F",InSaurashtra:"A880-A8DF",InDevanagari_Extended:"A8E0-A8FF",InKayah_Li:"A900-A92F",InRejang:"A930-A95F",InHangul_Jamo_Extended_A:"A960-A97F",InJavanese:"A980-A9DF",InCham:"AA00-AA5F",InMyanmar_Extended_A:"AA60-AA7F",InTai_Viet:"AA80-AADF",InMeetei_Mayek_Extensions:"AAE0-AAFF",InEthiopic_Extended_A:"AB00-AB2F",InMeetei_Mayek:"ABC0-ABFF",InHangul_Syllables:"AC00-D7AF",InHangul_Jamo_Extended_B:"D7B0-D7FF",InHigh_Surrogates:"D800-DB7F",InHigh_Private_Use_Surrogates:"DB80-DBFF",InLow_Surrogates:"DC00-DFFF",InPrivate_Use_Area:"E000-F8FF",InCJK_Compatibility_Ideographs:"F900-FAFF",InAlphabetic_Presentation_Forms:"FB00-FB4F",InArabic_Presentation_Forms_A:"FB50-FDFF",InVariation_Selectors:"FE00-FE0F",InVertical_Forms:"FE10-FE1F",InCombining_Half_Marks:"FE20-FE2F",InCJK_Compatibility_Forms:"FE30-FE4F",InSmall_Form_Variants:"FE50-FE6F",InArabic_Presentation_Forms_B:"FE70-FEFF",InHalfwidth_and_Fullwidth_Forms:"FF00-FFEF",InSpecials:"FFF0-FFFF"})})(XRegExp);
+//XRegExp Unicode Properties 1.0.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");n.install("extensibility"),n.addUnicodePackage({Alphabetic:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE03450370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05270531-055605590561-058705B0-05BD05BF05C105C205C405C505C705D0-05EA05F0-05F20610-061A0620-06570659-065F066E-06D306D5-06DC06E1-06E806ED-06EF06FA-06FC06FF0710-073F074D-07B107CA-07EA07F407F507FA0800-0817081A-082C0840-085808A008A2-08AC08E4-08E908F0-08FE0900-093B093D-094C094E-09500955-09630971-09770979-097F0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BD-09C409C709C809CB09CC09CE09D709DC09DD09DF-09E309F009F10A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3E-0A420A470A480A4B0A4C0A510A59-0A5C0A5E0A70-0A750A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD-0AC50AC7-0AC90ACB0ACC0AD00AE0-0AE30B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D-0B440B470B480B4B0B4C0B560B570B5C0B5D0B5F-0B630B710B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCC0BD00BD70C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4C0C550C560C580C590C60-0C630C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD-0CC40CC6-0CC80CCA-0CCC0CD50CD60CDE0CE0-0CE30CF10CF20D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4C0D4E0D570D60-0D630D7A-0D7F0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCF-0DD40DD60DD8-0DDF0DF20DF30E01-0E3A0E40-0E460E4D0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60ECD0EDC-0EDF0F000F40-0F470F49-0F6C0F71-0F810F88-0F970F99-0FBC1000-10361038103B-103F1050-10621065-1068106E-1086108E109C109D10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135F1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA16EE-16F01700-170C170E-17131720-17331740-17531760-176C176E-1770177217731780-17B317B6-17C817D717DC1820-18771880-18AA18B0-18F51900-191C1920-192B1930-19381950-196D1970-19741980-19AB19B0-19C91A00-1A1B1A20-1A5E1A61-1A741AA71B00-1B331B35-1B431B45-1B4B1B80-1BA91BAC-1BAF1BBA-1BE51BE7-1BF11C00-1C351C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF31CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E2160-218824B6-24E92C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2DE0-2DFF2E2F3005-30073021-30293031-30353038-303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA674-A67BA67F-A697A69F-A6EFA717-A71FA722-A788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A827A840-A873A880-A8C3A8F2-A8F7A8FBA90A-A92AA930-A952A960-A97CA980-A9B2A9B4-A9BFA9CFAA00-AA36AA40-AA4DAA60-AA76AA7AAA80-AABEAAC0AAC2AADB-AADDAAE0-AAEFAAF2-AAF5AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABEAAC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1D-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Uppercase:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E05200522052405260531-055610A0-10C510C710CD1E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F21452160-216F218324B6-24CF2C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CED2CF2A640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA660A662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BA78DA790A792A7A0A7A2A7A4A7A6A7A8A7AAFF21-FF3A",Lowercase:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02B802C002C102E0-02E40345037103730377037A-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F05210523052505270561-05871D00-1DBF1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF72071207F2090-209C210A210E210F2113212F21342139213C213D2146-2149214E2170-217F218424D0-24E92C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7D2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2CF32D00-2D252D272D2DA641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA661A663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76F-A778A77AA77CA77FA781A783A785A787A78CA78EA791A793A7A1A7A3A7A5A7A7A7A9A7F8-A7FAFB00-FB06FB13-FB17FF41-FF5A",White_Space:"0009-000D0020008500A01680180E2000-200A20282029202F205F3000",Noncharacter_Code_Point:"FDD0-FDEFFFFEFFFF",Default_Ignorable_Code_Point:"00AD034F115F116017B417B5180B-180D200B-200F202A-202E2060-206F3164FE00-FE0FFEFFFFA0FFF0-FFF8",Any:"0000-FFFF",Ascii:"0000-007F",Assigned:"0000-0377037A-037E0384-038A038C038E-03A103A3-05270531-05560559-055F0561-05870589058A058F0591-05C705D0-05EA05F0-05F40600-06040606-061B061E-070D070F-074A074D-07B107C0-07FA0800-082D0830-083E0840-085B085E08A008A2-08AC08E4-08FE0900-09770979-097F0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BC-09C409C709C809CB-09CE09D709DC09DD09DF-09E309E6-09FB0A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3C0A3E-0A420A470A480A4B-0A4D0A510A59-0A5C0A5E0A66-0A750A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABC-0AC50AC7-0AC90ACB-0ACD0AD00AE0-0AE30AE6-0AF10B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3C-0B440B470B480B4B-0B4D0B560B570B5C0B5D0B5F-0B630B66-0B770B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCD0BD00BD70BE6-0BFA0C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4D0C550C560C580C590C60-0C630C66-0C6F0C78-0C7F0C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBC-0CC40CC6-0CC80CCA-0CCD0CD50CD60CDE0CE0-0CE30CE6-0CEF0CF10CF20D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4E0D570D60-0D630D66-0D750D79-0D7F0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCA0DCF-0DD40DD60DD8-0DDF0DF2-0DF40E01-0E3A0E3F-0E5B0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60EC8-0ECD0ED0-0ED90EDC-0EDF0F00-0F470F49-0F6C0F71-0F970F99-0FBC0FBE-0FCC0FCE-0FDA1000-10C510C710CD10D0-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135D-137C1380-139913A0-13F41400-169C16A0-16F01700-170C170E-17141720-17361740-17531760-176C176E-1770177217731780-17DD17E0-17E917F0-17F91800-180E1810-18191820-18771880-18AA18B0-18F51900-191C1920-192B1930-193B19401944-196D1970-19741980-19AB19B0-19C919D0-19DA19DE-1A1B1A1E-1A5E1A60-1A7C1A7F-1A891A90-1A991AA0-1AAD1B00-1B4B1B50-1B7C1B80-1BF31BFC-1C371C3B-1C491C4D-1C7F1CC0-1CC71CD0-1CF61D00-1DE61DFC-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FC41FC6-1FD31FD6-1FDB1FDD-1FEF1FF2-1FF41FF6-1FFE2000-2064206A-20712074-208E2090-209C20A0-20B920D0-20F02100-21892190-23F32400-24262440-244A2460-26FF2701-2B4C2B50-2B592C00-2C2E2C30-2C5E2C60-2CF32CF9-2D252D272D2D2D30-2D672D6F2D702D7F-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2DE0-2E3B2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB3000-303F3041-30963099-30FF3105-312D3131-318E3190-31BA31C0-31E331F0-321E3220-32FE3300-4DB54DC0-9FCCA000-A48CA490-A4C6A4D0-A62BA640-A697A69F-A6F7A700-A78EA790-A793A7A0-A7AAA7F8-A82BA830-A839A840-A877A880-A8C4A8CE-A8D9A8E0-A8FBA900-A953A95F-A97CA980-A9CDA9CF-A9D9A9DEA9DFAA00-AA36AA40-AA4DAA50-AA59AA5C-AA7BAA80-AAC2AADB-AAF6AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABEDABF0-ABF9AC00-D7A3D7B0-D7C6D7CB-D7FBD800-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1D-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBC1FBD3-FD3FFD50-FD8FFD92-FDC7FDF0-FDFDFE00-FE19FE20-FE26FE30-FE52FE54-FE66FE68-FE6BFE70-FE74FE76-FEFCFEFFFF01-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDCFFE0-FFE6FFE8-FFEEFFF9-FFFD"})})(XRegExp);
+//XRegExp.matchRecursive 0.2.0
+(function(n){"use strict";function t(n,t,i,r){return{value:n,name:t,start:i,end:r}}n.matchRecursive=function(i,r,u,f,e){f=f||"",e=e||{};var g=f.indexOf("g")>-1,nt=f.indexOf("y")>-1,d=f.replace(/y/g,""),y=e.escapeChar,o=e.valueNames,v=[],b=0,h=0,s=0,c=0,p,w,l,a,k;if(r=n(r,d),u=n(u,d),y){if(y.length>1)throw new SyntaxError("can't use more than one escape character");y=n.escape(y),k=new RegExp("(?:"+y+"[\\S\\s]|(?:(?!"+n.union([r,u]).source+")[^"+y+"])+)+",f.replace(/[^im]+/g,""))}for(;;){if(y&&(s+=(n.exec(i,k,s,"sticky")||[""])[0].length),l=n.exec(i,r,s),a=n.exec(i,u,s),l&&a&&(l.index<=a.index?a=null:l=null),l||a)h=(l||a).index,s=h+(l||a)[0].length;else if(!b)break;if(nt&&!b&&h>c)break;if(l)b||(p=h,w=s),++b;else if(a&&b){if(!--b&&(o?(o[0]&&p>c&&v.push(t(o[0],i.slice(c,p),c,p)),o[1]&&v.push(t(o[1],i.slice(p,w),p,w)),o[2]&&v.push(t(o[2],i.slice(w,h),w,h)),o[3]&&v.push(t(o[3],i.slice(h,s),h,s))):v.push(i.slice(w,h)),c=s,!g))break}else throw new Error("string contains unbalanced delimiters");h===s&&++s}return g&&!nt&&o&&o[0]&&i.length>c&&v.push(t(o[0],i.slice(c),c,i.length)),v}})(XRegExp);
+//XRegExp.build 0.1.0
+(function(n){"use strict";function u(n){var i=/^(?:\(\?:\))?\^/,t=/\$(?:\(\?:\))?$/;return t.test(n.replace(/\\[\s\S]/g,""))?n.replace(i,"").replace(t,""):n}function t(t){return n.isRegExp(t)?t.xregexp&&!t.xregexp.isNative?t:n(t.source):n(t)}var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,r=n.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,i],"g");n.build=function(f,e,o){var w=/^\(\?([\w$]+)\)/.exec(f),l={},s=0,v,h=0,p=[0],y,a,c;w&&(o=o||"",w[1].replace(/./g,function(n){o+=o.indexOf(n)>-1?"":n}));for(c in e)e.hasOwnProperty(c)&&(a=t(e[c]),l[c]={pattern:u(a.source),names:a.xregexp.captureNames||[]});return f=t(f),y=f.xregexp.captureNames||[],f=f.source.replace(r,function(n,t,r,u,f){var o=t||r,e,c;if(o){if(!l.hasOwnProperty(o))throw new ReferenceError("undefined property "+n);return t?(e=y[h],p[++h]=++s,c="(?<"+(e||o)+">"):c="(?:",v=s,c+l[o].pattern.replace(i,function(n,t,i){if(t){if(e=l[o].names[s-v],++s,e)return"(?<"+e+">"}else if(i)return"\\"+(+i+v);return n})+")"}if(u){if(e=y[h],p[++h]=++s,e)return"(?<"+e+">"}else if(f)return"\\"+p[+f];return n}),n(f,o)}})(XRegExp);
+//XRegExp Prototype Methods 1.0.0
+(function(n){"use strict";function t(n,t){for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i])}t(n.prototype,{apply:function(n,t){return this.test(t[0])},call:function(n,t){return this.test(t)},forEach:function(t,i,r){return n.forEach(t,this,i,r)},globalize:function(){return n.globalize(this)},xexec:function(t,i,r){return n.exec(t,this,i,r)},xtest:function(t,i,r){return n.test(t,this,i,r)}})})(XRegExp)
diff --git a/tbc/static/admin/locale/af/LC_MESSAGES/django.mo b/tbc/static/admin/locale/af/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..81c557a
--- /dev/null
+++ b/tbc/static/admin/locale/af/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/af/LC_MESSAGES/django.po b/tbc/static/admin/locale/af/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fb72e55
--- /dev/null
+++ b/tbc/static/admin/locale/af/LC_MESSAGES/django.po
@@ -0,0 +1,646 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Christopher Penkin <chris.penkin@gmail.com>, 2012
+# Piet Delport <pjdelport@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/"
+"af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Het %(count)d %(items)s suksesvol geskrap."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kan %(name)s nie skrap nie"
+
+msgid "Are you sure?"
+msgstr "Is jy seker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Skrap gekose %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Alles"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Geen"
+
+msgid "Unknown"
+msgstr "Onbekend"
+
+msgid "Any date"
+msgstr "Enige datum"
+
+msgid "Today"
+msgstr "Vandag"
+
+msgid "Past 7 days"
+msgstr "Vorige 7 dae"
+
+msgid "This month"
+msgstr "Hierdie maand"
+
+msgid "This year"
+msgstr "Hierdie jaar"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Aksie:"
+
+msgid "action time"
+msgstr "aksie tyd"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "objek id"
+
+msgid "object repr"
+msgstr "objek repr"
+
+msgid "action flag"
+msgstr "aksie vlag"
+
+msgid "change message"
+msgstr "verandering boodskap"
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Het \"%(object)s\" bygevoeg."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Het \"%(object)s\" verander - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Het \"%(object)s\" geskrap."
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Het %s verander."
+
+msgid "and"
+msgstr "en"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Het %(name)s \"%(object)s\" bygevoeg."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Het %(list)s vir %(name)s \"%(object)s\" verander."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Het %(name)s \"%(object)s\" geskrap."
+
+msgid "No fields changed."
+msgstr "Geen velde verander nie."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Die %(name)s \"%(obj)s\" was suksesvol verander. Jy mag dit weereens "
+"hieronder wysig."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Die %(name)s \"%(obj)s\" was suksesvol bygevoeg."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Die %(name)s \"%(obj)s\" was suksesvol verander."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Items moet gekies word om aksies op hulle uit te voer. Geen items is "
+"verander."
+
+msgid "No action selected."
+msgstr "Geen aksie gekies nie."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Die %(name)s \"%(obj)s\" was suksesvol geskrap."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s voorwerp met primêre sleutel %(key)r bestaan ​​nie."
+
+#, python-format
+msgid "Add %s"
+msgstr "Voeg %s by"
+
+#, python-format
+msgid "Change %s"
+msgstr "Verander %s"
+
+msgid "Database error"
+msgstr "Databasis fout"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s was suksesvol verander."
+msgstr[1] "%(count)s %(name)s was suksesvol verander."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s gekies"
+msgstr[1] "Al %(total_count)s gekies"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 uit %(cnt)s gekies"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Verander geskiedenis: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django werf admin"
+
+msgid "Django administration"
+msgstr "Django administrasie"
+
+msgid "Site administration"
+msgstr "Werf administrasie"
+
+msgid "Log in"
+msgstr "Teken in"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Bladsy nie gevind nie"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ons is jammer, maar die aangevraagde bladsy kon nie gevind word nie."
+
+msgid "Home"
+msgstr "Tuisblad"
+
+msgid "Server error"
+msgstr "Bedienerfout"
+
+msgid "Server error (500)"
+msgstr "Bedienerfout (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Bedienerfout <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Hardloop die gekose aksie"
+
+msgid "Go"
+msgstr "Gaan"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliek hier om die objekte oor alle bladsye te kies."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Kies al %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Verwyder keuses"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Vul eers 'n gebruikersnaam en wagwoord in. Dan sal jy in staat wees om meer "
+"gebruikersopsies te wysig."
+
+msgid "Enter a username and password."
+msgstr "Vul 'n gebruikersnaam en wagwoord in."
+
+msgid "Change password"
+msgstr "Verander wagwoord"
+
+msgid "Please correct the error below."
+msgstr "Korrigeer asseblief die foute hieronder."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Vul 'n nuwe wagwoord vir gebruiker <strong>%(username)s</strong> in."
+
+msgid "Welcome,"
+msgstr "Welkom,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentasie"
+
+msgid "Log out"
+msgstr "Teken uit"
+
+msgid "Add"
+msgstr "Voeg by"
+
+msgid "History"
+msgstr "Geskiedenis"
+
+msgid "View on site"
+msgstr "Bekyk op werf"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Voeg %(name)s by"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Verwyder van sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sortering prioriteit: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Wissel sortering"
+
+msgid "Delete"
+msgstr "Skrap"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Om die %(object_name)s '%(escaped_object)s' te skrap sou vereis dat die "
+"volgende beskermde verwante objekte geskrap word:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ja, ek is seker"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Skrap meerdere objekte"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Om die gekose %(objects_name)s te skrap sou verwante objekte skrap, maar jou "
+"rekening het nie toestemming om die volgende tipes objekte te skrap nie:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Om die gekose %(objects_name)s te skrap veries dat die volgende beskermde "
+"verwante objekte geskrap word:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Is jy seker jy wil die gekose %(objects_name)s skrap? Al die volgende "
+"objekte en hul verwante items sal geskrap word:"
+
+msgid "Change"
+msgstr "Verander"
+
+msgid "Remove"
+msgstr "Verwyder"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Voeg nog 'n %(verbose_name)s by"
+
+msgid "Delete?"
+msgstr "Skrap?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Deur %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Jy het nie toestemming om enigiets te wysig nie."
+
+msgid "Recent Actions"
+msgstr "Onlangse Aksies"
+
+msgid "My Actions"
+msgstr "My Aksies"
+
+msgid "None available"
+msgstr "Niks beskikbaar nie"
+
+msgid "Unknown content"
+msgstr "Onbekend inhoud"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Wagwoord of gebruikersnaam vergeet?"
+
+msgid "Date/time"
+msgstr "Datum/tyd"
+
+msgid "User"
+msgstr "Gebruiker"
+
+msgid "Action"
+msgstr "Aksie"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Hierdie item het nie 'n veranderingsgeskiedenis nie. Dit was waarskynlik nie "
+"deur middel van hierdie admin werf bygevoeg nie."
+
+msgid "Show all"
+msgstr "Wys alle"
+
+msgid "Save"
+msgstr "Stoor"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Soek"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultaat"
+msgstr[1] "%(counter)s resultate"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s in totaal"
+
+msgid "Save as new"
+msgstr "Stoor as nuwe"
+
+msgid "Save and add another"
+msgstr "Stoor en voeg 'n ander by"
+
+msgid "Save and continue editing"
+msgstr "Stoor en wysig verder"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr "Teken weer in"
+
+msgid "Password change"
+msgstr "Wagwoord verandering"
+
+msgid "Your password was changed."
+msgstr "Jou wagwoord was verander."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Tik jou ou wagwoord, ter wille van sekuriteit's, en dan 'n nuwe wagwoord "
+"twee keer so dat ons kan seker wees dat jy dit korrek ingetik het."
+
+msgid "Change my password"
+msgstr "Verander my wagwoord"
+
+msgid "Password reset"
+msgstr "Wagwoord herstel"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Jou wagwoord is gestel. Jy kan nou voort gaan en aanteken."
+
+msgid "Password reset confirmation"
+msgstr "Wagwoord herstel bevestiging"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Tik jou nuwe wagwoord twee keer in so ons kan seker wees dat jy dit korrek "
+"ingetik het."
+
+msgid "New password:"
+msgstr "Nuwe wagwoord:"
+
+msgid "Confirm password:"
+msgstr "Bevestig wagwoord:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gaan asseblief na die volgende bladsy en kies 'n nuwe wagwoord:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Jou gebruikersnaam, in geval jy vergeet het:"
+
+msgid "Thanks for using our site!"
+msgstr "Dankie vir die gebruik van ons webwerf!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Die %(site_name)s span"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Herstel my wagwoord"
+
+msgid "All dates"
+msgstr "Alle datums"
+
+#, python-format
+msgid "Select %s"
+msgstr "Kies %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Kies %s om te verander"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Tyd:"
+
+msgid "Lookup"
+msgstr "Soek"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a98362d
--- /dev/null
+++ b/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2d8f0b9
--- /dev/null
+++ b/tbc/static/admin/locale/af/LC_MESSAGES/djangojs.po
@@ -0,0 +1,149 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Piet Delport <pjdelport@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/"
+"af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Beskikbare %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Kies alle"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr "Kies"
+
+msgid "Remove"
+msgstr "Verwyder"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Gekose %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr "Verwyder alle"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Nou"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Kies 'n tyd"
+
+msgid "Midnight"
+msgstr "Middernag"
+
+msgid "6 a.m."
+msgstr "6 v.m."
+
+msgid "Noon"
+msgstr "Middag"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Kanselleer"
+
+msgid "Today"
+msgstr "Vandag"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Gister"
+
+msgid "Tomorrow"
+msgstr "Môre"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr "Wys"
+
+msgid "Hide"
+msgstr "Versteek"
diff --git a/tbc/static/admin/locale/ar/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ar/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1d48709
--- /dev/null
+++ b/tbc/static/admin/locale/ar/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ar/LC_MESSAGES/django.po b/tbc/static/admin/locale/ar/LC_MESSAGES/django.po
new file mode 100644
index 0000000..04f1c66
--- /dev/null
+++ b/tbc/static/admin/locale/ar/LC_MESSAGES/django.po
@@ -0,0 +1,680 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Bashar Al-Abdulhadi, 2015
+# Bashar Al-Abdulhadi, 2014
+# Eyad Toma <d.eyad.t@gmail.com>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-27 21:17+0000\n"
+"Last-Translator: Bashar Al-Abdulhadi\n"
+"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "تم حذف %(count)d %(items)s بنجاح."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "لا يمكن حذف %(name)s"
+
+msgid "Are you sure?"
+msgstr "هل أنت متأكد؟"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "حذف سجلات %(verbose_name_plural)s المحددة"
+
+msgid "Administration"
+msgstr "الإدارة"
+
+msgid "All"
+msgstr "الكل"
+
+msgid "Yes"
+msgstr "نعم"
+
+msgid "No"
+msgstr "لا"
+
+msgid "Unknown"
+msgstr "مجهول"
+
+msgid "Any date"
+msgstr "أي تاريخ"
+
+msgid "Today"
+msgstr "اليوم"
+
+msgid "Past 7 days"
+msgstr "الأيام السبعة الماضية"
+
+msgid "This month"
+msgstr "هذا الشهر"
+
+msgid "This year"
+msgstr "هذه السنة"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"الرجاء إدخال ال%(username)s و كلمة المرور الصحيحين لحساب الطاقم. الحقلين "
+"حساسين وضعية الاحرف."
+
+msgid "Action:"
+msgstr "إجراء:"
+
+msgid "action time"
+msgstr "وقت الإجراء"
+
+msgid "user"
+msgstr "المستخدم"
+
+msgid "content type"
+msgstr "نوع المحتوى"
+
+msgid "object id"
+msgstr "معرف العنصر"
+
+msgid "object repr"
+msgstr "ممثل العنصر"
+
+msgid "action flag"
+msgstr "علامة الإجراء"
+
+msgid "change message"
+msgstr "غيّر الرسالة"
+
+msgid "log entry"
+msgstr "مُدخل السجل"
+
+msgid "log entries"
+msgstr "مُدخلات السجل"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "تم إضافة العناصر \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "تم تعديل العناصر \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "تم حذف العناصر \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "كائن LogEntry"
+
+msgid "None"
+msgstr "لاشيء"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"استمر بالضغط على مفتاح \"Control\", او \"Command\" على أجهزة الماك, لإختيار "
+"أكثر من أختيار واحد."
+
+msgid "Added."
+msgstr "تمت الإضافة."
+
+#, python-format
+msgid "Changed %s."
+msgstr "عدّل %s."
+
+msgid "and"
+msgstr "و"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "أضاف %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "غيّر %(list)s في %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "حذف %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "لم يتم تغيير أية حقول."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "تمت إضافة %(name)s \"%(obj)s\" بنجاح، يمكنك تعديله مرة أخرى بالأسفل."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "تمت إضافة %(name)s \"%(obj)s\" بنجاح، يمكنك إضافة %(name)s أخر أدناه."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "تم اضافة %(name)s \"%(obj)s\" بنجاح."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "تم تعديل %(name)s \"%(obj)s\" بنجاح، يمكنك تعديله مرة أخرى أدناه."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "تم تعديل %(name)s \"%(obj)s\" بنجاح، يمكنك إضافة %(name)s أخر أدناه."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "تم تغيير %(name)s \"%(obj)s\" بنجاح."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "يجب تحديد العناصر لتطبيق الإجراءات عليها. لم يتم تغيير أية عناصر."
+
+msgid "No action selected."
+msgstr "لم يحدد أي إجراء."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "تم حذف %(name)s \"%(obj)s\" بنجاح."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "العنصر %(name)s الذي به الحقل الأساسي %(key)r غير موجود."
+
+#, python-format
+msgid "Add %s"
+msgstr "أضف %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "عدّل %s"
+
+msgid "Database error"
+msgstr "خطـأ في قاعدة البيانات"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "لم يتم تغيير أي شيء"
+msgstr[1] "تم تغيير %(count)s %(name)s بنجاح."
+msgstr[2] "تم تغيير %(count)s %(name)s بنجاح."
+msgstr[3] "تم تغيير %(count)s %(name)s بنجاح."
+msgstr[4] "تم تغيير %(count)s %(name)s بنجاح."
+msgstr[5] "تم تغيير %(count)s %(name)s بنجاح."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "لم يتم تحديد أي شيء"
+msgstr[1] "تم تحديد %(total_count)s"
+msgstr[2] "تم تحديد %(total_count)s"
+msgstr[3] "تم تحديد %(total_count)s"
+msgstr[4] "تم تحديد %(total_count)s"
+msgstr[5] "تم تحديد %(total_count)s"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "لا شيء محدد من %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "تاريخ التغيير: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: "
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "إدارة موقع جانغو"
+
+msgid "Django administration"
+msgstr "إدارة جانغو"
+
+msgid "Site administration"
+msgstr "إدارة الموقع"
+
+msgid "Log in"
+msgstr "ادخل"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "إدارة %(app)s "
+
+msgid "Page not found"
+msgstr "تعذر العثور على الصفحة"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة."
+
+msgid "Home"
+msgstr "الرئيسية"
+
+msgid "Server error"
+msgstr "خطأ في المزود"
+
+msgid "Server error (500)"
+msgstr "خطأ في المزود (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "خطأ في المزود <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"كان هناك خطأ. تم إعلام المسؤولين عن الموقع عبر البريد الإلكتروني وسوف يتم "
+"إصلاح الخطأ قريباً. شكراً على صبركم."
+
+msgid "Run the selected action"
+msgstr "نفذ الإجراء المحدّد"
+
+msgid "Go"
+msgstr "نفّذ"
+
+msgid "Click here to select the objects across all pages"
+msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "اختيار %(total_count)s %(module_name)s جميعها"
+
+msgid "Clear selection"
+msgstr "إزالة الاختيار"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"أولاً، أدخل اسم مستخدم وكلمة مرور. ومن ثم تستطيع تعديل المزيد من خيارات "
+"المستخدم."
+
+msgid "Enter a username and password."
+msgstr "أدخل اسم مستخدم وكلمة مرور."
+
+msgid "Change password"
+msgstr "غيّر كلمة المرور"
+
+msgid "Please correct the error below."
+msgstr "الرجاء تصحيح الخطأ أدناه."
+
+msgid "Please correct the errors below."
+msgstr "الرجاء تصحيح الأخطاء أدناه."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "أدخل كلمة مرور جديدة للمستخدم <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "أهلا، "
+
+msgid "View site"
+msgstr "عرض الموقع"
+
+msgid "Documentation"
+msgstr "الوثائق"
+
+msgid "Log out"
+msgstr "اخرج"
+
+msgid "Add"
+msgstr "أضف"
+
+msgid "History"
+msgstr "تاريخ"
+
+msgid "View on site"
+msgstr "مشاهدة على الموقع"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "أضف %(name)s"
+
+msgid "Filter"
+msgstr "مرشّح"
+
+msgid "Remove from sorting"
+msgstr "إزالة من الترتيب"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "أولوية الترتيب: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "عكس الترتيب"
+
+msgid "Delete"
+msgstr "احذف"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة "
+"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، "
+"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"متأكد أنك تريد حذف العنصر %(object_name)s \"%(escaped_object)s\"؟ سيتم حذف "
+"جميع العناصر التالية المرتبطة به:"
+
+msgid "Objects"
+msgstr "عناصر"
+
+msgid "Yes, I'm sure"
+msgstr "نعم، أنا متأكد"
+
+msgid "No, take me back"
+msgstr "لا, تراجع للخلف"
+
+msgid "Delete multiple objects"
+msgstr "حذف عدّة عناصر"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن "
+"حسابك ليس له صلاحية حذف أنواع العناصر التالية:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة "
+"التالية:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية "
+"والعناصر المرتبطة بها سيتم حذفها:"
+
+msgid "Change"
+msgstr "عدّل"
+
+msgid "Remove"
+msgstr "أزل"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "إضافة سجل %(verbose_name)s آخر"
+
+msgid "Delete?"
+msgstr "احذفه؟"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " حسب %(filter_title)s "
+
+msgid "Summary"
+msgstr "ملخص"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "النماذج في تطبيق %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "ليست لديك الصلاحية لتعديل أي شيء."
+
+msgid "Recent Actions"
+msgstr "آخر الإجراءات"
+
+msgid "My Actions"
+msgstr "إجراءاتي"
+
+msgid "None available"
+msgstr "لا يوجد"
+
+msgid "Unknown content"
+msgstr "مُحتوى مجهول"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة "
+"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه "
+"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟"
+
+msgid "Forgotten your password or username?"
+msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟"
+
+msgid "Date/time"
+msgstr "التاريخ/الوقت"
+
+msgid "User"
+msgstr "المستخدم"
+
+msgid "Action"
+msgstr "إجراء"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة "
+"الموقع."
+
+msgid "Show all"
+msgstr "أظهر الكل"
+
+msgid "Save"
+msgstr "احفظ"
+
+msgid "Popup closing..."
+msgstr "جاري الإغلاق..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "تغيير %(model)s المختارة"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "أضف %(model)s آخر"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "حذف %(model)s المختارة"
+
+msgid "Search"
+msgstr "ابحث"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "لا نتائج"
+msgstr[1] "نتيجة واحدة"
+msgstr[2] "نتيجتان"
+msgstr[3] "%(counter)s نتائج"
+msgstr[4] "%(counter)s نتيجة"
+msgstr[5] "%(counter)s نتيجة"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "المجموع %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "احفظ كجديد"
+
+msgid "Save and add another"
+msgstr "احفظ وأضف آخر"
+
+msgid "Save and continue editing"
+msgstr "احفظ واستمر بالتعديل"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "شكراً لك على قضائك بعض الوقت مع الموقع اليوم."
+
+msgid "Log in again"
+msgstr "ادخل مجدداً"
+
+msgid "Password change"
+msgstr "غيّر كلمة مرورك"
+
+msgid "Your password was changed."
+msgstr "تمّ تغيير كلمة مرورك."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"رجاءً أدخل كلمة مرورك القديمة، للأمان، ثم أدخل كلمة مرور الجديدة مرتين كي "
+"تتأكّد من كتابتها بشكل صحيح."
+
+msgid "Change my password"
+msgstr "غيّر كلمة مروري"
+
+msgid "Password reset"
+msgstr "استعادة كلمة المرور"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن."
+
+msgid "Password reset confirmation"
+msgstr "تأكيد استعادة كلمة المرور"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح."
+
+msgid "New password:"
+msgstr "كلمة المرور الجديدة:"
+
+msgid "Confirm password:"
+msgstr "أكّد كلمة المرور:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب "
+"استعادة كلمة المرور مرة أخرى."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك, في حال تواجد "
+"حساب بنفس البريد الإلكتروني الذي ادخلته. سوف تستقبل البريد الإلكتروني قريباً"
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك "
+"الإلكتروني بشكل صحيح ومراجعة مجلد الرسائل غير المرغوب فيها."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على "
+"%(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:"
+
+msgid "Thanks for using our site!"
+msgstr "شكراً لاستخدامك موقعنا!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "فريق %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"هل فقدت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال "
+"تعليمات للحصول على كلمة مرور جديدة."
+
+msgid "Email address:"
+msgstr "عنوان البريد الإلكتروني:"
+
+msgid "Reset my password"
+msgstr "استعد كلمة مروري"
+
+msgid "All dates"
+msgstr "كافة التواريخ"
+
+#, python-format
+msgid "Select %s"
+msgstr "اختر %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "اختر %s لتغييره"
+
+msgid "Date:"
+msgstr "التاريخ:"
+
+msgid "Time:"
+msgstr "الوقت:"
+
+msgid "Lookup"
+msgstr "ابحث"
+
+msgid "Currently:"
+msgstr "حالياً:"
+
+msgid "Change:"
+msgstr "تغيير:"
diff --git a/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ab0f454
--- /dev/null
+++ b/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f048ee8
--- /dev/null
+++ b/tbc/static/admin/locale/ar/LC_MESSAGES/djangojs.po
@@ -0,0 +1,172 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Bashar Al-Abdulhadi, 2015
+# Bashar Al-Abdulhadi, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-27 21:15+0000\n"
+"Last-Translator: Bashar Al-Abdulhadi\n"
+"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s المتوفرة"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم "
+"الضغط على سهم الـ\"اختيار\" بين الصندوقين."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة."
+
+msgid "Filter"
+msgstr "انتقاء"
+
+msgid "Choose all"
+msgstr "اختر الكل"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "اضغط لاختيار جميع %s جملة واحدة."
+
+msgid "Choose"
+msgstr "اختيار"
+
+msgid "Remove"
+msgstr "احذف"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s المُختارة"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط "
+"على سهم الـ\"إزالة\" بين الصندوقين."
+
+msgid "Remove all"
+msgstr "إزالة الكل"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "لا شي محدد"
+msgstr[1] "%(sel)s من %(cnt)s محدد"
+msgstr[2] "%(sel)s من %(cnt)s محدد"
+msgstr[3] "%(sel)s من %(cnt)s محددة"
+msgstr[4] "%(sel)s من %(cnt)s محدد"
+msgstr[5] "%(sel)s من %(cnt)s محدد"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء "
+"فسوف تخسر تعديلاتك."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة "
+"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم."
+
+msgid "Now"
+msgstr "الآن"
+
+msgid "Choose a Time"
+msgstr "إختر وقت"
+
+msgid "Choose a time"
+msgstr "اختر وقتاً"
+
+msgid "Midnight"
+msgstr "منتصف الليل"
+
+msgid "6 a.m."
+msgstr "6 ص."
+
+msgid "Noon"
+msgstr "الظهر"
+
+msgid "6 p.m."
+msgstr "6 مساءً"
+
+msgid "Cancel"
+msgstr "ألغ"
+
+msgid "Today"
+msgstr "اليوم"
+
+msgid "Choose a Date"
+msgstr "إختر تاريخ "
+
+msgid "Yesterday"
+msgstr "أمس"
+
+msgid "Tomorrow"
+msgstr "غداً"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"يناير فبراير مارس إبريل مايو يونيو يوليو أغسطس سبتمبر أكتوبر نوفمبر ديسمبر"
+
+msgid "S M T W T F S"
+msgstr "أ إ ث أ خ ج س"
+
+msgid "Show"
+msgstr "أظهر"
+
+msgid "Hide"
+msgstr "اخف"
diff --git a/tbc/static/admin/locale/ast/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ast/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..329158b
--- /dev/null
+++ b/tbc/static/admin/locale/ast/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ast/LC_MESSAGES/django.po b/tbc/static/admin/locale/ast/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c25b593
--- /dev/null
+++ b/tbc/static/admin/locale/ast/LC_MESSAGES/django.po
@@ -0,0 +1,629 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ḷḷumex03 <tornes@opmbx.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Asturian (http://www.transifex.com/django/django/language/"
+"ast/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ast\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "desanciáu con ésitu %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nun pue desaniciase %(name)s"
+
+msgid "Are you sure?"
+msgstr "¿De xuru?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Too"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "Non"
+
+msgid "Unknown"
+msgstr "Desconocíu"
+
+msgid "Any date"
+msgstr "Cualaquier data"
+
+msgid "Today"
+msgstr "Güei"
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr "Esti mes"
+
+msgid "This year"
+msgstr "Esi añu"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Aición:"
+
+msgid "action time"
+msgstr ""
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Amestáu \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Los oxetos tienen d'usase pa faer aiciones con ellos. Nun se camudó dengún "
+"oxetu."
+
+msgid "No action selected."
+msgstr "Nun s'esbilló denguna aición."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "Amestar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Esbillaos 0 de %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr "Aniciar sesión"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Nun s'alcontró la páxina"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sentímoslo, pero nun s'alcuentra la páxina solicitada."
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hebo un erru. Repotóse al sitiu d'alministradores per corréu y debería "
+"d'iguase en pocu tiempu. Gracies pola to paciencia."
+
+msgid "Run the selected action"
+msgstr "Executar l'aición esbillada"
+
+msgid "Go"
+msgstr "Dir"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Esbillar too %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Llimpiar esbilla"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "Bienllegáu/ada,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr "Anguaño:"
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..24430a1
--- /dev/null
+++ b/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..08acc65
--- /dev/null
+++ b/tbc/static/admin/locale/ast/LC_MESSAGES/djangojs.po
@@ -0,0 +1,157 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ḷḷumex03 <tornes@opmbx.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Asturian (http://www.transifex.com/django/django/language/"
+"ast/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ast\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Disponible %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Choose all"
+msgstr "Escoyer too"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Primi pa escoyer too %s d'una vegada"
+
+msgid "Choose"
+msgstr "Escoyer"
+
+msgid "Remove"
+msgstr "Desaniciar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Escoyíu %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr "Desaniciar too"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Primi pa desaniciar tolo escoyío %s d'una vegada"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s esbilláu"
+msgstr[1] "%(sel)s de %(cnt)s esbillaos"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Esbillesti una aición, pero entá nun guardesti les tos camudancies nos "
+"campos individuales. Por favor, primi Aceutar pa guardar. Necesitarás "
+"executar de nueves la aición"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Esbillesti una aición, y nun fixesti camudancia dala nos campos "
+"individuales. Quiciabes teas guetando'l botón Dir en cuantes del botón "
+"Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Agora"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Escueyi una hora"
+
+msgid "Midnight"
+msgstr "Media nueche"
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr "Meudía"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Encaboxar"
+
+msgid "Today"
+msgstr "Güei"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Ayeri"
+
+msgid "Tomorrow"
+msgstr "Mañana"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Xineru Febreru Marzu Abril Mayu Xunu Xunetu Agostu Setiembre Ochobre Payares "
+"Avientu"
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr "Amosar"
+
+msgid "Hide"
+msgstr "Anubrir"
diff --git a/tbc/static/admin/locale/az/LC_MESSAGES/django.mo b/tbc/static/admin/locale/az/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9d7300b
--- /dev/null
+++ b/tbc/static/admin/locale/az/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/az/LC_MESSAGES/django.po b/tbc/static/admin/locale/az/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b6bcf4d
--- /dev/null
+++ b/tbc/static/admin/locale/az/LC_MESSAGES/django.po
@@ -0,0 +1,660 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Azerbaijani (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s uğurla silindi."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s silinmir"
+
+msgid "Are you sure?"
+msgstr "Əminsiniz?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Seçilmiş %(verbose_name_plural)s-ləri sil"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Hamısı"
+
+msgid "Yes"
+msgstr "Hə"
+
+msgid "No"
+msgstr "Yox"
+
+msgid "Unknown"
+msgstr "Bilinmir"
+
+msgid "Any date"
+msgstr "İstənilən tarix"
+
+msgid "Today"
+msgstr "Bu gün"
+
+msgid "Past 7 days"
+msgstr "Son 7 gündə"
+
+msgid "This month"
+msgstr "Bu ay"
+
+msgid "This year"
+msgstr "Bu il"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Əməliyyat:"
+
+msgid "action time"
+msgstr "əməliyyat vaxtı"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "obyekt id"
+
+msgid "object repr"
+msgstr "obyekt repr"
+
+msgid "action flag"
+msgstr "bayraq"
+
+msgid "change message"
+msgstr "dəyişmə mesajı"
+
+msgid "log entry"
+msgstr "loq yazısı"
+
+msgid "log entries"
+msgstr "loq yazıları"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" əlavə olundu."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" - %(changes)s dəyişiklikləri qeydə alındı."
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" silindi."
+
+msgid "LogEntry Object"
+msgstr "LogEntry obyekti"
+
+msgid "None"
+msgstr "Heç nə"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s dəyişdi."
+
+msgid "and"
+msgstr "və"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" əlavə olundu."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr " %(list)s %(name)s \"%(object)s\" üçün dəyişdi."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" siyahısından silindi."
+
+msgid "No fields changed."
+msgstr "Heç bir sahə dəyişmədi."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" siyahısına uğurla əlavə olundu. Yenə onu aşağıda "
+"redaktə edə bilərsiniz."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" siyahısına uğurla əlavə edildi."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" siyahısında uğurla dəyişdirildi."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Biz elementlər üzərində nəsə əməliyyat aparmaq üçün siz onları seçməlisiniz. "
+"Heç bir element dəyişmədi."
+
+msgid "No action selected."
+msgstr "Heç bir əməliyyat seçilmədi."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" uğurla silindi."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r əsas açarı ilə %(name)s mövcud deyil."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s əlavə et"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s dəyiş"
+
+msgid "Database error"
+msgstr "Bazada xəta"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s-dan 0 seçilib"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Dəyişmə tarixi: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django sayt administratoru"
+
+msgid "Django administration"
+msgstr "Django administrasiya"
+
+msgid "Site administration"
+msgstr "Sayt administrasiyası"
+
+msgid "Log in"
+msgstr "Daxil ol"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Səhifə tapılmadı"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Üzrlər, amma soruşduğunuz sayt tapılmadı."
+
+msgid "Home"
+msgstr "Ev"
+
+msgid "Server error"
+msgstr "Serverdə xəta"
+
+msgid "Server error (500)"
+msgstr "Serverdə xəta (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverdə xəta <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Xəta baş verdi. Sayt administratorlarına e-poçt göndərildi və onlar xəta ilə "
+"tezliklə məşğul olacaqlar. Səbrli olun."
+
+msgid "Run the selected action"
+msgstr "Seçdiyim əməliyyatı yerinə yetir"
+
+msgid "Go"
+msgstr "Getdik"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura tıqlayın"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Bütün %(total_count)s sayda %(module_name)s seç"
+
+msgid "Clear selection"
+msgstr "Seçimi təmizlə"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Əvvəlcə istifadəçi adını və parolu daxil edin. Ondan sonra daha çox "
+"istifadəçi imkanlarını redaktə edə biləcəksiniz."
+
+msgid "Enter a username and password."
+msgstr "İstifadəçi adını və parolu daxil edin."
+
+msgid "Change password"
+msgstr "Parolu dəyiş"
+
+msgid "Please correct the error below."
+msgstr ""
+"one: Aşağıdakı səhvi düzəltməyi xahiş edirik.\n"
+"other: Aşağıdakı səhvləri düzəltməyi xahiş edirik."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> üçün yeni parol daxil edin."
+
+msgid "Welcome,"
+msgstr "Xoş gördük,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Sənədləşdirmə"
+
+msgid "Log out"
+msgstr "Çıx"
+
+msgid "Add"
+msgstr "Əlavə et"
+
+msgid "History"
+msgstr "Tarix"
+
+msgid "View on site"
+msgstr "Saytda göstər"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s əlavə et"
+
+msgid "Filter"
+msgstr "Süzgəc"
+
+msgid "Remove from sorting"
+msgstr "Sıralamadan çıxar"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sıralama prioriteti: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Sıralamanı çevir"
+
+msgid "Delete"
+msgstr "Sil"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" obyektini sildikdə onun bağlı olduğu "
+"obyektlər də silinməlidir. Ancaq sizin hesabın aşağıdakı tip obyektləri "
+"silməyə səlahiyyəti çatmır:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" obyektini silmək üçün aşağıdakı "
+"qorunan obyektlər də silinməlidir:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" obyektini silməkdə əminsiniz? Ona "
+"bağlı olan aşağıdakı obyektlər də silinəcək:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Hə, əminəm"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Bir neçə obyekt sil"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(objects_name)s obyektini silmək üçün ona bağlı obyektlər də silinməlidir. "
+"Ancaq sizin hesabınızın aşağıdakı tip obyektləri silmək səlahiyyətinə malik "
+"deyil:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"%(objects_name)s obyektini silmək üçün aşağıdakı qorunan obyektlər də "
+"silinməlidir:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Seçdiyiniz %(objects_name)s obyektini silməkdə əminsiniz? Aşağıdakı bütün "
+"obyektlər və ona bağlı digər obyektlər də silinəcək:"
+
+msgid "Change"
+msgstr "Dəyiş"
+
+msgid "Remove"
+msgstr "Yığışdır"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Daha bir %(verbose_name)s əlavə et"
+
+msgid "Delete?"
+msgstr "Silək?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s görə "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s proqramındakı modellər"
+
+msgid "You don't have permission to edit anything."
+msgstr "Üzrlər, amma sizin nəyisə dəyişməyə səlahiyyətiniz çatmır."
+
+msgid "Recent Actions"
+msgstr "Son əməliyyatlar"
+
+msgid "My Actions"
+msgstr "Mənim etdiklərim"
+
+msgid "None available"
+msgstr "Heç nə yoxdur"
+
+msgid "Unknown content"
+msgstr "Naməlum"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Bazanın qurulması ilə nəsə problem var. Lazımi cədvəllərin bazada "
+"yaradıldığını və uyğun istifadəçinin bazadan oxuya bildiyini yoxlayın."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Parol və ya istifadəçi adını unutmusan?"
+
+msgid "Date/time"
+msgstr "Tarix/vaxt"
+
+msgid "User"
+msgstr "İstifadəçi"
+
+msgid "Action"
+msgstr "Əməliyyat"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Bu obyektin dəyişməsinə aid tarix mövcud deyil. Yəqin ki, o, bu admin saytı "
+"vasitəsilə yaradılmayıb."
+
+msgid "Show all"
+msgstr "Hamısını göstər"
+
+msgid "Save"
+msgstr "Yadda saxla"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Axtar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Hamısı birlikdə %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Yenisi kimi yadda saxla"
+
+msgid "Save and add another"
+msgstr "Yadda saxla və yenisini əlavə et"
+
+msgid "Save and continue editing"
+msgstr "Yadda saxla və redaktəyə davam et"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Sayt ilə səmərəli vaxt keçirdiyiniz üçün təşəkkür."
+
+msgid "Log in again"
+msgstr "Yenidən daxil ol"
+
+msgid "Password change"
+msgstr "Parol dəyişmək"
+
+msgid "Your password was changed."
+msgstr "Sizin parolunuz dəyişdi."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Yoxlama üçün köhnə parolunuzu daxil edin. Sonra isə yeni parolu iki dəfə "
+"daxil edin ki, səhv etmədiyinizə əmin olaq."
+
+msgid "Change my password"
+msgstr "Mənim parolumu dəyiş"
+
+msgid "Password reset"
+msgstr "Parolun sıfırlanması"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Yeni parol artıq qüvvədədir. Yenidən daxil ola bilərsiniz."
+
+msgid "Password reset confirmation"
+msgstr "Parolun sıfırlanması üçün təsdiq"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Yeni parolu iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq."
+
+msgid "New password:"
+msgstr "Yeni parol:"
+
+msgid "Confirm password:"
+msgstr "Yeni parol (bir daha):"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Parolun sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. "
+"Parolu sıfırlamaq üçün yenə müraciət edin."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"%(site_name)s saytında parolu yeniləmək istədiyinizə görə bu məktubu "
+"göndərdik."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Növbəti səhifəyə keçid alın və yeni parolu seçin:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Sizin istifadəçi adınız:"
+
+msgid "Thanks for using our site!"
+msgstr "Bizim saytdan istifadə etdiyiniz üçün təşəkkür edirik!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komandası"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Parolu unutmusunuz? Aşağıda e-poçt ünvanınızı təqdim edin, biz isə yeni "
+"parol seçmək təlimatlarını sizə göndərək."
+
+msgid "Email address:"
+msgstr "E-poçt:"
+
+msgid "Reset my password"
+msgstr "Parolumu sıfırla"
+
+msgid "All dates"
+msgstr "Bütün tarixlərdə"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s seç"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s dəyişmək üçün seç"
+
+msgid "Date:"
+msgstr "Tarix:"
+
+msgid "Time:"
+msgstr "Vaxt:"
+
+msgid "Lookup"
+msgstr "Sorğu"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a005e3c
--- /dev/null
+++ b/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f22c33c
--- /dev/null
+++ b/tbc/static/admin/locale/az/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ali Ismayilov <ali@ismailov.info>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Azerbaijani (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Mümkün %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Bu, mümkün %s siyahısıdır. Onlardan bir neçəsini qarşısındakı xanaya işarə "
+"qoymaq və iki xana arasındakı \"Seç\"i tıqlamaqla seçmək olar."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Bu xanaya yazmaqla mümkün %s siyahısını filtrləyə bilərsiniz."
+
+msgid "Filter"
+msgstr "Süzgəc"
+
+msgid "Choose all"
+msgstr "Hamısını seç"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Bütün %s siyahısını seçmək üçün tıqlayın."
+
+msgid "Choose"
+msgstr "Seç"
+
+msgid "Remove"
+msgstr "Yığışdır"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Seçilmiş %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Bu, seçilmiş %s siyahısıdır. Onlardan bir neçəsini aşağıdakı xanaya işarə "
+"qoymaq və iki xana arasındakı \"Sil\"i tıqlamaqla silmək olar."
+
+msgid "Remove all"
+msgstr "Hamısını sil"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Seçilmiş %s siyahısının hamısını silmək üçün tıqlayın."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Bəzi sahələrdə etdiyiniz dəyişiklikləri hələ yadda saxlamamışıq. Əgər "
+"əməliyyatı işə salsanız, dəyişikliklər əldən gedəcək."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Əməliyyatı seçmisiniz, amma bəzi sahələrdəki dəyişiklikləri hələ yadda "
+"saxlamamışıq. Bunun üçün OK seçməlisiniz. Ondan sonra əməliyyatı yenidən işə "
+"salmağa cəhd edin."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Siz əməliyyatı seçmisiniz və heç bir sahəyə dəyişiklik etməmisiniz. Siz "
+"yəqin ki, Yadda saxla düyməsini deyil, Getdik düyməsini axtarırsınız."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "İndi"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Vaxtı seçin"
+
+msgid "Midnight"
+msgstr "Gecə yarısı"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Günorta"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Ləğv et"
+
+msgid "Today"
+msgstr "Bu gün"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Dünən"
+
+msgid "Tomorrow"
+msgstr "Sabah"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Yanvar Fevral Mart Aprel May İyun İyul Avqust Sentyabr Oktyabr Noyabr Dekabr"
+
+msgid "S M T W T F S"
+msgstr "B B Ç Ç C C Ş"
+
+msgid "Show"
+msgstr "Göstər"
+
+msgid "Hide"
+msgstr "Gizlət"
diff --git a/tbc/static/admin/locale/be/LC_MESSAGES/django.mo b/tbc/static/admin/locale/be/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..7d2136b
--- /dev/null
+++ b/tbc/static/admin/locale/be/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/be/LC_MESSAGES/django.po b/tbc/static/admin/locale/be/LC_MESSAGES/django.po
new file mode 100644
index 0000000..56b70f8
--- /dev/null
+++ b/tbc/static/admin/locale/be/LC_MESSAGES/django.po
@@ -0,0 +1,671 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Viktar Palstsiuk <vipals@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Belarusian (http://www.transifex.com/django/django/language/"
+"be/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: be\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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Выдалілі %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Не ўдаецца выдаліць %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ці ўпэўненыя вы?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Выдаліць абраныя %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Адміністрацыя"
+
+msgid "All"
+msgstr "Усе"
+
+msgid "Yes"
+msgstr "Так"
+
+msgid "No"
+msgstr "Не"
+
+msgid "Unknown"
+msgstr "Невядома"
+
+msgid "Any date"
+msgstr "Хоць-якая дата"
+
+msgid "Today"
+msgstr "Сёньня"
+
+msgid "Past 7 days"
+msgstr "Апошні тыдзень"
+
+msgid "This month"
+msgstr "Гэты месяц"
+
+msgid "This year"
+msgstr "Гэты год"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Дзеяньне:"
+
+msgid "action time"
+msgstr "час дзеяньня"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "нумар аб’екта"
+
+msgid "object repr"
+msgstr "прадстаўленьне аб’екта"
+
+msgid "action flag"
+msgstr "від дзеяньня"
+
+msgid "change message"
+msgstr "паведамленьне пра зьмену"
+
+msgid "log entry"
+msgstr "запіс у справаздачы"
+
+msgid "log entries"
+msgstr "запісы ў справаздачы"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Дадалі «%(object)s»."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Зьмянілі «%(object)s» — %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Выдалілі «%(object)s»."
+
+msgid "LogEntry Object"
+msgstr "Запіс у справаздачы"
+
+msgid "None"
+msgstr "Няма"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Утрымлівайце націснутай кнопку \"Control\", або \"Command\" на Mac, каб "
+"вылучыць больш за адзін."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Зьмянілі %s."
+
+msgid "and"
+msgstr "і"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Дадалі %(name)s «%(object)s»."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Зьмянілі %(list)s для %(name)s «%(object)s»."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Выдалілі %(name)s «%(object)s»."
+
+msgid "No fields changed."
+msgstr "Палі не зьмяняліся."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Дадалі %(name)s «%(obj)s». Ніжэй яго можна зноўку правіць."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Дадалі %(name)s «%(obj)s»."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Зьмянілі %(name)s «%(obj)s»."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Каб нешта рабіць, трэба спачатку абраць, з чым гэта рабіць. Нічога не "
+"зьмянілася."
+
+msgid "No action selected."
+msgstr "Не абралі дзеяньняў."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Сьцерлі %(name)s «%(obj)s»."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Аб’ект %(name)s з галоўным ключом %(key)r не існуе."
+
+#, python-format
+msgid "Add %s"
+msgstr "Дадаць %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Зьмяніць %s"
+
+msgid "Database error"
+msgstr "База зьвестак дала хібу"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Зьмянілі %(count)s %(name)s."
+msgstr[1] "Зьмянілі %(count)s %(name)s."
+msgstr[2] "Зьмянілі %(count)s %(name)s."
+msgstr[3] "Зьмянілі %(count)s %(name)s."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Абралі %(total_count)s"
+msgstr[1] "Абралі ўсе %(total_count)s"
+msgstr[2] "Абралі ўсе %(total_count)s"
+msgstr[3] "Абралі ўсе %(total_count)s"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Абралі 0 аб’ектаў з %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Гісторыя зьменаў: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Кіраўнічая пляцоўка «Джэнґа»"
+
+msgid "Django administration"
+msgstr "Кіраваць «Джэнґаю»"
+
+msgid "Site administration"
+msgstr "Кіраваць пляцоўкаю"
+
+msgid "Log in"
+msgstr "Увайсьці"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Адміністрацыя %(app)s"
+
+msgid "Page not found"
+msgstr "Бачыну не знайшлі"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "На жаль, запытаную бачыну немагчыма знайсьці."
+
+msgid "Home"
+msgstr "Пачатак"
+
+msgid "Server error"
+msgstr "Паслужнік даў хібу"
+
+msgid "Server error (500)"
+msgstr "Паслужнік даў хібу (памылка 500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Паслужнік даў хібу <em>(памылка 500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Адбылася памылка. Паведамленне пра памылку было адаслана адміністратарам "
+"сайту па электроннай пошце і яна павінна быць выпраўлена ў бліжэйшы час. "
+"Дзякуй за ваша цярпенне."
+
+msgid "Run the selected action"
+msgstr "Выканаць абранае дзеяньне"
+
+msgid "Go"
+msgstr "Выканаць"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Каб абраць аб’екты на ўсіх бачынах, націсьніце сюды"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Абраць усе %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Не абіраць нічога"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Спачатку пазначце імя карыстальніка ды пароль. Потым можна будзе наставіць "
+"іншыя можнасьці."
+
+msgid "Enter a username and password."
+msgstr "Пазначце імя карыстальніка ды пароль."
+
+msgid "Change password"
+msgstr "Зьмяніць пароль"
+
+msgid "Please correct the error below."
+msgstr "Выпраўце хібы, апісаныя ніжэй."
+
+msgid "Please correct the errors below."
+msgstr "Калі ласка, выпраўце памылкі, адзначаныя ніжэй."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Пазначце пароль для карыстальніка «<strong>%(username)s</strong>»."
+
+msgid "Welcome,"
+msgstr "Вітаем,"
+
+msgid "View site"
+msgstr "Адкрыць сайт"
+
+msgid "Documentation"
+msgstr "Дакумэнтацыя"
+
+msgid "Log out"
+msgstr "Выйсьці"
+
+msgid "Add"
+msgstr "Дадаць"
+
+msgid "History"
+msgstr "Гісторыя"
+
+msgid "View on site"
+msgstr "Зірнуць на пляцоўцы"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Дадаць %(name)s"
+
+msgid "Filter"
+msgstr "Прасеяць"
+
+msgid "Remove from sorting"
+msgstr "Прыбраць з упарадкаванага"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Парадак: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Парадкаваць наадварот"
+
+msgid "Delete"
+msgstr "Выдаліць"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Калі выдаліць %(object_name)s «%(escaped_object)s», выдаляцца зьвязаныя "
+"аб’екты, але ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Каб выдаліць %(object_name)s «%(escaped_object)s», трэба выдаліць і "
+"зьвязаныя абароненыя аб’екты:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ці выдаліць %(object_name)s «%(escaped_object)s»? Усе наступныя зьвязаныя "
+"складнікі выдаляцца:"
+
+msgid "Objects"
+msgstr "Аб'екты"
+
+msgid "Yes, I'm sure"
+msgstr "Так, дакладна"
+
+msgid "No, take me back"
+msgstr "Не, вярнуцца назад"
+
+msgid "Delete multiple objects"
+msgstr "Выдаліць некалькі аб’ектаў"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Калі выдаліць абранае (%(objects_name)s), выдаляцца зьвязаныя аб’екты, але "
+"ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Каб выдаліць абранае (%(objects_name)s), трэба выдаліць і зьвязаныя "
+"абароненыя аб’екты:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ці выдаліць абранае (%(objects_name)s)? Усе наступныя аб’екты ды зьвязаныя "
+"зь імі складнікі выдаляцца:"
+
+msgid "Change"
+msgstr "Зьмяніць"
+
+msgid "Remove"
+msgstr "Прыбраць"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Дадаць яшчэ %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Ці выдаліць?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr "Рэзюмэ"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Вы ня маеце дазволу нешта зьмяняць."
+
+msgid "Recent Actions"
+msgstr "Нядаўнія дзеяньні"
+
+msgid "My Actions"
+msgstr "Мае дзеяньні"
+
+msgid "None available"
+msgstr "Недаступнае"
+
+msgid "Unknown content"
+msgstr "Невядомае зьмесьціва"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Нешта ня так з усталяванаю базаю зьвестак. Упэўніцеся, што ў базе стварылі "
+"патрэбныя табліцы, і што базу можа чытаць адпаведны карыстальнік."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Забыліся на імя ці пароль?"
+
+msgid "Date/time"
+msgstr "Час, дата"
+
+msgid "User"
+msgstr "Карыстальнік"
+
+msgid "Action"
+msgstr "Дзеяньне"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Аб’ект ня мае гісторыі зьменаў. Мажліва, яго дадавалі не праз кіраўнічую "
+"пляцоўку."
+
+msgid "Show all"
+msgstr "Паказаць усё"
+
+msgid "Save"
+msgstr "Захаваць"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Змяніць абраныя %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Дадаць яшчэ %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Выдаліць абраныя %(model)s"
+
+msgid "Search"
+msgstr "Шукаць"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s вынік"
+msgstr[1] "%(counter)s вынікі"
+msgstr[2] "%(counter)s вынікаў"
+msgstr[3] "%(counter)s вынікаў"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Разам %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Захаваць як новы"
+
+msgid "Save and add another"
+msgstr "Захаваць і дадаць іншы"
+
+msgid "Save and continue editing"
+msgstr "Захаваць і працягваць правіць"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Дзякуем за час, які вы сёньня правялі на гэтай пляцоўцы."
+
+msgid "Log in again"
+msgstr "Увайсьці зноўку"
+
+msgid "Password change"
+msgstr "Зьмяніць пароль"
+
+msgid "Your password was changed."
+msgstr "Ваш пароль зьмяніўся."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Дзеля бясьпекі пазначце стары пароль, а потым набярыце новы пароль двойчы "
+"— каб упэўніцца, што набралі без памылак."
+
+msgid "Change my password"
+msgstr "Зьмяніць пароль"
+
+msgid "Password reset"
+msgstr "Узнавіць пароль"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Вам усталявалі пароль. Можаце вярнуцца ды ўвайсьці зноўку."
+
+msgid "Password reset confirmation"
+msgstr "Пацьвердзіце, што трэба ўзнавіць пароль"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Набярыце новы пароль двойчы — каб упэўніцца, што набралі без памылак."
+
+msgid "New password:"
+msgstr "Новы пароль:"
+
+msgid "Confirm password:"
+msgstr "Пацьвердзіце пароль:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Спасылка ўзнавіць пароль хібная: мажліва таму, што ёю ўжо скарысталіся. "
+"Запытайцеся ўзнавіць пароль яшчэ раз."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Мы адаслалі па электроннай пошце інструкцыі па ўстаноўцы пароля. Калі існуе "
+"рахунак з электроннай поштай, што вы ўвялі, то Вы павінны атрымаць іх у "
+"бліжэйшы час."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Калі вы не атрымліваеце электронную пошту, калі ласка, пераканайцеся, што вы "
+"ўвялі адрас з якім вы зарэгістраваліся, а таксама праверце тэчку са спамам."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Вы атрымалі гэты ліст, таму што вы прасілі скінуць пароль для ўліковага "
+"запісу карыстальніка на %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Перайдзіце да наступнае бачыны ды абярыце новы пароль:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Імя карыстальніка, калі раптам вы забыліся:"
+
+msgid "Thanks for using our site!"
+msgstr "Дзякуем, што карыстаецеся нашаю пляцоўкаю!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Каманда «%(site_name)s»"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Забыліся пароль? Калі ласка, увядзіце свой адрас электроннай пошты ніжэй, і "
+"мы вышлем інструкцыі па электроннай пошце для ўстаноўкі новага."
+
+msgid "Email address:"
+msgstr "Адрас электроннай пошты:"
+
+msgid "Reset my password"
+msgstr "Узнавіць пароль"
+
+msgid "All dates"
+msgstr "Усе даты"
+
+#, python-format
+msgid "Select %s"
+msgstr "Абраць %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Абярыце %s, каб зьмяніць"
+
+msgid "Date:"
+msgstr "Дата:"
+
+msgid "Time:"
+msgstr "Час:"
+
+msgid "Lookup"
+msgstr "Шукаць"
+
+msgid "Currently:"
+msgstr "У цяперашні час:"
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3dd487d
--- /dev/null
+++ b/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..48212d2
--- /dev/null
+++ b/tbc/static/admin/locale/be/LC_MESSAGES/djangojs.po
@@ -0,0 +1,169 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Viktar Palstsiuk <vipals@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Belarusian (http://www.transifex.com/django/django/language/"
+"be/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: be\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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Даступныя %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Сьпіс даступных %s. Каб нешта абраць, пазначце патрэбнае ў полі ніжэй і "
+"пстрыкніце па стрэлцы «Абраць» між двума палямі."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Каб прасеяць даступныя %s, друкуйце ў гэтым полі."
+
+msgid "Filter"
+msgstr "Прасеяць"
+
+msgid "Choose all"
+msgstr "Абраць усе"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Каб абраць усе %s, пстрыкніце тут."
+
+msgid "Choose"
+msgstr "Абраць"
+
+msgid "Remove"
+msgstr "Прыбраць"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Абралі %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Сьпіс абраных %s. Каб нешта прыбраць, пазначце патрэбнае ў полі ніжэй і "
+"пстрыкніце па стрэлцы «Прыбраць» між двума палямі."
+
+msgid "Remove all"
+msgstr "Прыбраць усё"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Каб прыбраць усе %s, пстрыкніце тут."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Абралі %(sel)s з %(cnt)s"
+msgstr[1] "Абралі %(sel)s з %(cnt)s"
+msgstr[2] "Абралі %(sel)s з %(cnt)s"
+msgstr[3] "Абралі %(sel)s з %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"У пэўных палях засталіся незахаваныя зьмены. Калі выканаць дзеяньне, "
+"незахаванае страціцца."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Абралі дзеяньне, але не захавалі зьмены ў пэўных палях. Каб захаваць, "
+"націсьніце «Добра». Дзеяньне потым трэба будзе запусьціць нанова."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Абралі дзеяньне, а ў палях нічога не зьмянялі. Мажліва, вы хацелі націснуць "
+"кнопку «Выканаць», а ня кнопку «Захаваць»."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы."
+msgstr[1] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы."
+msgstr[2] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы."
+msgstr[3] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Заўвага: Ваш час адстае на %s г ад часу на серверы."
+msgstr[1] "Заўвага: Ваш час адстае на %s г ад часу на серверы."
+msgstr[2] "Заўвага: Ваш час адстае на %s г ад часу на серверы."
+msgstr[3] "Заўвага: Ваш час адстае на %s г ад часу на серверы."
+
+msgid "Now"
+msgstr "Цяпер"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Абярыце час"
+
+msgid "Midnight"
+msgstr "Поўнач"
+
+msgid "6 a.m."
+msgstr "6 папоўначы"
+
+msgid "Noon"
+msgstr "Поўдзень"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Скасаваць"
+
+msgid "Today"
+msgstr "Сёньня"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Учора"
+
+msgid "Tomorrow"
+msgstr "Заўтра"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Студзень Люты Сакавік Красавік Травень Чэрвень Ліпень Жнівень Верасень "
+"Кастрычнік Лістапад Сьнежань"
+
+msgid "S M T W T F S"
+msgstr "Н П А С Ч П С"
+
+msgid "Show"
+msgstr "Паказаць"
+
+msgid "Hide"
+msgstr "Схаваць"
diff --git a/tbc/static/admin/locale/bg/LC_MESSAGES/django.mo b/tbc/static/admin/locale/bg/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..636eef8
--- /dev/null
+++ b/tbc/static/admin/locale/bg/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bg/LC_MESSAGES/django.po b/tbc/static/admin/locale/bg/LC_MESSAGES/django.po
new file mode 100644
index 0000000..efaccdc
--- /dev/null
+++ b/tbc/static/admin/locale/bg/LC_MESSAGES/django.po
@@ -0,0 +1,682 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Boris Chervenkov <office@sentido.bg>, 2012
+# Claude Paroz <claude@2xlibre.net>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Lyuboslav Petrov <petrov.lyuboslav@gmail.com>, 2014
+# Todor Lubenov <tgl.sysdev@gmail.com>, 2014-2015
+# Venelin Stoykov <vkstoykov@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-27 16:13+0000\n"
+"Last-Translator: Venelin Stoykov <vkstoykov@gmail.com>\n"
+"Language-Team: Bulgarian (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Успешно изтрити %(count)d %(items)s ."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Не можете да изтриете %(name)s"
+
+msgid "Are you sure?"
+msgstr "Сигурни ли сте?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Изтриване на избраните %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Администрация"
+
+msgid "All"
+msgstr "Всички"
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Не"
+
+msgid "Unknown"
+msgstr "Неизвестно"
+
+msgid "Any date"
+msgstr "Коя-да-е дата"
+
+msgid "Today"
+msgstr "Днес"
+
+msgid "Past 7 days"
+msgstr "Последните 7 дни"
+
+msgid "This month"
+msgstr "Този месец"
+
+msgid "This year"
+msgstr "Тази година"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Моля въведете правилния %(username)s и парола за администраторски акаунт. "
+"Моля забележете, че и двете полета са с главни и малки букви."
+
+msgid "Action:"
+msgstr "Действие:"
+
+msgid "action time"
+msgstr "време на действие"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id на обекта"
+
+msgid "object repr"
+msgstr "repr на обекта"
+
+msgid "action flag"
+msgstr "флаг за действие"
+
+msgid "change message"
+msgstr "промени съобщение"
+
+msgid "log entry"
+msgstr "записка"
+
+msgid "log entries"
+msgstr "записки"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Добавен \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Променени \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Изтрит \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry обект"
+
+msgid "None"
+msgstr "Празно"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Задръжте \"Control\", или \"Command\" на Mac, за да изберете повече от един."
+
+msgid "Added."
+msgstr "Добавено."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Променено %s."
+
+msgid "and"
+msgstr "и"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Добавени %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Променени %(list)s за %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Изтрити %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Няма променени полета."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Обектът %(name)s \"%(obj)s\" бе успешно добавен. Може да го редактирате по-"
+"долу. "
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s и \"%(obj)s\" са добавени успешно. Можете да добавите още едно "
+"%(name)s по-долу."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно добавен. "
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" Бяха променени успешно. Можете да ги промените отново "
+"по-долу."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" бяха променени успешно. Можете да добавите ново "
+"%(name)s по-долу."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно актуализиран. "
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Елементите трябва да бъдат избрани, за да се извършат действия по тях. Няма "
+"променени елементи."
+
+msgid "No action selected."
+msgstr "Няма избрани действия."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно изтрит. "
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s обект с първичен ключ %(key)r не съществува."
+
+#, python-format
+msgid "Add %s"
+msgstr "Добави %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Промени %s"
+
+msgid "Database error"
+msgstr "Грешка в базата данни"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s беше променено успешно."
+msgstr[1] "%(count)s %(name)s бяха променени успешно."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s е избран"
+msgstr[1] "Всички %(total_count)s са избрани"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 от %(cnt)s са избрани"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "История на промените: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Изтриването на избраните %(class_name)s %(instance)s ще наложи изтриването "
+"на следните защитени и свързани обекти: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Административен панел"
+
+msgid "Django administration"
+msgstr "Административен панел"
+
+msgid "Site administration"
+msgstr "Администрация на сайта"
+
+msgid "Log in"
+msgstr "Вход"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s администрация"
+
+msgid "Page not found"
+msgstr "Страница не е намерена"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Съжалявам, но исканата страница не е намерена."
+
+msgid "Home"
+msgstr "Начало"
+
+msgid "Server error"
+msgstr "Сървърна грешка"
+
+msgid "Server error (500)"
+msgstr "Сървърна грешка (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Сървърна грешка <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Станала е грешка. Съобщава се на администраторите на сайта по електронна "
+"поща и трябва да бъде поправено скоро. Благодарим ви за търпението."
+
+msgid "Run the selected action"
+msgstr "Стартирай избраните действия"
+
+msgid "Go"
+msgstr "Действай"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Щракнете тук, за да изберете обектите във всички страници"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Избери всички %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Изтрий избраното"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Първо въведете потребител и парола. След това ще можете да редактирате "
+"повече детайли. "
+
+msgid "Enter a username and password."
+msgstr "Въведете потребителско име и парола."
+
+msgid "Change password"
+msgstr "Промени парола"
+
+msgid "Please correct the error below."
+msgstr "Моля, поправете грешките по-долу."
+
+msgid "Please correct the errors below."
+msgstr "Моля поправете грешките по-долу."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Въведете нова парола за потребител <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Добре дошли,"
+
+msgid "View site"
+msgstr "Виж сайта"
+
+msgid "Documentation"
+msgstr "Документация"
+
+msgid "Log out"
+msgstr "Изход"
+
+msgid "Add"
+msgstr "Добави"
+
+msgid "History"
+msgstr "История"
+
+msgid "View on site"
+msgstr "Разгледай в сайта"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добави %(name)s"
+
+msgid "Filter"
+msgstr "Филтър"
+
+msgid "Remove from sorting"
+msgstr "Премахни от подреждането"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Ред на подреждане: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Обърни подреждането"
+
+msgid "Delete"
+msgstr "Изтрий"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Изтриването на обекта %(object_name)s '%(escaped_object)s' не може да бъде "
+"извършено без да се изтрият и някои свързани обекти, върху които обаче "
+"нямате права: "
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Изтриването на %(object_name)s '%(escaped_object)s' ще доведе до "
+"заличаването на следните защитени свързани обекти:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Наистина ли искате да изтриете обектите %(object_name)s \"%(escaped_object)s"
+"\"? Следните свързани елементи също ще бъдат изтрити:"
+
+msgid "Objects"
+msgstr "Обекти"
+
+msgid "Yes, I'm sure"
+msgstr "Да, сигурен съм"
+
+msgid "No, take me back"
+msgstr "Не, върни ме обратно"
+
+msgid "Delete multiple objects"
+msgstr "Изтриване на множество обекти"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Изтриването на избраните %(objects_name)s ще доведе до изтриване на свързани "
+"обекти. Вашият профил няма права за изтриване на следните типове обекти:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Изтриването на избраните %(objects_name)s ще доведе до заличаването на "
+"следните защитени свързани обекти:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Наистина ли искате да изтриете избраните %(objects_name)s? Всички изброени "
+"обекти и свързаните с тях ще бъдат изтрити:"
+
+msgid "Change"
+msgstr "Промени"
+
+msgid "Remove"
+msgstr "Премахване"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Добави друг %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Изтриване?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " По %(filter_title)s "
+
+msgid "Summary"
+msgstr "Резюме"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Моделите в %(name)s приложение"
+
+msgid "You don't have permission to edit anything."
+msgstr "Нямате права да редактирате каквото и да е."
+
+msgid "Recent Actions"
+msgstr "Последни действия"
+
+msgid "My Actions"
+msgstr "Моите действия"
+
+msgid "None available"
+msgstr "Няма налични"
+
+msgid "Unknown content"
+msgstr "Неизвестно съдържание"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Проблем с базата данни. Проверете дали необходимите таблици са създадени и "
+"дали съответния потребител има необходимите права за достъп. "
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Вие сте се автентикиран като %(username)s, но не сте оторизиран да достъпите "
+"тази страница. Бихте ли желали да влезе с друг профил."
+
+msgid "Forgotten your password or username?"
+msgstr "Забравена парола или потребителско име?"
+
+msgid "Date/time"
+msgstr "Дата/час"
+
+msgid "User"
+msgstr "Потребител"
+
+msgid "Action"
+msgstr "Действие"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Този обект няма исторя на промените. Вероятно не е добавен чрез "
+"административния панел. "
+
+msgid "Show all"
+msgstr "Покажи всички"
+
+msgid "Save"
+msgstr "Запис"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Променете избрания %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Добавяне на друг %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Изтриване на избрания %(model)s"
+
+msgid "Search"
+msgstr "Търсене"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s резултат"
+msgstr[1] "%(counter)s резултати"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s общо"
+
+msgid "Save as new"
+msgstr "Запис като нов"
+
+msgid "Save and add another"
+msgstr "Запис и нов"
+
+msgid "Save and continue editing"
+msgstr "Запис и продължение"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим Ви, че използвахте този сайт днес."
+
+msgid "Log in again"
+msgstr "Влез пак"
+
+msgid "Password change"
+msgstr "Промяна на парола"
+
+msgid "Your password was changed."
+msgstr "Паролата ви е променена."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Въведете старата си парола /за сигурност/. След това въведете желаната нова "
+"парола два пъти от съображения за сигурност"
+
+msgid "Change my password"
+msgstr "Промяна на парола"
+
+msgid "Password reset"
+msgstr "Нова парола"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Паролата е променена. Вече можете да се впишете"
+
+msgid "Password reset confirmation"
+msgstr "Парола за потвърждение"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Моля, въведете новата парола два пъти, за да може да се потвърди, че сте я "
+"написали правилно."
+
+msgid "New password:"
+msgstr "Нова парола:"
+
+msgid "Confirm password:"
+msgstr "Потвърдете паролата:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Връзката за възстановяване на паролата е невалидна, може би защото вече е "
+"използвана. Моля, поискайте нова промяна на паролата."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Ние ви пратихме мейл с инструкции за настройка на вашата парола, ако "
+"съществува профил с имейла, който сте въвели. Вие трябва да ги получат скоро."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ако не получите имейл, моля подсигурете се, че сте въвели правилно адреса с "
+"който сте се регистрирал/a и/или проверете спам папката във вашата поща."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Вие сте получили този имейл, защото сте поискали да промените паролата за "
+"вашия потребителски акаунт в %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Моля, отидете на следната страница и изберете нова парола:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Вашето потребителско име, в случай, че сте го забравили:"
+
+msgid "Thanks for using our site!"
+msgstr "Благодарим, че ползвате сайта ни!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Екипът на %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Забравили сте си паролата? Въведете своя имейл адрес по-долу, а ние ще ви "
+"изпратим инструкции за създаване на нова."
+
+msgid "Email address:"
+msgstr "E-mail адреси:"
+
+msgid "Reset my password"
+msgstr "Нова парола"
+
+msgid "All dates"
+msgstr "Всички дати"
+
+#, python-format
+msgid "Select %s"
+msgstr "Изберете %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за промяна"
+
+msgid "Date:"
+msgstr "Дата:"
+
+msgid "Time:"
+msgstr "Час:"
+
+msgid "Lookup"
+msgstr "Търсене"
+
+msgid "Currently:"
+msgstr "Сега:"
+
+msgid "Change:"
+msgstr "Промени"
diff --git a/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..c799008
--- /dev/null
+++ b/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..917e6ef
--- /dev/null
+++ b/tbc/static/admin/locale/bg/LC_MESSAGES/djangojs.po
@@ -0,0 +1,164 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Venelin Stoykov <vkstoykov@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-27 15:42+0000\n"
+"Last-Translator: Venelin Stoykov <vkstoykov@gmail.com>\n"
+"Language-Team: Bulgarian (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Налични %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Това е списък на наличните %s . Можете да изберете някои, като ги изберете в "
+"полето по-долу и след това кликнете върху \"Избор\" стрелка между двете "
+"кутии."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Въведете в това поле, за да филтрирате списъка на наличните %s."
+
+msgid "Filter"
+msgstr "Филтър"
+
+msgid "Choose all"
+msgstr "Избери всички"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Кликнете, за да изберете всички %s наведнъж."
+
+msgid "Choose"
+msgstr "Избирам"
+
+msgid "Remove"
+msgstr "Премахни"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Избрахме %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Това е списък на избрания %s. Можете да премахнете някои, като ги изберете в "
+"полето по-долу и след това щракнете върху \"Премахни\" стрелка между двете "
+"кутии."
+
+msgid "Remove all"
+msgstr "Премахване на всички"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Кликнете, за да премахнете всички избрани %s наведнъж."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s на %(cnt)s е избран"
+msgstr[1] "%(sel)s на %(cnt)s са избрани"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Имате незапазени промени по отделни полета за редактиране. Ако започнете "
+"друго, незаписаните промени ще бъдат загубени."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Вие сте избрали действие, но не сте записали промените по полета. Моля, "
+"кликнете ОК, за да се запишат. Трябва отново да започнете действие."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Вие сте избрали дадена дейност, а не сте направили някакви промени по "
+"полетата. Вероятно търсите Go бутон, а не бутона Save."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Бележка: Вие сте %s час напред от времето на сървъра."
+msgstr[1] "Бележка: Вие сте %s часа напред от времето на сървъра"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Сега"
+
+msgid "Choose a Time"
+msgstr "Изберете време"
+
+msgid "Choose a time"
+msgstr "Избери време"
+
+msgid "Midnight"
+msgstr "Полунощ"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "По обяд"
+
+msgid "6 p.m."
+msgstr "6 след обяд"
+
+msgid "Cancel"
+msgstr "Отказ"
+
+msgid "Today"
+msgstr "Днес"
+
+msgid "Choose a Date"
+msgstr "Изберете дата"
+
+msgid "Yesterday"
+msgstr "Вчера"
+
+msgid "Tomorrow"
+msgstr "Утре"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Януари Февруари Март Април Май Юни Юли Август Септември Октомври Ноември "
+"Декември"
+
+msgid "S M T W T F S"
+msgstr "Н П В С Ч П С"
+
+msgid "Show"
+msgstr "Покажи"
+
+msgid "Hide"
+msgstr "Скрий"
diff --git a/tbc/static/admin/locale/bn/LC_MESSAGES/django.mo b/tbc/static/admin/locale/bn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6bc71ff
--- /dev/null
+++ b/tbc/static/admin/locale/bn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bn/LC_MESSAGES/django.po b/tbc/static/admin/locale/bn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c846a52
--- /dev/null
+++ b/tbc/static/admin/locale/bn/LC_MESSAGES/django.po
@@ -0,0 +1,649 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Anubhab Baksi, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Tahmid Rafi <rafi.tahmid@gmail.com>, 2012-2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Bengali (http://www.transifex.com/django/django/language/"
+"bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d টি %(items)s সফলভাবে মুছে ফেলা হয়েছে"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s ডিলিট করা সম্ভব নয়"
+
+msgid "Are you sure?"
+msgstr "আপনি কি নিশ্চিত?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "সকল"
+
+msgid "Yes"
+msgstr "হ্যাঁ"
+
+msgid "No"
+msgstr "না"
+
+msgid "Unknown"
+msgstr "অজানা"
+
+msgid "Any date"
+msgstr "যে কোন তারিখ"
+
+msgid "Today"
+msgstr "‍আজ"
+
+msgid "Past 7 days"
+msgstr "শেষ ৭ দিন"
+
+msgid "This month"
+msgstr "এ মাসে"
+
+msgid "This year"
+msgstr "এ বছরে"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "কাজ:"
+
+msgid "action time"
+msgstr "কার্য সময়"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "অবজেক্ট আইডি"
+
+msgid "object repr"
+msgstr "অবজেক্ট উপস্থাপক"
+
+msgid "action flag"
+msgstr "কার্যচিহ্ন"
+
+msgid "change message"
+msgstr "বার্তা পরিবর্তন করুন"
+
+msgid "log entry"
+msgstr "লগ এন্ট্রি"
+
+msgid "log entries"
+msgstr "লগ এন্ট্রিসমূহ"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "%(object)s অ্যাড করা হয়েছে"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" ডিলিট করা হয়েছে"
+
+msgid "LogEntry Object"
+msgstr "লগ-এন্ট্রি দ্রব্য"
+
+msgid "None"
+msgstr "কিছু না"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s পরিবর্তিত হয়েছে।"
+
+msgid "and"
+msgstr "এবং"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" যুক্ত হয়েছে।"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" এর জন্য %(list)s পরিবর্তিত হয়েছে।"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" মোছা হয়েছে।"
+
+msgid "No fields changed."
+msgstr "কোন ফিল্ড পরিবর্তন হয়নি।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" সফলতার সাথে যুক্ত হয়েছে। আপনি নিচে থেকে এটি পুনরায় সম্পাদন "
+"করতে পারেন।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"\"%(obj)s\" %(name)s টি সফলতার সাথে যোগ করা হয়েছে। আপনি চাইলে নিচ থেকে আরো "
+"একটি %(name)s যোগ করতে পারেন।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" সফলতার সাথে যুক্ত হয়েছে।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" সফলতার সাথে পরিবর্তিত হয়েছে।"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "কাজ করার আগে বস্তুগুলিকে অবশ্যই চিহ্নিত করতে হবে। কোনো বস্তু পরিবর্তিত হয়নি।"
+
+msgid "No action selected."
+msgstr "কোনো কাজ "
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" সফলতার সাথে মুছে ফেলা হয়েছে।"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r প্রাইমারি কি সম্বলিত %(name)s অবজেক্ট এর অস্তিত্ব নেই।"
+
+#, python-format
+msgid "Add %s"
+msgstr "%s যোগ করুন"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s পরিবর্তন করুন"
+
+msgid "Database error"
+msgstr "ডাটাবেস সমস্যা"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s টি থেকে ০ টি সিলেক্ট করা হয়েছে"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "ইতিহাস পরিবর্তনঃ %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "জ্যাঙ্গো সাইট প্রশাসক"
+
+msgid "Django administration"
+msgstr "জ্যাঙ্গো প্রশাসন"
+
+msgid "Site administration"
+msgstr "সাইট প্রশাসন"
+
+msgid "Log in"
+msgstr "প্রবেশ করুন"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "পৃষ্ঠা পাওয়া যায়নি"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "দুঃখিত, অনুরোধকৃত পাতাটি পাওয়া যায়নি।"
+
+msgid "Home"
+msgstr "নীড়পাতা"
+
+msgid "Server error"
+msgstr "সার্ভার সমস্যা"
+
+msgid "Server error (500)"
+msgstr "সার্ভার সমস্যা (৫০০)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "সার্ভার সমস্যা <em>(৫০০)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "চিহ্নিত কাজটি শুরু করুন"
+
+msgid "Go"
+msgstr "যান"
+
+msgid "Click here to select the objects across all pages"
+msgstr "সকল পৃষ্ঠার দ্রব্য পছন্দ করতে এখানে ক্লিক করুন"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "%(total_count)s টি %(module_name)s এর সবগুলোই সিলেক্ট করুন"
+
+msgid "Clear selection"
+msgstr "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"প্রথমে একটি সদস্যনাম ও পাসওয়ার্ড প্রবেশ করান। তারপরে আপনি ‍আরও সদস্য-অপশন যুক্ত করতে "
+"পারবেন।"
+
+msgid "Enter a username and password."
+msgstr "ইউজার নেইম এবং পাসওয়ার্ড টাইপ করুন।"
+
+msgid "Change password"
+msgstr "পাসওয়ার্ড বদলান"
+
+msgid "Please correct the error below."
+msgstr "অনুগ্রহ করে নিচের ভুলগুলো সংশোধন করুন।"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> সদস্যের জন্য নতুন পাসওয়ার্ড দিন।"
+
+msgid "Welcome,"
+msgstr "স্বাগতম,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "সহায়িকা"
+
+msgid "Log out"
+msgstr "প্রস্থান"
+
+msgid "Add"
+msgstr "যোগ করুন"
+
+msgid "History"
+msgstr "ইতিহাস"
+
+msgid "View on site"
+msgstr "সাইটে দেখুন"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s যোগ করুন"
+
+msgid "Filter"
+msgstr "ফিল্টার"
+
+msgid "Remove from sorting"
+msgstr "ক্রমানুসারে সাজানো থেকে বিরত হোন"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "সাজানোর ক্রম: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "ক্রমানুসারে সাজানো চালু করুন/ বন্ধ করুন"
+
+msgid "Delete"
+msgstr "মুছুন"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' মুছে ফেললে এর সম্পর্কিত অবজেক্টগুলোও মুছে "
+"যাবে, কিন্তু আপনার নিম্নবর্ণিত অবজেক্টগুলো মোছার অধিকার নেইঃ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"আপনি কি %(object_name)s \"%(escaped_object)s\" মুছে ফেলার ব্যাপারে নিশ্চিত? "
+"নিম্নে বর্ণিত সকল আইটেম মুছে যাবেঃ"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "হ্যা়ঁ, আমি নিশ্চিত"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "একাধিক জিনিস মুছে ফেলুন"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "পরিবর্তন"
+
+msgid "Remove"
+msgstr "মুছে ফেলুন"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "আরো একটি %(verbose_name)s যোগ করুন"
+
+msgid "Delete?"
+msgstr "মুছে ফেলুন?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s অনুযায়ী "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো"
+
+msgid "You don't have permission to edit anything."
+msgstr "কোন কিছু পরিবর্তনে আপনার অধিকার নেই।"
+
+msgid "Recent Actions"
+msgstr "সাম্প্রতিক কার্যাবলী"
+
+msgid "My Actions"
+msgstr "আমার কার্যাবলী"
+
+msgid "None available"
+msgstr "কিছুই পাওয়া যায়নি"
+
+msgid "Unknown content"
+msgstr "অজানা বিষয়"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"আপনার ডাটাবেস ইনস্টলে সমস্যা হয়েছে। নিশ্চিত করুন যে, ডাটাবেস টেবিলগুলো সঠিকভাবে "
+"তৈরী হয়েছে, এবং যথাযথ সদস্যের ডাটাবেস পড়ার অধিকার রয়েছে।"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "ইউজার নেইম অথবা পাসওয়ার্ড ভুলে গেছেন?"
+
+msgid "Date/time"
+msgstr "তারিখ/সময়"
+
+msgid "User"
+msgstr "সদস্য"
+
+msgid "Action"
+msgstr "কার্য"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "এই অবজেক্টের কোন ইতিহাস নেই। সম্ভবত এটি প্রশাসন সাইট দিয়ে তৈরী করা হয়নি।"
+
+msgid "Show all"
+msgstr "সব দেখান"
+
+msgid "Save"
+msgstr "সংরক্ষণ করুন"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "সার্চ"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "মোট %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "নতুনভাবে সংরক্ষণ করুন"
+
+msgid "Save and add another"
+msgstr "সংরক্ষণ করুন এবং আরেকটি যোগ করুন"
+
+msgid "Save and continue editing"
+msgstr "সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যান"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ওয়েবসাইটে কিছু সময় কাটানোর জন্য আপনাকে আন্তরিক ধন্যবাদ।"
+
+msgid "Log in again"
+msgstr "পুনরায় প্রবেশ করুন"
+
+msgid "Password change"
+msgstr "পাসওয়ার্ড বদলান"
+
+msgid "Your password was changed."
+msgstr "আপনার পাসওয়ার্ড বদলানো হয়েছে।"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"অনুগ্রহ করে আপনার পুরনো পাসওয়ার্ড প্রবেশ করান, নিরাপত্তার কাতিরে, এবং পরপর দু’বার "
+"নতুন পাসওয়ার্ড প্রবেশ করান, যাচাই করার জন্য।"
+
+msgid "Change my password"
+msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন"
+
+msgid "Password reset"
+msgstr "পাসওয়ার্ড রিসেট করুন"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "আপনার পাসওয়ার্ড দেয়া হয়েছে। আপনি এখন প্রবেশ (লগইন) করতে পারেন।"
+
+msgid "Password reset confirmation"
+msgstr "পাসওয়ার্ড রিসেট নিশ্চিত করুন"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"অনুগ্রহ করে আপনার পাসওয়ার্ড দুবার প্রবেশ করান, যাতে আমরা যাচাই করতে পারি আপনি "
+"সঠিকভাবে টাইপ করেছেন।"
+
+msgid "New password:"
+msgstr "নতুন পাসওয়ার্ডঃ"
+
+msgid "Confirm password:"
+msgstr "পাসওয়ার্ড নিশ্চিতকরণঃ"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"পাসওয়ার্ড রিসেট লিঙ্কটি ঠিক নয়, হয়তো এটা ইতোমধ্যে ব্যবহৃত হয়েছে। পাসওয়ার্ড "
+"রিসেটের জন্য অনুগ্রহ করে নতুনভাবে আবেদন করুন।"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"আপনি এই ই-মেইলটি পেয়েছেন কারন আপনি %(site_name)s এ আপনার ইউজার একাউন্টের "
+"পাসওয়ার্ড রিসেট এর জন্য অনুরোধ করেছেন।"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "অনুগ্রহ করে নিচের পাতাটিতে যান এবং নতুন পাসওয়ার্ড বাছাই করুনঃ"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "আপনার সদস্যনাম, যদি ভুলে গিয়ে থাকেনঃ"
+
+msgid "Thanks for using our site!"
+msgstr "আমাদের সাইট ব্যবহারের জন্য ধন্যবাদ!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s দল"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"পাসওয়ার্ড ভুলে গেছেন? নিচে আপনার ইমেইল এড্রেস দিন, এবং আমরা নতুন পাসওয়ার্ড সেট "
+"করার নিয়ম-কানুন আপনাকে ই-মেইল করব।"
+
+msgid "Email address:"
+msgstr "ইমেইল ঠিকানা:"
+
+msgid "Reset my password"
+msgstr "আমার পাসওয়ার্ড রিসেট করুন"
+
+msgid "All dates"
+msgstr "সকল তারিখ"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s বাছাই করুন"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s পরিবর্তনের জন্য বাছাই করুন"
+
+msgid "Date:"
+msgstr "তারিখঃ"
+
+msgid "Time:"
+msgstr "সময়ঃ"
+
+msgid "Lookup"
+msgstr "খুঁজুন"
+
+msgid "Currently:"
+msgstr "বর্তমান অবস্থা:"
+
+msgid "Change:"
+msgstr "পরিবর্তন:"
diff --git a/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..34798aa
--- /dev/null
+++ b/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..47600a2
--- /dev/null
+++ b/tbc/static/admin/locale/bn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,152 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Tahmid Rafi <rafi.tahmid@gmail.com>, 2013
+# Tahmid Rafi <rafi.tahmid@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Bengali (http://www.transifex.com/django/django/language/"
+"bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s বিদ্যমান"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "ফিল্টার"
+
+msgid "Choose all"
+msgstr "সব বাছাই করুন"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "সব %s একবারে বাছাই করার জন্য ক্লিক করুন।"
+
+msgid "Choose"
+msgstr "বাছাই করুন"
+
+msgid "Remove"
+msgstr "মুছে ফেলুন"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s বাছাই করা হয়েছে"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr "সব মুছে ফেলুন"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।"
+msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।"
+msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।"
+
+msgid "Now"
+msgstr "এখন"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "সময় নির্বাচন করুন"
+
+msgid "Midnight"
+msgstr "মধ্যরাত"
+
+msgid "6 a.m."
+msgstr "৬ পূর্বাহ্ন"
+
+msgid "Noon"
+msgstr "দুপুর"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "বাতিল"
+
+msgid "Today"
+msgstr "আজ"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "গতকাল"
+
+msgid "Tomorrow"
+msgstr "আগামীকাল"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"জানুয়ারি ফেব্রুয়ারি মার্চ এপ্রিল মে জুন জুলাই অাগস্ট সেপ্টেম্বর অক্টোবর নভেম্বর ডিসেম্বর"
+
+msgid "S M T W T F S"
+msgstr "র স ম ব ব শ শ"
+
+msgid "Show"
+msgstr "দেখান"
+
+msgid "Hide"
+msgstr "লুকান"
diff --git a/tbc/static/admin/locale/br/LC_MESSAGES/django.mo b/tbc/static/admin/locale/br/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6efaae3
--- /dev/null
+++ b/tbc/static/admin/locale/br/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/br/LC_MESSAGES/django.po b/tbc/static/admin/locale/br/LC_MESSAGES/django.po
new file mode 100644
index 0000000..bb33c14
--- /dev/null
+++ b/tbc/static/admin/locale/br/LC_MESSAGES/django.po
@@ -0,0 +1,624 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Fulup <fulup.jakez@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: br\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "Ha sur oc'h ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "An holl"
+
+msgid "Yes"
+msgstr "Ya"
+
+msgid "No"
+msgstr "Ket"
+
+msgid "Unknown"
+msgstr "Dianav"
+
+msgid "Any date"
+msgstr "Forzh pegoulz"
+
+msgid "Today"
+msgstr "Hiziv"
+
+msgid "Past 7 days"
+msgstr "Er 7 devezh diwezhañ"
+
+msgid "This month"
+msgstr "Ar miz-mañ"
+
+msgid "This year"
+msgstr "Ar bloaz-mañ"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Ober :"
+
+msgid "action time"
+msgstr "eur an ober"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr "Kemennadenn gemmañ"
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr "Traezenn eus ar marilh"
+
+msgid "None"
+msgstr "Hini ebet"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Kemmet %s."
+
+msgid "and"
+msgstr "ha"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr "N'eus bet kemmet maezienn ebet."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "Ouzhpennañ %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Kemmañ %s"
+
+msgid "Database error"
+msgstr "Fazi en diaz roadennoù"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Istor ar c'hemmoù : %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Lec'hienn verañ Django"
+
+msgid "Django administration"
+msgstr "Merañ Django"
+
+msgid "Site administration"
+msgstr "Merañ al lec'hienn"
+
+msgid "Log in"
+msgstr "Kevreañ"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "N'eo ket bet kavet ar bajenn"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr "Degemer"
+
+msgid "Server error"
+msgstr "Fazi servijer"
+
+msgid "Server error (500)"
+msgstr "Fazi servijer (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Fazi servijer <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr "Mont"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr "Riñsañ an diuzadenn"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr "Merkit un anv implijer hag ur ger-tremen."
+
+msgid "Change password"
+msgstr "Cheñch ger-tremen"
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "Degemer mat,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Teulioù"
+
+msgid "Log out"
+msgstr "Digevreañ"
+
+msgid "Add"
+msgstr "Ouzhpennañ"
+
+msgid "History"
+msgstr "Istor"
+
+msgid "View on site"
+msgstr "Gwelet war al lec'hienn"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ouzhpennañ %(name)s"
+
+msgid "Filter"
+msgstr "Sil"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr "Eilpennañ an diuzadenn"
+
+msgid "Delete"
+msgstr "Diverkañ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ya, sur on"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "Kemmañ"
+
+msgid "Remove"
+msgstr "Lemel kuit"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr "Diverkañ ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " dre %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr "Ma oberoù"
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr "Endalc'had dianav"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Disoñjet ho ker-tremen pe hoc'h anv implijer ganeoc'h ?"
+
+msgid "Date/time"
+msgstr "Deiziad/eur"
+
+msgid "User"
+msgstr "Implijer"
+
+msgid "Action"
+msgstr "Ober"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr "Diskouez pep tra"
+
+msgid "Save"
+msgstr "Enrollañ"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Klask"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr "Enrollañ evel nevez"
+
+msgid "Save and add another"
+msgstr "Enrollañ hag ouzhpennañ unan all"
+
+msgid "Save and continue editing"
+msgstr "Enrollañ ha derc'hel da gemmañ"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr "Kevreañ en-dro"
+
+msgid "Password change"
+msgstr "Cheñch ho ker-tremen"
+
+msgid "Your password was changed."
+msgstr "Cheñchet eo bet ho ker-tremen."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr "Cheñch ma ger-tremen"
+
+msgid "Password reset"
+msgstr "Adderaouekaat ar ger-tremen"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr "Kadarnaat eo bet cheñchet ar ger-tremen"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr "Ger-tremen nevez :"
+
+msgid "Confirm password:"
+msgstr "Kadarnaat ar ger-tremen :"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr "Ho trugarekaat da ober gant hol lec'hienn !"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr "An holl zeiziadoù"
+
+#, python-format
+msgid "Select %s"
+msgstr "Diuzañ %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr "Deiziad :"
+
+msgid "Time:"
+msgstr "Eur :"
+
+msgid "Lookup"
+msgstr "Klask"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..4d0461f
--- /dev/null
+++ b/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9ad1005
--- /dev/null
+++ b/tbc/static/admin/locale/br/LC_MESSAGES/djangojs.po
@@ -0,0 +1,149 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Fulup <fulup.jakez@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: br\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Hegerz %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Sil"
+
+msgid "Choose all"
+msgstr "Dibab an holl"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klikañ evit dibab an holl %s war un dro."
+
+msgid "Choose"
+msgstr "Dibab"
+
+msgid "Remove"
+msgstr "Lemel kuit"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Dibabet %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr "Lemel kuit pep tra"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klikañ evit dilemel an holl %s dibabet war un dro."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Bremañ"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Dibab un eur"
+
+msgid "Midnight"
+msgstr "Hanternoz"
+
+msgid "6 a.m."
+msgstr "6e00"
+
+msgid "Noon"
+msgstr "Kreisteiz"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Nullañ"
+
+msgid "Today"
+msgstr "Hiziv"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Dec'h"
+
+msgid "Tomorrow"
+msgstr "Warc'hoazh"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Genver C'hwevrer Meurzh Ebrel Mae Mezheven Gouere Eost Gwengolo Here Du Kerzu"
+
+msgid "S M T W T F S"
+msgstr "S L M M Y G S"
+
+msgid "Show"
+msgstr "Diskouez"
+
+msgid "Hide"
+msgstr "Kuzhat"
diff --git a/tbc/static/admin/locale/bs/LC_MESSAGES/django.mo b/tbc/static/admin/locale/bs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6e9e94c
--- /dev/null
+++ b/tbc/static/admin/locale/bs/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bs/LC_MESSAGES/django.po b/tbc/static/admin/locale/bs/LC_MESSAGES/django.po
new file mode 100644
index 0000000..89390a1
--- /dev/null
+++ b/tbc/static/admin/locale/bs/LC_MESSAGES/django.po
@@ -0,0 +1,652 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Filip Dupanović <filip.dupanovic@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Bosnian (http://www.transifex.com/django/django/language/"
+"bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bs\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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Uspješno izbrisano %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "Da li ste sigurni?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Izbriši odabrane %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Svi"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Nepoznato"
+
+msgid "Any date"
+msgstr "Svi datumi"
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Past 7 days"
+msgstr "Poslednjih 7 dana"
+
+msgid "This month"
+msgstr "Ovaj mesec"
+
+msgid "This year"
+msgstr "Ova godina"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Radnja:"
+
+msgid "action time"
+msgstr "vrijeme radnje"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id objekta"
+
+msgid "object repr"
+msgstr "repr objekta"
+
+msgid "action flag"
+msgstr "oznaka radnje"
+
+msgid "change message"
+msgstr "opis izmjene"
+
+msgid "log entry"
+msgstr "zapis u logovima"
+
+msgid "log entries"
+msgstr "zapisi u logovima"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "Nijedan"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Promijenjeno %s."
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodano %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Promijeni %(list)s za %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Izbrisani %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nije bilo izmjena polja."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Objekat „%(obj)s“ klase %(name)s dodat je uspješno. Dole možete unjeti "
+"dodatne izmjene."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s sačuvan je uspješno."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s izmjenjen je uspješno."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Predmeti moraju biti izabrani da bi se mogla obaviti akcija nad njima. "
+"Nijedan predmet nije bio izmjenjen."
+
+msgid "No action selected."
+msgstr "Nijedna akcija nije izabrana."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s obrisan je uspješno."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objekat klase %(name)s sa primarnim ključem %(key)r ne postoji."
+
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj objekat klase %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Izmjeni objekat klase %s"
+
+msgid "Database error"
+msgstr "Greška u bazi podataka"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 od %(cnt)s izabrani"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historijat izmjena: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django administracija sajta"
+
+msgid "Django administration"
+msgstr "Django administracija"
+
+msgid "Site administration"
+msgstr "Administracija sistema"
+
+msgid "Log in"
+msgstr "Prijava"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Stranica nije pronađena"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Žao nam je, tražena stranica nije pronađena."
+
+msgid "Home"
+msgstr "Početna"
+
+msgid "Server error"
+msgstr "Greška na serveru"
+
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Pokreni odabranu radnju"
+
+msgid "Go"
+msgstr "Počni"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliknite ovdje da izaberete objekte preko svih stranica"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Izaberite svih %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Izbrišite izbor"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Prvo unesite korisničko ime i lozinku. Potom ćete moći da mijenjate još "
+"korisničkih podešavanja."
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "Promjena lozinke"
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Unesite novu lozinku za korisnika <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+msgid "Log out"
+msgstr "Odjava"
+
+msgid "Add"
+msgstr "Dodaj"
+
+msgid "History"
+msgstr "Historijat"
+
+msgid "View on site"
+msgstr "Pregled na sajtu"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj objekat klase %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Obriši"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih "
+"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za "
+"brisanje slijedećih tipova objekata:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Da li ste sigurni da želite da obrišete %(object_name)s "
+"„%(escaped_object)s“? Slijedeći objekti koji su u vezi sa ovim objektom će "
+"također biti obrisani:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Brisanje više objekata"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "Izmjeni"
+
+msgid "Remove"
+msgstr "Obriši"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Dodaj još jedan %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Brisanje?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Nemate dozvole da unosite bilo kakve izmjene."
+
+msgid "Recent Actions"
+msgstr "Posjlednje radnje"
+
+msgid "My Actions"
+msgstr "Moje radnje"
+
+msgid "None available"
+msgstr "Nema podataka"
+
+msgid "Unknown content"
+msgstr "Nepoznat sadržaj"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Nešto nije uredu sa vašom bazom podataka. Provjerite da li postoje "
+"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "Datum/vrijeme"
+
+msgid "User"
+msgstr "Korisnik"
+
+msgid "Action"
+msgstr "Radnja"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ovaj objekat nema zabilježen historijat izmjena. Vjerovatno nije dodan kroz "
+"ovaj sajt za administraciju."
+
+msgid "Show all"
+msgstr "Prikaži sve"
+
+msgid "Save"
+msgstr "Sačuvaj"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Pretraga"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "ukupno %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Sačuvaj kao novi"
+
+msgid "Save and add another"
+msgstr "Sačuvaj i dodaj slijedeći"
+
+msgid "Save and continue editing"
+msgstr "Sačuvaj i nastavi sa izmjenama"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala što ste danas proveli vrijeme na ovom sajtu."
+
+msgid "Log in again"
+msgstr "Ponovna prijava"
+
+msgid "Password change"
+msgstr "Izmjena lozinke"
+
+msgid "Your password was changed."
+msgstr "Vaša lozinka je izmjenjena."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Iz bezbjednosnih razloga prvo unesite svoju staru lozinku, a novu zatim "
+"unesite dva puta da bismo mogli da provjerimo da li ste je pravilno unijeli."
+
+msgid "Change my password"
+msgstr "Izmijeni moju lozinku"
+
+msgid "Password reset"
+msgstr "Resetovanje lozinke"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaša lozinka je postavljena. Možete se prijaviti."
+
+msgid "Password reset confirmation"
+msgstr "Potvrda resetovanja lozinke"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Unesite novu lozinku dva puta kako bismo mogli da provjerimo da li ste je "
+"pravilno unijeli."
+
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+msgid "Confirm password:"
+msgstr "Potvrda lozinke:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Link za resetovanje lozinke nije važeći, vjerovatno zato što je već "
+"iskorišćen. Ponovo zatražite resetovanje lozinke."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Idite na slijedeću stranicu i postavite novu lozinku."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Ukoliko ste zaboravili, vaše korisničko ime:"
+
+msgid "Thanks for using our site!"
+msgstr "Hvala što koristite naš sajt!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Uredništvo sajta %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Resetuj moju lozinku"
+
+msgid "All dates"
+msgstr "Svi datumi"
+
+#, python-format
+msgid "Select %s"
+msgstr "Odaberi objekat klase %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Odaberi objekat klase %s za izmjenu"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Vrijeme:"
+
+msgid "Lookup"
+msgstr "Pretraži"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a20f7b2
--- /dev/null
+++ b/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a21a705
--- /dev/null
+++ b/tbc/static/admin/locale/bs/LC_MESSAGES/djangojs.po
@@ -0,0 +1,155 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Filip Dupanović <filip.dupanovic@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Bosnian (http://www.transifex.com/django/django/language/"
+"bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bs\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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostupno %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Odaberi sve"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "Ukloni"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Odabrani %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Izabran %(sel)s od %(cnt)s"
+msgstr[1] "Izabrano %(sel)s od %(cnt)s"
+msgstr[2] "Izabrano %(sel)s od %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Imate nespašene izmjene na pojedinim uređenim poljima. Ako pokrenete ovu "
+"akciju, te izmjene će biti izgubljene."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/ca/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ca/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..f52296b
--- /dev/null
+++ b/tbc/static/admin/locale/ca/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ca/LC_MESSAGES/django.po b/tbc/static/admin/locale/ca/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4f183b0
--- /dev/null
+++ b/tbc/static/admin/locale/ca/LC_MESSAGES/django.po
@@ -0,0 +1,684 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Antoni Aloy <aaloy@apsl.net>, 2014-2015
+# Carles Barrobés <carles@barrobes.com>, 2011-2012,2014
+# duub qnnp, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Roger Pons <rogerpons@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-21 12:00+0000\n"
+"Last-Translator: Roger Pons <rogerpons@gmail.com>\n"
+"Language-Team: Catalan (http://www.transifex.com/django/django/language/"
+"ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Eliminat/s %(count)d %(items)s satisfactòriament."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "No es pot esborrar %(name)s"
+
+msgid "Are you sure?"
+msgstr "N'esteu segur?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar els %(verbose_name_plural)s seleccionats"
+
+msgid "Administration"
+msgstr "Administració"
+
+msgid "All"
+msgstr "Tots"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Desconegut"
+
+msgid "Any date"
+msgstr "Qualsevol data"
+
+msgid "Today"
+msgstr "Avui"
+
+msgid "Past 7 days"
+msgstr "Últims 7 dies"
+
+msgid "This month"
+msgstr "Aquest mes"
+
+msgid "This year"
+msgstr "Aquest any"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Si us plau, introduïu un %(username)s i contrasenya correcta per un compte "
+"de personal. Observeu que ambdós camps són sensibles a majúscules."
+
+msgid "Action:"
+msgstr "Acció:"
+
+msgid "action time"
+msgstr "moment de l'acció"
+
+msgid "user"
+msgstr "usuari"
+
+msgid "content type"
+msgstr "tipus de contingut"
+
+msgid "object id"
+msgstr "id de l'objecte"
+
+msgid "object repr"
+msgstr "'repr' de l'objecte"
+
+msgid "action flag"
+msgstr "indicador de l'acció"
+
+msgid "change message"
+msgstr "missatge del canvi"
+
+msgid "log entry"
+msgstr "entrada del registre"
+
+msgid "log entries"
+msgstr "entrades del registre"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Afegit \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Modificat \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Eliminat \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objecte entrada del registre"
+
+msgid "None"
+msgstr "cap"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Premi \"Control\" o \"Command\" a un Mac per seleccionar-ne més d'un."
+
+msgid "Added."
+msgstr "Afegit."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modificat %s."
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Afegit %(name)s \"%(object)s\""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificat %(list)s per a %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Eliminat %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Cap camp modificat."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"S'ha afegit amb èxit el/la %(name)s \"%(obj)s\". Pot editar-lo de nou a sota."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s fou afegit satisfactòriament. Pot afegir un altre "
+"%(name)s a continuació."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "El/la %(name)s \"%(obj)s\" ha estat afegit/da amb èxit."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fou canviat satisfactòriament. Pot editar-lo un "
+"altra vegada a continuació."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fou canviat satisfactòriament. Pot afegir un altre "
+"%(name)s a continuació."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "S'ha modificat amb èxit el/la %(name)s \"%(obj)s."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Heu de seleccionar els elements per poder realitzar-hi accions. No heu "
+"seleccionat cap element."
+
+msgid "No action selected."
+msgstr "no heu seleccionat cap acció"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "El/la %(name)s \"%(obj)s\" s'ha eliminat amb èxit."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "No existeix cap objecte %(name)s amb la clau primària %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Afegir %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Error de base de dades"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s s'ha modificat amb èxit."
+msgstr[1] "%(count)s %(name)s s'han modificat amb èxit."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionat(s)"
+msgstr[1] "Tots %(total_count)s seleccionat(s)"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s seleccionats"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Modificar històric: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Esborrar %(class_name)s %(instance)s requeriria esborrar els següents "
+"objectes relacionats protegits: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Lloc administratiu de Django"
+
+msgid "Django administration"
+msgstr "Administració de Django"
+
+msgid "Site administration"
+msgstr "Administració del lloc"
+
+msgid "Log in"
+msgstr "Iniciar sessió"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administració de %(app)s"
+
+msgid "Page not found"
+msgstr "No s'ha pogut trobar la pàgina"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada"
+
+msgid "Home"
+msgstr "Inici"
+
+msgid "Server error"
+msgstr "Error del servidor"
+
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error del servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"S'ha produït un error. Se n'ha informat els administradors del lloc per "
+"correu electrònic, i hauria d'arreglar-se en breu. Gràcies per la vostra "
+"paciència."
+
+msgid "Run the selected action"
+msgstr "Executar l'acció seleccionada"
+
+msgid "Go"
+msgstr "Anar"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Feu clic aquí per seleccionar els objectes a totes les pàgines"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccioneu tots %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Netejar la selecció"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primer, entreu un nom d'usuari i una contrasenya. Després podreu editar més "
+"opcions de l'usuari."
+
+msgid "Enter a username and password."
+msgstr "Introduïu un nom d'usuari i contrasenya."
+
+msgid "Change password"
+msgstr "Canviar contrasenya"
+
+msgid "Please correct the error below."
+msgstr "Si us plau, corregiu els errors mostrats a sota."
+
+msgid "Please correct the errors below."
+msgstr "Si us plau, corregiu els errors mostrats a sota."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Introduïu una contrasenya per l'usuari <strong>%(username)s</strong>"
+
+msgid "Welcome,"
+msgstr "Benvingut/da,"
+
+msgid "View site"
+msgstr "Veure lloc"
+
+msgid "Documentation"
+msgstr "Documentació"
+
+msgid "Log out"
+msgstr "Finalitzar sessió"
+
+msgid "Add"
+msgstr "Afegir"
+
+msgid "History"
+msgstr "Històric"
+
+msgid "View on site"
+msgstr "Veure al lloc"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Afegir %(name)s"
+
+msgid "Filter"
+msgstr "Filtre"
+
+msgid "Remove from sorting"
+msgstr "Treure de la ordenació"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritat d'ordenació: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Commutar ordenació"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació "
+"d'objectes relacionats, però el vostre compte no te permisos per esborrar "
+"els tipus d'objecte següents:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Esborrar %(object_name)s '%(escaped_object)s' requeriria esborrar els "
+"següents objectes relacionats protegits:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Esteu segurs de voler esborrar els/les %(object_name)s \"%(escaped_object)s"
+"\"? S'esborraran els següents elements relacionats:"
+
+msgid "Objects"
+msgstr "Objectes"
+
+msgid "Yes, I'm sure"
+msgstr "Sí, n'estic segur"
+
+msgid "No, take me back"
+msgstr "No, torna endarrere"
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples objectes"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Esborrar els %(objects_name)s seleccionats faria que s'esborréssin objectes "
+"relacionats, però el vostre compte no té permisos per esborrar els següents "
+"tipus d'objectes:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Esborrar els %(objects_name)s seleccionats requeriria esborrar els següents "
+"objectes relacionats protegits:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"N'esteu segur de voler esborrar els %(objects_name)s seleccionats? "
+"S'esborraran tots els objects següents i els seus elements relacionats:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Afegir un/a altre/a %(verbose_name)s."
+
+msgid "Delete?"
+msgstr "Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Per %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resum"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Models en l'aplicació %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "No teniu permís per editar res."
+
+msgid "Recent Actions"
+msgstr "Accions recents"
+
+msgid "My Actions"
+msgstr "Les meves accions"
+
+msgid "None available"
+msgstr "Cap disponible"
+
+msgid "Unknown content"
+msgstr "Contingut desconegut"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hi ha algun problema a la instal·lació de la vostra base de dades. Assegureu-"
+"vos que s'han creat les taules adients, i que la base de dades és llegible "
+"per l'usuari apropiat."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Esteu identificats com a %(username)s, però no esteu autoritzats a accedir a "
+"aquesta pàgina. Voleu identificar-vos amb un compte d'usuari diferent?"
+
+msgid "Forgotten your password or username?"
+msgstr "Heu oblidat la vostra contrasenya o nom d'usuari?"
+
+msgid "Date/time"
+msgstr "Data/hora"
+
+msgid "User"
+msgstr "Usuari"
+
+msgid "Action"
+msgstr "Acció"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Aquest objecte no té historial de canvis. Probablement no es va afegir "
+"utilitzant aquest lloc administratiu."
+
+msgid "Show all"
+msgstr "Mostrar tots"
+
+msgid "Save"
+msgstr "Desar"
+
+msgid "Popup closing..."
+msgstr "Tancant el contingut emergent..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Canviea el %(model)s seleccionat"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Afegeix un altre %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Esborra el %(model)s seleccionat"
+
+msgid "Search"
+msgstr "Cerca"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultat"
+msgstr[1] "%(counter)s resultats"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s en total"
+
+msgid "Save as new"
+msgstr "Desar com a nou"
+
+msgid "Save and add another"
+msgstr "Desar i afegir-ne un de nou"
+
+msgid "Save and continue editing"
+msgstr "Desar i continuar editant"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gràcies per passar una estona de qualitat al web durant el dia d'avui."
+
+msgid "Log in again"
+msgstr "Iniciar sessió de nou"
+
+msgid "Password change"
+msgstr "Canvi de contrasenya"
+
+msgid "Your password was changed."
+msgstr "La seva contrasenya ha estat canviada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Si us plau, introduïu la vostra contrasenya antiga, per seguretat, i tot "
+"seguit introduïu la vostra contrasenya nova dues vegades per verificar que "
+"l'heu escrita correctament."
+
+msgid "Change my password"
+msgstr "Canviar la meva contrasenya:"
+
+msgid "Password reset"
+msgstr "Restablir contrasenya"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"S'ha canviat la vostra contrasenya. Ara podeu continuar i iniciar sessió."
+
+msgid "Password reset confirmation"
+msgstr "Confirmació de restabliment de contrasenya"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Si us plau, introduïu la vostra nova contrasenya dues vegades, per verificar "
+"que l'heu escrita correctament."
+
+msgid "New password:"
+msgstr "Contrasenya nova:"
+
+msgid "Confirm password:"
+msgstr "Confirmar contrasenya:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"L'enllaç de restabliment de contrasenya era invàlid, potser perquè ja s'ha "
+"utilitzat. Si us plau, sol·liciteu un nou reestabliment de contrasenya."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Li hem enviat instruccions per establir la seva contrasenya, donat que hi "
+"hagi un compte associat al correu introduït. L'hauríeu de rebre en breu."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si no rebeu un correu, assegureu-vos que heu introduït l'adreça amb la que "
+"us vau registrar, i comproveu la vostra carpeta de \"spam\"."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Heu rebut aquest correu perquè vau sol·licitar restablir la contrasenya per "
+"al vostre compte d'usuari a %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Si us plau, aneu a la pàgina següent i escolliu una nova contrasenya:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "El vostre nom d'usuari, en cas que l'hagueu oblidat:"
+
+msgid "Thanks for using our site!"
+msgstr "Gràcies per fer ús del nostre lloc!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'equip de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Heu oblidat la vostra contrasenya? Introduïu la vostra adreça de correu "
+"electrònic a sota, i us enviarem instruccions per canviar-la."
+
+msgid "Email address:"
+msgstr "Adreça de correu electrònic:"
+
+msgid "Reset my password"
+msgstr "Restablir la meva contrasenya"
+
+msgid "All dates"
+msgstr "Totes les dates"
+
+#, python-format
+msgid "Select %s"
+msgstr "Seleccioneu %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccioneu %s per modificar"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Cercar"
+
+msgid "Currently:"
+msgstr "Actualment:"
+
+msgid "Change:"
+msgstr "Canviar:"
diff --git a/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..37f4a42
--- /dev/null
+++ b/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..09c23c9
--- /dev/null
+++ b/tbc/static/admin/locale/ca/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Carles Barrobés <carles@barrobes.com>, 2011-2012,2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Roger Pons <rogerpons@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-21 12:05+0000\n"
+"Last-Translator: Roger Pons <rogerpons@gmail.com>\n"
+"Language-Team: Catalan (http://www.transifex.com/django/django/language/"
+"ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Aquesta és la llista de %s disponibles. En podeu escollir alguns "
+"seleccionant-los a la caixa de sota i fent clic a la fletxa \"Escollir\" "
+"entre les dues caixes."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s disponibles."
+
+msgid "Filter"
+msgstr "Filtre"
+
+msgid "Choose all"
+msgstr "Escollir-los tots"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Feu clic per escollir tots els %s d'un cop."
+
+msgid "Choose"
+msgstr "Escollir"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Escollit %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Aquesta és la llista de %s escollits. En podeu eliminar alguns seleccionant-"
+"los a la caixa de sota i fent clic a la fletxa \"Eliminar\" entre les dues "
+"caixes."
+
+msgid "Remove all"
+msgstr "Esborrar-los tots"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Feu clic per eliminar tots els %s escollits d'un cop."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seleccionat"
+msgstr[1] "%(sel)s of %(cnt)s seleccionats"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Teniu canvis sense desar a camps editables individuals. Si executeu una "
+"acció, es perdran aquests canvis no desats."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Heu seleccionat una acció, però encara no heu desat els vostres canvis a "
+"camps individuals. Si us plau premeu OK per desar. Haureu de tornar a "
+"executar l'acció."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Heu seleccionat una acció i no heu fet cap canvi a camps individuals. "
+"Probablement esteu cercant el botó 'Anar' enlloc de 'Desar'."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Nota: Aneu %s hora avançats respecte la hora del servidor."
+msgstr[1] "Nota: Aneu %s hores avançats respecte la hora del servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Nota: Aneu %s hora endarrerits respecte la hora del servidor."
+msgstr[1] "Nota: Aneu %s hores endarrerits respecte la hora del servidor."
+
+msgid "Now"
+msgstr "Ara"
+
+msgid "Choose a Time"
+msgstr "Escolliu una hora"
+
+msgid "Choose a time"
+msgstr "Escolliu una hora"
+
+msgid "Midnight"
+msgstr "Mitjanit"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Migdia"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgid "Today"
+msgstr "Avui"
+
+msgid "Choose a Date"
+msgstr "Escolliu una data"
+
+msgid "Yesterday"
+msgstr "Ahir"
+
+msgid "Tomorrow"
+msgstr "Demà"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre "
+"Desembre"
+
+msgid "S M T W T F S"
+msgstr "dg dl dt dc dj dv ds"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Ocultar"
diff --git a/tbc/static/admin/locale/cs/LC_MESSAGES/django.mo b/tbc/static/admin/locale/cs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6c34957
--- /dev/null
+++ b/tbc/static/admin/locale/cs/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/cs/LC_MESSAGES/django.po b/tbc/static/admin/locale/cs/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ef541db
--- /dev/null
+++ b/tbc/static/admin/locale/cs/LC_MESSAGES/django.po
@@ -0,0 +1,685 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jirka Vejrazka <Jirka.Vejrazka@gmail.com>, 2011
+# Tomáš Ehrlich <tomas.ehrlich@gmail.com>, 2015
+# Vláďa Macek <macek@sandbox.cz>, 2013-2014
+# Vláďa Macek <macek@sandbox.cz>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 21:52+0000\n"
+"Last-Translator: Vláďa Macek <macek@sandbox.cz>\n"
+"Language-Team: Czech (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Úspěšně odstraněno: %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nelze smazat %(name)s"
+
+msgid "Are you sure?"
+msgstr "Jste si jisti?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Správa"
+
+msgid "All"
+msgstr "Vše"
+
+msgid "Yes"
+msgstr "Ano"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Neznámé"
+
+msgid "Any date"
+msgstr "Libovolné datum"
+
+msgid "Today"
+msgstr "Dnes"
+
+msgid "Past 7 days"
+msgstr "Posledních 7 dní"
+
+msgid "This month"
+msgstr "Tento měsíc"
+
+msgid "This year"
+msgstr "Tento rok"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Zadejte správné %(username)s a heslo pro personál. Obě pole mohou rozlišovat "
+"velká a malá písmena."
+
+msgid "Action:"
+msgstr "Operace:"
+
+msgid "action time"
+msgstr "čas operace"
+
+msgid "user"
+msgstr "uživatel"
+
+msgid "content type"
+msgstr "typ obsahu"
+
+msgid "object id"
+msgstr "id položky"
+
+msgid "object repr"
+msgstr "reprez. položky"
+
+msgid "action flag"
+msgstr "příznak operace"
+
+msgid "change message"
+msgstr "zpráva o změně"
+
+msgid "log entry"
+msgstr "položka protokolu"
+
+msgid "log entries"
+msgstr "položky protokolu"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Přidán objekt \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Změněn objekt \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Odstraněn objekt \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objekt záznam v protokolu"
+
+msgid "None"
+msgstr "Žádný"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo "
+"\"Command\" na Macu)."
+
+msgid "Added."
+msgstr "Přidáno."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Změněno: %s"
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Položka \"%(object)s\" typu %(name)s byla přidána."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Změna polí: %(list)s pro položku \"%(object)s\" typu %(name)s."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Položka \"%(object)s\" typu %(name)s byla odstraněna."
+
+msgid "No fields changed."
+msgstr "Nebyla změněna žádná pole."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Položka \"%(obj)s\" typu %(name)s byla úspěšně přidána. Níže můžete v "
+"úpravách pokračovat."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Objekt \"%(obj)s\" typu %(name)s byl úspěšně přidán. Níže můžete přidat "
+"další %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Položka \"%(obj)s\" typu %(name)s byla úspěšně přidána."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Objekt \"%(obj)s\" typu %(name)s byl úspěšně změněn. Níže ho můžete znovu "
+"upravovat."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Objekt \"%(obj)s\" typu %(name)s byl úspěšně změněn. Níže můžete přidat "
+"další %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Položka \"%(obj)s\" typu %(name)s byla úspěšně změněna."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"K provedení hromadných operací je třeba vybrat nějaké položky. Nedošlo k "
+"žádným změnám."
+
+msgid "No action selected."
+msgstr "Nebyla vybrána žádná operace."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Položka \"%(obj)s\" typu %(name)s byla úspěšně odstraněna."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Položka \"%(name)s\" s primárním klíčem \"%(key)r\" neexistuje."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s: přidat"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s: změnit"
+
+msgid "Database error"
+msgstr "Chyba databáze"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Položka %(name)s byla úspěšně změněna."
+msgstr[1] "%(count)s položky %(name)s byly úspěšně změněny."
+msgstr[2] "%(count)s položek %(name)s bylo úspěšně změněno."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s položka vybrána."
+msgstr[1] "Všechny %(total_count)s položky vybrány."
+msgstr[2] "Vybráno všech %(total_count)s položek."
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Vybraných je 0 položek z celkem %(cnt)s."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historie změn: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s: %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Odstranění položky \"%(instance)s\" typu %(class_name)s by vyžadovalo "
+"odstranění těchto souvisejících chráněných položek: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Správa webu Django"
+
+msgid "Django administration"
+msgstr "Správa systému Django"
+
+msgid "Site administration"
+msgstr "Správa webu"
+
+msgid "Log in"
+msgstr "Přihlášení"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Správa aplikace %(app)s"
+
+msgid "Page not found"
+msgstr "Stránka nenalezena"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Požadovaná stránka nebyla bohužel nalezena."
+
+msgid "Home"
+msgstr "Domů"
+
+msgid "Server error"
+msgstr "Chyba serveru"
+
+msgid "Server error (500)"
+msgstr "Chyba serveru (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba serveru <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"V systému došlo k chybě. Byla e-mailem nahlášena správcům, kteří by ji měli "
+"v krátké době opravit. Děkujeme za trpělivost."
+
+msgid "Run the selected action"
+msgstr "Provést vybranou operaci"
+
+msgid "Go"
+msgstr "Provést"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klepnutím zde vyberete položky ze všech stránek."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Vybrat všechny položky typu %(module_name)s, celkem %(total_count)s."
+
+msgid "Clear selection"
+msgstr "Zrušit výběr"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Nejdříve zadejte uživatelské jméno a heslo. Poté budete moci upravovat více "
+"uživatelských nastavení."
+
+msgid "Enter a username and password."
+msgstr "Zadejte uživatelské jméno a heslo."
+
+msgid "Change password"
+msgstr "Změnit heslo"
+
+msgid "Please correct the error below."
+msgstr "Opravte níže uvedené chyby."
+
+msgid "Please correct the errors below."
+msgstr "Opravte níže uvedené chyby."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Zadejte nové heslo pro uživatele <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Vítejte, uživateli"
+
+msgid "View site"
+msgstr "Zobrazení webu"
+
+msgid "Documentation"
+msgstr "Dokumentace"
+
+msgid "Log out"
+msgstr "Odhlásit se"
+
+msgid "Add"
+msgstr "Přidat"
+
+msgid "History"
+msgstr "Historie"
+
+msgid "View on site"
+msgstr "Zobrazení na webu"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s: přidat"
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Remove from sorting"
+msgstr "Přestat řadit"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Priorita řazení: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Přehodit řazení"
+
+msgid "Delete"
+msgstr "Odstranit"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Odstranění položky \"%(escaped_object)s\" typu %(object_name)s by vyústilo v "
+"odstranění souvisejících položek. Nemáte však oprávnění k odstranění položek "
+"následujících typů:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Odstranění položky '%(escaped_object)s' typu %(object_name)s by vyžadovalo "
+"odstranění souvisejících chráněných položek:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Opravdu má být odstraněna položka \"%(escaped_object)s\" typu "
+"%(object_name)s? Následující související položky budou všechny odstraněny:"
+
+msgid "Objects"
+msgstr "Objekty"
+
+msgid "Yes, I'm sure"
+msgstr "Ano, jsem si jist(a)"
+
+msgid "No, take me back"
+msgstr "Ne, beru zpět"
+
+msgid "Delete multiple objects"
+msgstr "Odstranit vybrané položky"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Odstranění položky typu %(objects_name)s by vyústilo v odstranění "
+"souvisejících položek. Nemáte však oprávnění k odstranění položek "
+"následujících typů:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Odstranění vybrané položky typu %(objects_name)s by vyžadovalo odstranění "
+"následujících souvisejících chráněných položek:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Opravdu má být odstraněny vybrané položky typu %(objects_name)s? Všechny "
+"vybrané a s nimi související položky budou odstraněny:"
+
+msgid "Change"
+msgstr "Změnit"
+
+msgid "Remove"
+msgstr "Odebrat"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Přidat %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Odstranit?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Dle: %(filter_title)s "
+
+msgid "Summary"
+msgstr "Shrnutí"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modely v aplikaci %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte oprávnění nic měnit."
+
+msgid "Recent Actions"
+msgstr "Poslední operace"
+
+msgid "My Actions"
+msgstr "Vaše operace"
+
+msgid "None available"
+msgstr "Nic"
+
+msgid "Unknown content"
+msgstr "Neznámý obsah"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Potíže s nainstalovanou databází. Ujistěte se, že byly vytvořeny "
+"odpovídající tabulky a že databáze je přístupná pro čtení příslušným "
+"uživatelem."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Jste přihlášeni jako uživatel %(username)s, ale k této stránce nemáte "
+"oprávnění. Chcete se přihlásit k jinému účtu?"
+
+msgid "Forgotten your password or username?"
+msgstr "Zapomněli jste heslo nebo uživatelské jméno?"
+
+msgid "Date/time"
+msgstr "Datum a čas"
+
+msgid "User"
+msgstr "Uživatel"
+
+msgid "Action"
+msgstr "Operace"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tato položka nemá historii změn. Pravděpodobně nebyla přidána tímto "
+"administračním rozhraním."
+
+msgid "Show all"
+msgstr "Zobrazit vše"
+
+msgid "Save"
+msgstr "Uložit"
+
+msgid "Popup closing..."
+msgstr "Vyskakovací okno se zavírá..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Změnit vybrané položky typu %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Přidat další %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Odstranit vybrané položky typu %(model)s"
+
+msgid "Search"
+msgstr "Hledat"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s výsledek"
+msgstr[1] "%(counter)s výsledky"
+msgstr[2] "%(counter)s výsledků"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Celkem %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Uložit jako novou položku"
+
+msgid "Save and add another"
+msgstr "Uložit a přidat další položku"
+
+msgid "Save and continue editing"
+msgstr "Uložit a pokračovat v úpravách"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Děkujeme za čas strávený s tímto webem."
+
+msgid "Log in again"
+msgstr "Přihlaste se znovu"
+
+msgid "Password change"
+msgstr "Změna hesla"
+
+msgid "Your password was changed."
+msgstr "Vaše heslo bylo změněno."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Zadejte svoje současné heslo a poté dvakrát heslo nové. Omezíme tak možnost "
+"překlepu."
+
+msgid "Change my password"
+msgstr "Změnit heslo"
+
+msgid "Password reset"
+msgstr "Obnovení hesla"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaše heslo bylo nastaveno. Nyní se můžete přihlásit."
+
+msgid "Password reset confirmation"
+msgstr "Potvrzení obnovy hesla"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Zadejte dvakrát nové heslo. Tak ověříme, že bylo zadáno správně."
+
+msgid "New password:"
+msgstr "Nové heslo:"
+
+msgid "Confirm password:"
+msgstr "Potvrdit heslo:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Odkaz pro obnovení hesla byl neplatný, možná již byl použit. Požádejte o "
+"obnovení hesla znovu."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Návod na nastavení hesla byl odeslán na zadanou e-mailovou adresu, pokud "
+"účet s takovou adresou existuje. Měl by za okamžik dorazit."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Pokud e-mail neobdržíte, ujistěte se, že zadaná e-mailová adresa je stejná "
+"jako ta registrovaná u vašeho účtu a zkontrolujte složku nevyžádané pošty, "
+"tzv. spamu."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Tento e-mail vám byl zaslán na základě vyžádání obnovy hesla vašeho "
+"uživatelskému účtu na systému %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Přejděte na následující stránku a zadejte nové heslo:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Pro jistotu vaše uživatelské jméno:"
+
+msgid "Thanks for using our site!"
+msgstr "Děkujeme za používání našeho webu!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tým aplikace %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Zapomněli jste heslo? Zadejte níže e-mailovou adresu a systém vám odešle "
+"instrukce k nastavení nového."
+
+msgid "Email address:"
+msgstr "E-mailová adresa:"
+
+msgid "Reset my password"
+msgstr "Obnovit heslo"
+
+msgid "All dates"
+msgstr "Všechna data"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s: vybrat"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Vyberte položku %s ke změně"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Čas:"
+
+msgid "Lookup"
+msgstr "Hledat"
+
+msgid "Currently:"
+msgstr "Aktuálně:"
+
+msgid "Change:"
+msgstr "Změna:"
diff --git a/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1c5c11f
--- /dev/null
+++ b/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..89f73d1
--- /dev/null
+++ b/tbc/static/admin/locale/cs/LC_MESSAGES/djangojs.po
@@ -0,0 +1,168 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jirka Vejrazka <Jirka.Vejrazka@gmail.com>, 2011
+# Vláďa Macek <macek@sandbox.cz>, 2012,2014
+# Vláďa Macek <macek@sandbox.cz>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-15 17:31+0000\n"
+"Last-Translator: Vláďa Macek <macek@sandbox.cz>\n"
+"Language-Team: Czech (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostupné položky: %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Seznam dostupných položek %s. Jednotlivě je lze vybrat tak, že na ně v "
+"rámečku klepnete a pak klepnete na šipku \"Vybrat\" mezi rámečky."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Chcete-li filtrovat ze seznamu dostupných položek %s, začněte psát do tohoto "
+"pole."
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Choose all"
+msgstr "Vybrat vše"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Chcete-li najednou vybrat všechny položky %s, klepněte sem."
+
+msgid "Choose"
+msgstr "Vybrat"
+
+msgid "Remove"
+msgstr "Odebrat"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Vybrané položky %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Seznam vybraných položek %s. Jednotlivě je lze odebrat tak, že na ně v "
+"rámečku klepnete a pak klepnete na šipku \"Odebrat mezi rámečky."
+
+msgid "Remove all"
+msgstr "Odebrat vše"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Chcete-li najednou odebrat všechny vybrané položky %s, klepněte sem."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Vybrána je %(sel)s položka z celkem %(cnt)s."
+msgstr[1] "Vybrány jsou %(sel)s položky z celkem %(cnt)s."
+msgstr[2] "Vybraných je %(sel)s položek z celkem %(cnt)s."
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"V jednotlivých polích jsou neuložené změny, které budou ztraceny, pokud "
+"operaci provedete."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. "
+"Uložíte klepnutím na tlačítko OK. Pak bude třeba operaci spustit znovu."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Byla vybrána operace a jednotlivá pole nejsou změněná. Patrně hledáte "
+"tlačítko Provést spíše než Uložit."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Poznámka: Váš čas o %s hodinu předstihuje čas na serveru."
+msgstr[1] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru."
+msgstr[2] "Poznámka: Váš čas o %s hodin předstihuje čas na serveru."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Poznámka: Váš čas se o %s hodinu zpožďuje za časem na serveru."
+msgstr[1] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru."
+msgstr[2] "Poznámka: Váš čas se o %s hodin zpožďuje za časem na serveru."
+
+msgid "Now"
+msgstr "Nyní"
+
+msgid "Choose a Time"
+msgstr "Vyberte čas"
+
+msgid "Choose a time"
+msgstr "Vyberte čas"
+
+msgid "Midnight"
+msgstr "Půlnoc"
+
+msgid "6 a.m."
+msgstr "6h ráno"
+
+msgid "Noon"
+msgstr "Poledne"
+
+msgid "6 p.m."
+msgstr "6h večer"
+
+msgid "Cancel"
+msgstr "Storno"
+
+msgid "Today"
+msgstr "Dnes"
+
+msgid "Choose a Date"
+msgstr "Vyberte datum"
+
+msgid "Yesterday"
+msgstr "Včera"
+
+msgid "Tomorrow"
+msgstr "Zítra"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"leden únor březen duben květen červen červenec srpen září říjen listopad "
+"prosinec"
+
+msgid "S M T W T F S"
+msgstr "n p ú s č p s"
+
+msgid "Show"
+msgstr "Zobrazit"
+
+msgid "Hide"
+msgstr "Skrýt"
diff --git a/tbc/static/admin/locale/cy/LC_MESSAGES/django.mo b/tbc/static/admin/locale/cy/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5ef225c
--- /dev/null
+++ b/tbc/static/admin/locale/cy/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/cy/LC_MESSAGES/django.po b/tbc/static/admin/locale/cy/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4b19aa9
--- /dev/null
+++ b/tbc/static/admin/locale/cy/LC_MESSAGES/django.po
@@ -0,0 +1,678 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Maredudd ap Gwyndaf <maredudd@maredudd.com>, 2014
+# pjrobertson, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
+"11) ? 2 : 3;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Dilëwyd %(count)d %(items)s yn llwyddiannus."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ni ellir dileu %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ydych yn sicr?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Dileu y %(verbose_name_plural)s â ddewiswyd"
+
+msgid "Administration"
+msgstr "Gweinyddu"
+
+msgid "All"
+msgstr "Pob un"
+
+msgid "Yes"
+msgstr "Ie"
+
+msgid "No"
+msgstr "Na"
+
+msgid "Unknown"
+msgstr "Anhysybys"
+
+msgid "Any date"
+msgstr "Unrhyw ddyddiad"
+
+msgid "Today"
+msgstr "Heddiw"
+
+msgid "Past 7 days"
+msgstr "7 diwrnod diwethaf"
+
+msgid "This month"
+msgstr "Mis yma"
+
+msgid "This year"
+msgstr "Eleni"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Teipiwch yr %(username)s a chyfrinair cywir ar gyfer cyfrif staff. Noder y "
+"gall y ddau faes fod yn sensitif i lythrennau bach a llythrennau bras."
+
+msgid "Action:"
+msgstr "Gweithred:"
+
+msgid "action time"
+msgstr "amser y weithred"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id gwrthrych"
+
+msgid "object repr"
+msgstr "repr gwrthrych"
+
+msgid "action flag"
+msgstr "fflag gweithred"
+
+msgid "change message"
+msgstr "neges y newid"
+
+msgid "log entry"
+msgstr "cofnod"
+
+msgid "log entries"
+msgstr "cofnodion"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Ychwanegwyd \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Newidwyd \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Dilëwyd \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Gwrthrych LogEntry"
+
+msgid "None"
+msgstr "Dim"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Newidiwyd %s."
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Wedi ychwanegu %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Wedi newid %(list)s ar gyfer %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Dilëwyd %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ni newidwyd unrhwy feysydd."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Ychwanegwyd %(name)s \"%(obj)s\" yn llwyddianus. Gellir ei olygu eto isod."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ychwanegwyd %(name)s \"%(obj)s\" yn llwyddiannus. Gallwch ychwanegu %(name)s "
+"arall isod."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Ychwanegwyd %(name)s \"%(obj)s\" yn llwyddiannus."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Ychwanegwyd %(name)s \"%(obj)s\" yn llwyddianus. Gellir ei olygu eto isod."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ychwanegwyd %(name)s \"%(obj)s\" yn llwyddiannus. Gallwch ychwanegu %(name)s "
+"arall isod."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Newidwyd %(name)s \"%(obj)s\" yn llwyddiannus."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Rhaid dewis eitemau er mwyn gweithredu arnynt. Ni ddewiswyd unrhyw eitemau."
+
+msgid "No action selected."
+msgstr "Ni ddewiswyd gweithred."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Dilëwyd %(name)s \"%(obj)s\" yn llwyddiannus."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Nid ydy gwrthrych %(name)s gyda'r prif allwedd %(key)r yn bodoli."
+
+#, python-format
+msgid "Add %s"
+msgstr "Ychwanegu %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Newid %s"
+
+msgid "Database error"
+msgstr "Gwall cronfa ddata"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Newidwyd %(count)s %(name)s yn llwyddiannus"
+msgstr[1] "Newidwyd %(count)s %(name)s yn llwyddiannus"
+msgstr[2] "Newidwyd %(count)s %(name)s yn llwyddiannus"
+msgstr[3] "Newidwyd %(count)s %(name)s yn llwyddiannus"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Dewiswyd %(total_count)s"
+msgstr[1] "Dewiswyd %(total_count)s"
+msgstr[2] "Dewiswyd %(total_count)s"
+msgstr[3] "Dewiswyd %(total_count)s"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Dewiswyd 0 o %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Hanes newid: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Byddai dileu %(class_name)s %(instance)s yn golygu dileu'r gwrthrychau "
+"gwarchodedig canlynol sy'n perthyn: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Adran weinyddol safle Django"
+
+msgid "Django administration"
+msgstr "Gweinyddu Django"
+
+msgid "Site administration"
+msgstr "Gweinyddu'r safle"
+
+msgid "Log in"
+msgstr "Mewngofnodi"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Gweinyddu %(app)s"
+
+msgid "Page not found"
+msgstr "Ni ddarganfyddwyd y dudalen"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Mae'n ddrwg gennym, ond ni ddarganfuwyd y dudalen"
+
+msgid "Home"
+msgstr "Hafan"
+
+msgid "Server error"
+msgstr "Gwall gweinydd"
+
+msgid "Server error (500)"
+msgstr "Gwall gweinydd (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Gwall Gweinydd <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Mae gwall ac gyrrwyd adroddiad ohono i weinyddwyr y wefan drwy ebost a dylai "
+"gael ei drwsio yn fuan. Diolch am fod yn amyneddgar."
+
+msgid "Run the selected action"
+msgstr "Rhedeg y weithred a ddewiswyd"
+
+msgid "Go"
+msgstr "Ffwrdd â ni"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+"Cliciwch fan hyn i ddewis yr holl wrthrychau ar draws yr holl dudalennau"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Dewis y %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Clirio'r dewis"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Yn gyntaf, rhowch enw defnyddiwr a chyfrinair. Yna byddwch yn gallu golygu "
+"mwy o ddewisiadau."
+
+msgid "Enter a username and password."
+msgstr "Rhowch enw defnyddiwr a chyfrinair."
+
+msgid "Change password"
+msgstr "Newid cyfrinair"
+
+msgid "Please correct the error below."
+msgstr "Cywirwch y gwall isod."
+
+msgid "Please correct the errors below."
+msgstr "Cywirwch y gwallau isod."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Rhowch gyfrinair newydd i'r defnyddiwr <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Croeso,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dogfennaeth"
+
+msgid "Log out"
+msgstr "Allgofnodi"
+
+msgid "Add"
+msgstr "Ychwanegu"
+
+msgid "History"
+msgstr "Hanes"
+
+msgid "View on site"
+msgstr "Gweld ar y safle"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ychwanegu %(name)s"
+
+msgid "Filter"
+msgstr "Hidl"
+
+msgid "Remove from sorting"
+msgstr "Gwaredu o'r didoli"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Blaenoriaeth didoli: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Toglio didoli"
+
+msgid "Delete"
+msgstr "Dileu"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r "
+"gwrthrychau sy'n perthyn, ond nid oes ganddoch ganiatâd i ddileu y mathau "
+"canlynol o wrthrychau:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r "
+"gwrthrychau gwarchodedig canlynol sy'n perthyn:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ydych yn sicr eich bod am ddileu %(object_name)s \"%(escaped_object)s\"? "
+"Dilëir yr holl eitemau perthnasol canlynol:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ydw, rwy'n sicr"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Dileu mwy nag un gwrthrych"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Byddai dileu %(objects_name)s yn golygu dileu'r gwrthrychau sy'n perthyn, "
+"ond nid oes ganddoch ganiatâd i ddileu y mathau canlynol o wrthrychau:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Byddai dileu %(objects_name)s yn golygu dileu'r gwrthrychau gwarchodedig "
+"canlynol sy'n perthyn:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ydych yn sicr eich bod am ddileu'r %(objects_name)s a ddewiswyd? Dilëir yr "
+"holl wrthrychau canlynol a'u heitemau perthnasol:"
+
+msgid "Change"
+msgstr "Newid"
+
+msgid "Remove"
+msgstr "Gwaredu"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Ychwanegu %(verbose_name)s arall"
+
+msgid "Delete?"
+msgstr "Dileu?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Wrth %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelau yn y rhaglen %(name)s "
+
+msgid "You don't have permission to edit anything."
+msgstr "Does gennych ddim hawl i olygu unrhywbeth."
+
+msgid "Recent Actions"
+msgstr "Gweithredoedd Diweddar"
+
+msgid "My Actions"
+msgstr "Fy Ngweithredoedd"
+
+msgid "None available"
+msgstr "Dim ar gael"
+
+msgid "Unknown content"
+msgstr "Cynnwys anhysbys"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Mae rhywbeth o'i le ar osodiad y gronfa ddata. Sicrhewch fod y tablau "
+"cronfa ddata priodol wedi eu creu, a sicrhewch fod y gronfa ddata yn "
+"ddarllenadwy gan y defnyddiwr priodol."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Anghofioch eich cyfrinair neu enw defnyddiwr?"
+
+msgid "Date/time"
+msgstr "Dyddiad/amser"
+
+msgid "User"
+msgstr "Defnyddiwr"
+
+msgid "Action"
+msgstr "Gweithred"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg nad ei ychwanegwyd "
+"drwy'r safle gweinydd yma."
+
+msgid "Show all"
+msgstr "Dangos pob canlyniad"
+
+msgid "Save"
+msgstr "Cadw"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Chwilio"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s canlyniad"
+msgstr[1] "%(counter)s canlyniad"
+msgstr[2] "%(counter)s canlyniad"
+msgstr[3] "%(counter)s canlyniad"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Cyfanswm o %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Cadw fel newydd"
+
+msgid "Save and add another"
+msgstr "Cadw ac ychwanegu un arall"
+
+msgid "Save and continue editing"
+msgstr "Cadw a pharhau i olygu"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Diolch am dreulio amser o ansawdd gyda'r safle we yma heddiw."
+
+msgid "Log in again"
+msgstr "Mewngofnodi eto"
+
+msgid "Password change"
+msgstr "Newid cyfrinair"
+
+msgid "Your password was changed."
+msgstr "Newidwyd eich cyfrinair."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Rhowch eich hen gyfrinair, er mwyn diogelwch, ac yna rhowch eich cyfrinair "
+"newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir."
+
+msgid "Change my password"
+msgstr "Newid fy nghyfrinair"
+
+msgid "Password reset"
+msgstr "Ailosod cyfrinair"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Mae'ch cyfrinair wedi ei osod. Gallwch fewngofnodi nawr."
+
+msgid "Password reset confirmation"
+msgstr "Cadarnhad ailosod cyfrinair"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Rhowch eich cyfrinair newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir."
+
+msgid "New password:"
+msgstr "Cyfrinair newydd:"
+
+msgid "Confirm password:"
+msgstr "Cadarnhewch y cyfrinair:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Roedd y ddolen i ailosod y cyfrinair yn annilys, o bosib oherwydd ei fod "
+"wedi ei ddefnyddio'n barod. Gofynnwch i ailosod y cyfrinair eto."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Os na dderbyniwch ebost, sicrhewych y rhoddwyd y cyfeiriad sydd wedi ei "
+"gofrestru gyda ni, ac edrychwch yn eich ffolder sbam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Derbyniwch yr ebost hwn oherwydd i chi ofyn i ailosod y cyfrinair i'ch "
+"cyfrif yn %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Ewch i'r dudalen olynol a dewsiwch gyfrinair newydd:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Eich enw defnyddiwr, rhag ofn eich bod wedi anghofio:"
+
+msgid "Thanks for using our site!"
+msgstr "Diolch am ddefnyddio ein safle!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tîm %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Anghofioch eich cyfrinair? Rhowch eich cyfeiriad ebost isod ac fe ebostiwn "
+"gyfarwyddiadau ar osod un newydd."
+
+msgid "Email address:"
+msgstr "Cyfeiriad ebost:"
+
+msgid "Reset my password"
+msgstr "Ailosod fy nghyfrinair"
+
+msgid "All dates"
+msgstr "Holl ddyddiadau"
+
+#, python-format
+msgid "Select %s"
+msgstr "Dewis %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Dewis %s i newid"
+
+msgid "Date:"
+msgstr "Dyddiad:"
+
+msgid "Time:"
+msgstr "Amser:"
+
+msgid "Lookup"
+msgstr "Archwilio"
+
+msgid "Currently:"
+msgstr "Cyfredol:"
+
+msgid "Change:"
+msgstr "Newid:"
diff --git a/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ae240d1
--- /dev/null
+++ b/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..eed3b54
--- /dev/null
+++ b/tbc/static/admin/locale/cy/LC_MESSAGES/djangojs.po
@@ -0,0 +1,168 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Maredudd ap Gwyndaf <maredudd@maredudd.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
+"11) ? 2 : 3;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s sydd ar gael"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dyma restr o'r %s sydd ar gael. Gellir dewis rhai drwyeu dewis yn y blwch "
+"isod ac yna clicio'r saeth \"Dewis\" rhwng y ddau flwch."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Teipiwch yn y blwch i hidlo'r rhestr o %s sydd ar gael."
+
+msgid "Filter"
+msgstr "Hidl"
+
+msgid "Choose all"
+msgstr "Dewis y cyfan"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Cliciwch i ddewis pob %s yr un pryd."
+
+msgid "Choose"
+msgstr "Dewis"
+
+msgid "Remove"
+msgstr "Gwaredu"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Y %s a ddewiswyd"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dyma restr o'r %s a ddewiswyd. Gellir gwaredu rhai drwy eu dewis yn y blwch "
+"isod ac yna clicio'r saeth \"Gwaredu\" rhwng y ddau flwch."
+
+msgid "Remove all"
+msgstr "Gwaredu'r cyfan"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Cliciwch i waredu pob %s sydd wedi ei ddewis yr un pryd."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Dewiswyd %(sel)s o %(cnt)s"
+msgstr[1] "Dewiswyd %(sel)s o %(cnt)s"
+msgstr[2] "Dewiswyd %(sel)s o %(cnt)s"
+msgstr[3] "Dewiswyd %(sel)s o %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Mae ganddoch newidiadau heb eu cadw mewn meysydd golygadwy. Os rhedwch y "
+"weithred fe gollwch y newidiadau."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Rydych wedi dewis gweithred ond nid ydych wedi newid eich newidiadau i rai "
+"meysydd eto. Cliciwch 'Iawn' i gadw. Bydd rhaid i chi ail-redeg y weithred."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Rydych wedi dewis gweithred ac nid ydych wedi newid unrhyw faes. Rydych "
+"siwr o fod yn edrych am y botwm 'Ewch' yn lle'r botwm 'Cadw'."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Noder: Rydych %s awr o flaen amser y gweinydd."
+msgstr[1] "Noder: Rydych %s awr o flaen amser y gweinydd."
+msgstr[2] "Noder: Rydych %s awr o flaen amser y gweinydd."
+msgstr[3] "Noder: Rydych %s awr o flaen amser y gweinydd."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Noder: Rydych %s awr tu ôl amser y gweinydd."
+msgstr[1] "Noder: Rydych %s awr tu ôl amser y gweinydd."
+msgstr[2] "Noder: Rydych %s awr tu ôl amser y gweinydd."
+msgstr[3] "Noder: Rydych %s awr tu ôl amser y gweinydd."
+
+msgid "Now"
+msgstr "Nawr"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Dewiswch amser"
+
+msgid "Midnight"
+msgstr "Canol nos"
+
+msgid "6 a.m."
+msgstr "6 y.b."
+
+msgid "Noon"
+msgstr "Canol dydd"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Diddymu"
+
+msgid "Today"
+msgstr "Heddiw"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Ddoe"
+
+msgid "Tomorrow"
+msgstr "Fory"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ionawr Chwefror Mawrth Ebrill Mai Mehefin Gorffennaf Awst Medi Hydref "
+"Tachwedd Rhagfyr"
+
+msgid "S M T W T F S"
+msgstr "S Ll M M I G S"
+
+msgid "Show"
+msgstr "Dangos"
+
+msgid "Hide"
+msgstr "Cuddio"
diff --git a/tbc/static/admin/locale/da/LC_MESSAGES/django.mo b/tbc/static/admin/locale/da/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..abeb6a1
--- /dev/null
+++ b/tbc/static/admin/locale/da/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/da/LC_MESSAGES/django.po b/tbc/static/admin/locale/da/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5a8e33b
--- /dev/null
+++ b/tbc/static/admin/locale/da/LC_MESSAGES/django.po
@@ -0,0 +1,679 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Christian Joergensen <christian@gmta.info>, 2012
+# Dimitris Glezos <glezos@transifex.com>, 2012
+# Erik Wognsen <r4mses@gmail.com>, 2013,2015
+# Finn Gruwier Larsen, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# valberg <valberg@orn.li>, 2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-17 15:36+0000\n"
+"Last-Translator: valberg <valberg@orn.li>\n"
+"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s blev slettet."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kan ikke slette %(name)s "
+
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Slet valgte %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Unknown"
+msgstr "Ukendt"
+
+msgid "Any date"
+msgstr "Når som helst"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Past 7 days"
+msgstr "De sidste 7 dage"
+
+msgid "This month"
+msgstr "Denne måned"
+
+msgid "This year"
+msgstr "Dette år"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Indtast venligst det korrekte %(username)s og adgangskode for en "
+"personalekonto. Bemærk at begge felter kan være versalfølsomme."
+
+msgid "Action:"
+msgstr "Handling"
+
+msgid "action time"
+msgstr "handlingstid"
+
+msgid "user"
+msgstr "bruger"
+
+msgid "content type"
+msgstr "indholdstype"
+
+msgid "object id"
+msgstr "objekt-ID"
+
+msgid "object repr"
+msgstr "objekt repr"
+
+msgid "action flag"
+msgstr "handlingsflag"
+
+msgid "change message"
+msgstr "ændringsmeddelelse"
+
+msgid "log entry"
+msgstr "logmeddelelse"
+
+msgid "log entries"
+msgstr "logmeddelelser"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Tilføjede \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Ændrede \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Slettede \"%(object)s\"."
+
+msgid "LogEntry Object"
+msgstr "LogEntry-objekt"
+
+msgid "None"
+msgstr "Ingen"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold \"Ctrl\" (eller \"Æbletasten\" på Mac) nede for at vælge mere end en."
+
+msgid "Added."
+msgstr "Tilføjet."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Ændrede %s."
+
+msgid "and"
+msgstr "og"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Tilføjede %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Ændrede %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Slettede %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ingen felter ændret."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" blev tilføjet. Du kan redigere den/det igen herunder."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" blev tilføjet. Du kan endnu en/et %(name)s herunder."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" blev tilføjet."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" blev ændret. Du kan redigere den/det igen herunder."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" blev ændret. Du kan tilføje endnu en/et %(name)s "
+"herunder."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" blev ændret."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Der skal være valgt nogle emner for at man kan udføre handlinger på dem. "
+"Ingen emner er blev ændret."
+
+msgid "No action selected."
+msgstr "Ingen handling valgt."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" blev slettet."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Der findes ikke et %(name)s-objekt med primærnøgle %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Tilføj %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Ret %s"
+
+msgid "Database error"
+msgstr "databasefejl"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s blev ændret."
+msgstr[1] "%(count)s %(name)s blev ændret."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s valgt"
+msgstr[1] "Alle %(total_count)s valgt"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 af %(cnt)s valgt"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ændringshistorik: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Sletning af %(class_name)s %(instance)s vil kræve sletning af følgende "
+"beskyttede relaterede objekter: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django website-administration"
+
+msgid "Django administration"
+msgstr "Django administration"
+
+msgid "Site administration"
+msgstr "Website-administration"
+
+msgid "Log in"
+msgstr "Log ind"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administration"
+
+msgid "Page not found"
+msgstr "Siden blev ikke fundet"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi beklager, men den ønskede side kunne ikke findes"
+
+msgid "Home"
+msgstr "Hjem"
+
+msgid "Server error"
+msgstr "Serverfejl"
+
+msgid "Server error (500)"
+msgstr "Serverfejl (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfejl <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Der opstod en fejl. Fejlen er rapporteret til website-administratoren via e-"
+"mail, og vil blive rettet hurtigst muligt. Tak for din tålmodighed."
+
+msgid "Run the selected action"
+msgstr "Udfør den valgte handling"
+
+msgid "Go"
+msgstr "Udfør"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klik her for at vælge objekter på tværs af alle sider"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Vælg alle %(total_count)s %(module_name)s "
+
+msgid "Clear selection"
+msgstr "Ryd valg"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Indtast først et brugernavn og en adgangskode. Derefter får du yderligere "
+"redigeringsmuligheder."
+
+msgid "Enter a username and password."
+msgstr "Indtast et brugernavn og en adgangskode."
+
+msgid "Change password"
+msgstr "Skift adgangskode"
+
+msgid "Please correct the error below."
+msgstr "Ret venligst fejlen herunder."
+
+msgid "Please correct the errors below."
+msgstr "Ret venligst fejlene herunder."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Indtast en ny adgangskode for brugeren <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Velkommen,"
+
+msgid "View site"
+msgstr "Se side"
+
+msgid "Documentation"
+msgstr "Dokumentation"
+
+msgid "Log out"
+msgstr "Log ud"
+
+msgid "Add"
+msgstr "Tilføj"
+
+msgid "History"
+msgstr "Historik"
+
+msgid "View on site"
+msgstr "Se på website"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Tilføj %(name)s"
+
+msgid "Filter"
+msgstr "Filtrer"
+
+msgid "Remove from sorting"
+msgstr "Fjern fra sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteringsprioritet: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Skift sortering"
+
+msgid "Delete"
+msgstr "Slet"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Hvis du sletter %(object_name)s '%(escaped_object)s', vil du også slette "
+"relaterede objekter, men din konto har ikke rettigheder til at slette "
+"følgende objekttyper:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Sletning af %(object_name)s ' %(escaped_object)s ' vil kræve sletning af "
+"følgende beskyttede relaterede objekter:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Er du sikker på du vil slette %(object_name)s \"%(escaped_object)s\"? Alle "
+"de følgende relaterede objekter vil blive slettet:"
+
+msgid "Objects"
+msgstr "Objekter"
+
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+msgid "No, take me back"
+msgstr "Nej, tag mig tilbage"
+
+msgid "Delete multiple objects"
+msgstr "Slet flere objekter"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Sletning af de valgte %(objects_name)s ville resultere i sletning af "
+"relaterede objekter, men din konto har ikke tilladelse til at slette "
+"følgende typer af objekter:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Sletning af de valgte %(objects_name)s vil kræve sletning af følgende "
+"beskyttede relaterede objekter:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Er du sikker på du vil slette de valgte %(objects_name)s? Alle de følgende "
+"objekter og deres relaterede emner vil blive slettet:"
+
+msgid "Change"
+msgstr "Ret"
+
+msgid "Remove"
+msgstr "Fjern"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Tilføj endnu en %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Slet?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Efter %(filter_title)s "
+
+msgid "Summary"
+msgstr "Sammendrag"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeller i applikationen %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigheder til at foretage ændringer."
+
+msgid "Recent Actions"
+msgstr "Seneste handlinger"
+
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+msgid "None available"
+msgstr "Ingen tilgængelige"
+
+msgid "Unknown content"
+msgstr "Ukendt indhold"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Der er noget galt med databaseinstallationen. Kontroller om "
+"databasetabellerne er blevet oprettet og at databasen er læsbar for den "
+"pågældende bruger."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Har du glemt dit password eller brugernavn?"
+
+msgid "Date/time"
+msgstr "Dato/tid"
+
+msgid "User"
+msgstr "Bruger"
+
+msgid "Action"
+msgstr "Funktion"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objekt har ingen ændringshistorik. Det blev formentlig ikke tilføjet "
+"via dette administrations-site"
+
+msgid "Show all"
+msgstr "Vis alle"
+
+msgid "Save"
+msgstr "Gem"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Redigér valgte %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Tilføj endnu en %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Slet valgte %(model)s"
+
+msgid "Search"
+msgstr "Søg"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultat"
+msgstr[1] "%(counter)s resultater"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s i alt"
+
+msgid "Save as new"
+msgstr "Gem som ny"
+
+msgid "Save and add another"
+msgstr "Gem og tilføj endnu en"
+
+msgid "Save and continue editing"
+msgstr "Gem og fortsæt med at redigere"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tak for den kvalitetstid du brugte på websitet i dag."
+
+msgid "Log in again"
+msgstr "Log ind igen"
+
+msgid "Password change"
+msgstr "Skift adgangskode"
+
+msgid "Your password was changed."
+msgstr "Din adgangskode blev ændret."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Indtast venligst din gamle adgangskode for en sikkerheds skyld og indtast så "
+"din nye adgangskode to gange, så vi kan være sikre på, at den er indtastet "
+"korrekt."
+
+msgid "Change my password"
+msgstr "Skift min adgangskode"
+
+msgid "Password reset"
+msgstr "Nulstil adgangskode"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Din adgangskode er blevet sat. Du kan logge ind med den nu."
+
+msgid "Password reset confirmation"
+msgstr "Bekræftelse for nulstilling af adgangskode"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Indtast venligst din nye adgangskode to gange, så vi kan være sikre på, at "
+"den er indtastet korrekt."
+
+msgid "New password:"
+msgstr "Ny adgangskode:"
+
+msgid "Confirm password:"
+msgstr "Bekræft ny adgangskode:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Linket for nulstilling af adgangskoden er ugyldigt, måske fordi det allerede "
+"har været brugt. Anmod venligst påny om nulstilling af adgangskoden."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Vi har sendt dig en email med instruktioner for at sætte dit kodeord, hvis "
+"en konto med den angivne email findes. Du burde modtage dem snarest."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Hvis du ikke modtager en e-mail, så tjek venligst, at du har indtastet den e-"
+"mail-adresse, du registrerede dig med, og tjek din spam-mappe."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Du modtager denne e-mail, fordi du har anmodet om en nulstilling af "
+"adgangskoden til din brugerkonto ved %(site_name)s ."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gå venligst til denne side og vælg en ny adgangskode:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "For det tilfælde at du skulle have glemt dit brugernavn er det:"
+
+msgid "Thanks for using our site!"
+msgstr "Tak fordi du brugte vores website!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Med venlig hilsen %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Har du glemt din adgangskode? Skriv din e-mail-adresse herunder, så sender "
+"vi dig instruktioner i at vælge en ny adgangskode."
+
+msgid "Email address:"
+msgstr "E-mail-adresse:"
+
+msgid "Reset my password"
+msgstr "Nulstil min adgangskode"
+
+msgid "All dates"
+msgstr "Alle datoer"
+
+#, python-format
+msgid "Select %s"
+msgstr "Vælg %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Vælg %s, der skal ændres"
+
+msgid "Date:"
+msgstr "Dato:"
+
+msgid "Time:"
+msgstr "Tid:"
+
+msgid "Lookup"
+msgstr "Slå op"
+
+msgid "Currently:"
+msgstr "Nuværende:"
+
+msgid "Change:"
+msgstr "Ændring:"
diff --git a/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..5211a9c
--- /dev/null
+++ b/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..83b4526
--- /dev/null
+++ b/tbc/static/admin/locale/da/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Christian Joergensen <christian@gmta.info>, 2012
+# Erik Wognsen <r4mses@gmail.com>, 2012
+# Finn Gruwier Larsen, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# valberg <valberg@orn.li>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Tilgængelige %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dette er listen over tilgængelige %s. Du kan vælge dem enkeltvis ved at "
+"markere dem i kassen nedenfor og derefter klikke på \"Vælg\"-pilen mellem de "
+"to kasser."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Skriv i dette felt for at filtrere listen af tilgængelige %s."
+
+msgid "Filter"
+msgstr "Filtrér"
+
+msgid "Choose all"
+msgstr "Vælg alle"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klik for at vælge alle %s med det samme."
+
+msgid "Choose"
+msgstr "Vælg"
+
+msgid "Remove"
+msgstr "Fjern"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valgte %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dette er listen over valgte %s. Du kan fjerne dem enkeltvis ved at markere "
+"dem i kassen nedenfor og derefter klikke på \"Fjern\"-pilen mellem de to "
+"kasser."
+
+msgid "Remove all"
+msgstr "Fjern alle"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klik for at fjerne alle valgte %s med det samme."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s af %(cnt)s valgt"
+msgstr[1] "%(sel)s af %(cnt)s valgt"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du "
+"udfører en handling fra drop-down-menuen, vil du miste disse ændringer."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller "
+"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. "
+"Det, du søger er formentlig Udfør-knappen i stedet for Gem-knappen."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Obs: Du er %s time forud i forhold servertiden."
+msgstr[1] "Obs: Du er %s timer forud i forhold servertiden."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Obs: Du er %s time bagud i forhold servertiden."
+msgstr[1] "Obs: Du er %s timer forud i forhold servertiden."
+
+msgid "Now"
+msgstr "Nu"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Vælg et tidspunkt"
+
+msgid "Midnight"
+msgstr "Midnat"
+
+msgid "6 a.m."
+msgstr "6 morgen"
+
+msgid "Noon"
+msgstr "Middag"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Annuller"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "I går"
+
+msgid "Tomorrow"
+msgstr "I morgen"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Marts April Maj Juni Juli August September Oktober November "
+"December"
+
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+msgid "Show"
+msgstr "Vis"
+
+msgid "Hide"
+msgstr "Skjul"
diff --git a/tbc/static/admin/locale/de/LC_MESSAGES/django.mo b/tbc/static/admin/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5305191
--- /dev/null
+++ b/tbc/static/admin/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/de/LC_MESSAGES/django.po b/tbc/static/admin/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c72e72a
--- /dev/null
+++ b/tbc/static/admin/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,690 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# André Hagenbruch, 2012
+# Florian Apolloner <florian@apolloner.eu>, 2011
+# Dimitris Glezos <glezos@transifex.com>, 2012
+# Jannis Vajen, 2013
+# Jannis Leidel <jannis@leidel.info>, 2013-2015
+# Markus Holtermann <inyoka@markusholtermann.eu>, 2013,2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-25 19:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Erfolgreich %(count)d %(items)s gelöscht."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kann %(name)s nicht löschen"
+
+msgid "Are you sure?"
+msgstr "Sind Sie sicher?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Ausgewählte %(verbose_name_plural)s löschen"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nein"
+
+msgid "Unknown"
+msgstr "Unbekannt"
+
+msgid "Any date"
+msgstr "Alle Daten"
+
+msgid "Today"
+msgstr "Heute"
+
+msgid "Past 7 days"
+msgstr "Letzte 7 Tage"
+
+msgid "This month"
+msgstr "Diesen Monat"
+
+msgid "This year"
+msgstr "Dieses Jahr"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Bitte einen gültigen %(username)s und ein Passwort für einen Staff-Account "
+"eingeben. Beide Felder berücksichtigen die Groß-/Kleinschreibung."
+
+msgid "Action:"
+msgstr "Aktion:"
+
+msgid "action time"
+msgstr "Zeitpunkt der Aktion"
+
+msgid "user"
+msgstr "Benutzer"
+
+msgid "content type"
+msgstr "Inhaltstyp"
+
+msgid "object id"
+msgstr "Objekt-ID"
+
+msgid "object repr"
+msgstr "Objekt Darst."
+
+msgid "action flag"
+msgstr "Aktionskennzeichen"
+
+msgid "change message"
+msgstr "Änderungsmeldung"
+
+msgid "log entry"
+msgstr "Logeintrag"
+
+msgid "log entries"
+msgstr "Logeinträge"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" hinzufügt."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" verändert - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" gelöscht."
+
+msgid "LogEntry Object"
+msgstr "LogEntry Objekt"
+
+msgid "None"
+msgstr "-"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um "
+"mehrere Einträge auszuwählen."
+
+msgid "Added."
+msgstr "Hinzugefügt."
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s geändert."
+
+msgid "and"
+msgstr "und"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" hinzugefügt."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s von %(name)s \"%(object)s\" geändert."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" gelöscht."
+
+msgid "No fields changed."
+msgstr "Keine Felder geändert."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt und kann unten geändert "
+"werden."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt. Es kann jetzt ein "
+"weiteres %(name)s unten hinzugefügt werden."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich geändert. Weitere Änderungen können "
+"unten vorgenommen werden."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich geändert. Es kann jetzt ein weiteres "
+"%(name)s unten hinzugefügt werden."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Es müssen Objekte aus der Liste ausgewählt werden, um Aktionen "
+"durchzuführen. Es wurden keine Objekte geändert."
+
+msgid "No action selected."
+msgstr "Keine Aktion ausgewählt."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+"Das %(name)s-Objekt mit dem Primärschlüssel %(key)r ist nicht vorhanden."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s hinzufügen"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s ändern"
+
+msgid "Database error"
+msgstr "Datenbankfehler"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s \"%(name)s\" wurde erfolgreich geändert."
+msgstr[1] "%(count)s \"%(name)s\" wurden erfolgreich geändert."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s ausgewählt"
+msgstr[1] "Alle %(total_count)s ausgewählt"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 von %(cnt)s ausgewählt"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Änderungsgeschichte: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Das Löschen des %(class_name)s-Objekts „%(instance)s“ würde ein Löschen der "
+"folgenden geschützten verwandten Objekte erfordern: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django-Systemverwaltung"
+
+msgid "Django administration"
+msgstr "Django-Verwaltung"
+
+msgid "Site administration"
+msgstr "Website-Verwaltung"
+
+msgid "Log in"
+msgstr "Anmelden"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s-Administration"
+
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden."
+
+msgid "Home"
+msgstr "Start"
+
+msgid "Server error"
+msgstr "Serverfehler"
+
+msgid "Server error (500)"
+msgstr "Serverfehler (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfehler <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ein Fehler ist aufgetreten und wurde an die Administratoren per E-Mail "
+"gemeldet. Danke für die Geduld, der Fehler sollte in Kürze behoben sein."
+
+msgid "Run the selected action"
+msgstr "Ausgewählte Aktion ausführen"
+
+msgid "Go"
+msgstr "Ausführen"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Hier klicken, um die Objekte aller Seiten auszuwählen"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Alle %(total_count)s %(module_name)s auswählen"
+
+msgid "Clear selection"
+msgstr "Auswahl widerrufen"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
+"Optionen für den Benutzer geändert werden."
+
+msgid "Enter a username and password."
+msgstr "Bitte einen Benutzernamen und ein Passwort eingeben."
+
+msgid "Change password"
+msgstr "Passwort ändern"
+
+msgid "Please correct the error below."
+msgstr "Bitte die aufgeführten Fehler korrigieren."
+
+msgid "Please correct the errors below."
+msgstr "Bitte die unten aufgeführten Fehler korrigieren."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Bitte geben Sie ein neues Passwort für den Benutzer <strong>%(username)s</"
+"strong> ein."
+
+msgid "Welcome,"
+msgstr "Willkommen,"
+
+msgid "View site"
+msgstr "Auf der Website anzeigen"
+
+msgid "Documentation"
+msgstr "Dokumentation"
+
+msgid "Log out"
+msgstr "Abmelden"
+
+msgid "Add"
+msgstr "Hinzufügen"
+
+msgid "History"
+msgstr "Geschichte"
+
+msgid "View on site"
+msgstr "Auf der Website anzeigen"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s hinzufügen"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Aus der Sortierung entfernen"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sortierung: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Sortierung ein-/ausschalten"
+
+msgid "Delete"
+msgstr "Löschen"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Das Löschen des %(object_name)s \"%(escaped_object)s\" hätte das Löschen "
+"davon abhängiger Daten zur Folge, aber Sie haben nicht die nötigen Rechte, "
+"um die folgenden davon abhängigen Daten zu löschen:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Das Löschen von %(object_name)s „%(escaped_object)s“ würde ein Löschen der "
+"folgenden geschützten verwandten Objekte erfordern:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen "
+"wollen? Es werden zusätzlich die folgenden davon abhängigen Daten gelöscht:"
+
+msgid "Objects"
+msgstr "Objekte"
+
+msgid "Yes, I'm sure"
+msgstr "Ja, ich bin sicher"
+
+msgid "No, take me back"
+msgstr "Nein, bitte abbrechen"
+
+msgid "Delete multiple objects"
+msgstr "Mehrere Objekte löschen"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Das Löschen der ausgewählten %(objects_name)s würde im Löschen geschützter "
+"verwandter Objekte resultieren, allerdings besitzt Ihr Benutzerkonto nicht "
+"die nötigen Rechte, um diese zu löschen:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Das Löschen der ausgewählten %(objects_name)s würde ein Löschen der "
+"folgenden geschützten verwandten Objekte erfordern:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Sind Sie sicher, dass Sie die ausgewählten %(objects_name)s löschen wollen? "
+"Alle folgenden Objekte und ihre verwandten Objekte werden gelöscht:"
+
+msgid "Change"
+msgstr "Ändern"
+
+msgid "Remove"
+msgstr "Entfernen"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "%(verbose_name)s hinzufügen"
+
+msgid "Delete?"
+msgstr "Löschen?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Nach %(filter_title)s "
+
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelle der %(name)s-Anwendung"
+
+msgid "You don't have permission to edit anything."
+msgstr "Sie haben keine Berechtigung, irgendetwas zu ändern."
+
+msgid "Recent Actions"
+msgstr "Kürzliche Aktionen"
+
+msgid "My Actions"
+msgstr "Meine Aktionen"
+
+msgid "None available"
+msgstr "Keine vorhanden"
+
+msgid "Unknown content"
+msgstr "Unbekannter Inhalt"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, dass "
+"die richtigen Datenbanktabellen angelegt wurden und die Datenbank vom "
+"verwendeten Datenbankbenutzer auch lesbar ist."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Sie sind als %(username)s angemeldet, aber nicht autorisiert auf diese Seite "
+"zuzugreifen. Wollen Sie sich mit einem anderen Account anmelden?"
+
+msgid "Forgotten your password or username?"
+msgstr "Benutzername oder Passwort vergessen?"
+
+msgid "Date/time"
+msgstr "Datum/Zeit"
+
+msgid "User"
+msgstr "Benutzer"
+
+msgid "Action"
+msgstr "Aktion"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
+"über diese Verwaltungsseiten angelegt."
+
+msgid "Show all"
+msgstr "Zeige alle"
+
+msgid "Save"
+msgstr "Sichern"
+
+msgid "Popup closing..."
+msgstr "Popup wird geschlossen..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Ausgewählte %(model)s ändern"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "%(model)s hinzufügen"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Ausgewählte %(model)s löschen"
+
+msgid "Search"
+msgstr "Suchen"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s Ergebnis"
+msgstr[1] "%(counter)s Ergebnisse"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s gesamt"
+
+msgid "Save as new"
+msgstr "Als neu sichern"
+
+msgid "Save and add another"
+msgstr "Sichern und neu hinzufügen"
+
+msgid "Save and continue editing"
+msgstr "Sichern und weiter bearbeiten"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten verbracht haben."
+
+msgid "Log in again"
+msgstr "Erneut anmelden"
+
+msgid "Password change"
+msgstr "Passwort ändern"
+
+msgid "Your password was changed."
+msgstr "Ihr Passwort wurde geändert."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Passwort und darunter "
+"dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das "
+"neue Passwort ein."
+
+msgid "Change my password"
+msgstr "Mein Passwort ändern"
+
+msgid "Password reset"
+msgstr "Passwort zurücksetzen"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Ihr Passwort wurde zurückgesetzt. Sie können sich nun anmelden."
+
+msgid "Password reset confirmation"
+msgstr "Zurücksetzen des Passworts bestätigen"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Bitte geben Sie Ihr neues Passwort zweimal ein, damit wir überprüfen können, "
+"ob es richtig eingetippt wurde."
+
+msgid "New password:"
+msgstr "Neues Passwort:"
+
+msgid "Confirm password:"
+msgstr "Passwort wiederholen:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Der Link zum Zurücksetzen Ihres Passworts ist ungültig, wahrscheinlich weil "
+"er schon einmal benutzt wurde. Bitte setzen Sie Ihr Passwort erneut zurück."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Wir haben eine E-Mail zum Zurücksetzen des Passwortes an die angegebene E-"
+"Mail-Adresse gesendet, sofern ein entsprechendes Konto existiert. Sie sollte "
+"in Kürze ankommen."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Falls die E-Mail nicht angekommen sein sollte, bitte die E-Mail-Adresse auf "
+"Richtigkeit und gegebenenfalls den Spam-Ordner überprüfen."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Diese E-Mail wurde aufgrund einer Anfrage zum Zurücksetzen des Passworts auf "
+"der Website %(site_name)s versendet."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:"
+
+msgid "Thanks for using our site!"
+msgstr "Vielen Dank, dass Sie unsere Webseite benutzen!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Das Team von %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Passwort vergessen? Einfach die E-Mail-Adresse unten eingeben und den "
+"Anweisungen zum Zurücksetzen des Passworts in der E-Mail folgen."
+
+msgid "Email address:"
+msgstr "E-Mail-Adresse:"
+
+msgid "Reset my password"
+msgstr "Mein Passwort zurücksetzen"
+
+msgid "All dates"
+msgstr "Alle Daten"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s auswählen"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s zur Änderung auswählen"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Zeit:"
+
+msgid "Lookup"
+msgstr "Suchen"
+
+msgid "Currently:"
+msgstr "Aktuell:"
+
+msgid "Change:"
+msgstr "Ändern:"
diff --git a/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f60d603
--- /dev/null
+++ b/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9cf8561
--- /dev/null
+++ b/tbc/static/admin/locale/de/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# André Hagenbruch, 2011-2012
+# Jannis Leidel <jannis@leidel.info>, 2011,2013-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-12 12:25+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Verfügbare %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dies ist die Liste der verfügbaren %s. Einfach im unten stehenden Feld "
+"markieren und mithilfe des \"Auswählen\"-Pfeils auswählen."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Durch Eingabe in diesem Feld lässt sich die Liste der verfügbaren %s "
+"eingrenzen."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Alle auswählen"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klicken, um alle %s auf einmal auszuwählen."
+
+msgid "Choose"
+msgstr "Auswählen"
+
+msgid "Remove"
+msgstr "Entfernen"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Ausgewählte %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dies ist die Liste der ausgewählten %s. Einfach im unten stehenden Feld "
+"markieren und mithilfe des \"Entfernen\"-Pfeils wieder entfernen."
+
+msgid "Remove all"
+msgstr "Alle entfernen"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klicken, um alle ausgewählten %s auf einmal zu entfernen."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s von %(cnt)s ausgewählt"
+msgstr[1] "%(sel)s von %(cnt)s ausgewählt"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Sie haben Änderungen an bearbeitbaren Feldern vorgenommen und nicht "
+"gespeichert. Wollen Sie die Aktion trotzdem ausführen und Ihre Änderungen "
+"verwerfen?"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Sie haben eine Aktion ausgewählt, aber ihre vorgenommenen Änderungen nicht "
+"gespeichert. Klicken Sie OK, um dennoch zu speichern. Danach müssen Sie die "
+"Aktion erneut ausführen."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Sie haben eine Aktion ausgewählt, aber keine Änderungen an bearbeitbaren "
+"Feldern vorgenommen. Sie wollten wahrscheinlich auf \"Ausführen\" und nicht "
+"auf \"Speichern\" klicken."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Achtung: Sie sind %s Stunde der Serverzeit vorraus."
+msgstr[1] "Achtung: Sie sind %s Stunden der Serverzeit vorraus."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Achtung: Sie sind %s Stunde hinter der Serverzeit."
+msgstr[1] "Achtung: Sie sind %s Stunden hinter der Serverzeit."
+
+msgid "Now"
+msgstr "Jetzt"
+
+msgid "Choose a Time"
+msgstr "Uhrzeit wählen"
+
+msgid "Choose a time"
+msgstr "Uhrzeit"
+
+msgid "Midnight"
+msgstr "Mitternacht"
+
+msgid "6 a.m."
+msgstr "6 Uhr"
+
+msgid "Noon"
+msgstr "Mittag"
+
+msgid "6 p.m."
+msgstr "18 Uhr"
+
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgid "Today"
+msgstr "Heute"
+
+msgid "Choose a Date"
+msgstr "Datum wählen"
+
+msgid "Yesterday"
+msgstr "Gestern"
+
+msgid "Tomorrow"
+msgstr "Morgen"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar März April Mai Juni Juli August September Oktober November "
+"Dezember"
+
+msgid "S M T W T F S"
+msgstr "S M D M D F S"
+
+msgid "Show"
+msgstr "Einblenden"
+
+msgid "Hide"
+msgstr "Ausblenden"
diff --git a/tbc/static/admin/locale/el/LC_MESSAGES/django.mo b/tbc/static/admin/locale/el/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..16c6793
--- /dev/null
+++ b/tbc/static/admin/locale/el/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/el/LC_MESSAGES/django.po b/tbc/static/admin/locale/el/LC_MESSAGES/django.po
new file mode 100644
index 0000000..883a4be
--- /dev/null
+++ b/tbc/static/admin/locale/el/LC_MESSAGES/django.po
@@ -0,0 +1,700 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Dimitris Glezos <glezos@transifex.com>, 2011
+# Giannis Meletakis <meletakis@gmail.com>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Panos Laganakos <panos.laganakos@gmail.com>, 2014
+# Yorgos Pagles <y.pagles@gmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Επιτυχημένη διαγραφή %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Αδύνατη τη διαγραφή του %(name)s"
+
+msgid "Are you sure?"
+msgstr "Είστε σίγουροι;"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Διαγραφη επιλεγμένων %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Διαχείριση"
+
+msgid "All"
+msgstr "Όλα"
+
+msgid "Yes"
+msgstr "Ναι"
+
+msgid "No"
+msgstr "Όχι"
+
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+msgid "Any date"
+msgstr "Οποιαδήποτε ημερομηνία"
+
+msgid "Today"
+msgstr "Σήμερα"
+
+msgid "Past 7 days"
+msgstr "Τελευταίες 7 ημέρες"
+
+msgid "This month"
+msgstr "Αυτόν το μήνα"
+
+msgid "This year"
+msgstr "Αυτόν το χρόνο"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Παρακαλώ εισάγετε το σωστό %(username)s και κωδικό για λογαριασμό "
+"προσωπικού. Σημειώστε οτι και στα δύο πεδία μπορεί να έχει σημασία αν είναι "
+"κεφαλαία ή μικρά. "
+
+msgid "Action:"
+msgstr "Ενέργεια:"
+
+msgid "action time"
+msgstr "ώρα ενέργειας"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "κωδικός αντικειμένου"
+
+msgid "object repr"
+msgstr "αναπαράσταση αντικειμένου"
+
+msgid "action flag"
+msgstr "σημαία ενέργειας"
+
+msgid "change message"
+msgstr "αλλαγή μηνύματος"
+
+msgid "log entry"
+msgstr "εγγραφή καταγραφής"
+
+msgid "log entries"
+msgstr "εγγραφές καταγραφής"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Προστέθηκαν \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Αλλάχθηκαν \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Διαγράφηκαν \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry Object"
+
+msgid "None"
+msgstr "Κανένα"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Κρατήστε πατημένο το \"Control\", ή το \"Command\" αν έχετε Mac, για να "
+"επιλέξετε παραπάνω από ένα."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Έγινε επεξεργασία του %s."
+
+msgid "and"
+msgstr "και"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Προστέθηκε %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Έγινε επεξεργασία %(list)s για %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Διαγράφη %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Κανένα πεδίο δεν άλλαξε."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Το %(name)s \"%(obj)s\" αποθηκεύτηκε με επιτυχία. Μπορείτε να το "
+"επεξεργαστείτε πάλι παρακάτω."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"To %(name)s \"%(obj)s\" προστέθηκε επιτυχώς. Μπορείτε να προσθέσετε και άλλο "
+"%(name)s παρακάτω."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Το %(name)s \"%(obj)s\" αποθηκεύτηκε με επιτυχία."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Το %(name)s \"%(obj)s\" αλλάχθηκε επιτυχώς. Μπορείτε να το επεξεργαστείτε "
+"ξανά παρακάτω."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"To %(name)s \"%(obj)s\" αλλάχθηκε επιτυχώς. Μπορείτε να προσθέσετε και άλλο "
+"%(name)s παρακάτω."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Το %(name)s \"%(obj)s\" αλλάχτηκε με επιτυχία."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Καμμία αλλαγή δεν έχει πραγματοποιηθεί ακόμα γιατί δεν έχετε επιλέξει κανένα "
+"αντικείμενο. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα για να "
+"πραγματοποιήσετε ενέργειες σε αυτά."
+
+msgid "No action selected."
+msgstr "Δεν έχει επιλεγεί ενέργεια."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Το %(name)s \"%(obj)s\" διαγράφηκε με επιτυχία."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr " Το αντικείμενο %(name)s με πρωτεύον κλειδί %(key)r δεν βρέθηκε."
+
+#, python-format
+msgid "Add %s"
+msgstr "Προσθήκη %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Αλλαγή του %s"
+
+msgid "Database error"
+msgstr "Σφάλμα βάσης δεδομένων"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s άλλαξε επιτυχώς."
+msgstr[1] "%(count)s %(name)s άλλαξαν επιτυχώς."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Επιλέχθηκε %(total_count)s"
+msgstr[1] "Επιλέχθηκαν και τα %(total_count)s"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Επιλέγησαν 0 από %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ιστορικό αλλαγών: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Η διαγραφή %(class_name)s %(instance)s θα απαιτούσε την διαγραφή των "
+"ακόλουθων προστατευόμενων συγγενεύων αντικειμένων: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Διαχειριστής ιστότοπου Django"
+
+msgid "Django administration"
+msgstr "Διαχείριση Django"
+
+msgid "Site administration"
+msgstr "Διαχείριση του ιστότοπου"
+
+msgid "Log in"
+msgstr "Σύνδεση"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Διαχείριση %(app)s"
+
+msgid "Page not found"
+msgstr "Η σελίδα δε βρέθηκε"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Λυπόμαστε, αλλά η σελίδα που ζητήθηκε δε μπόρεσε να βρεθεί."
+
+msgid "Home"
+msgstr "Αρχική"
+
+msgid "Server error"
+msgstr "Σφάλμα εξυπηρετητή"
+
+msgid "Server error (500)"
+msgstr "Σφάλμα εξυπηρετητή (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Σφάλμα εξυπηρετητή <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Υπήρξε ένα σφάλμα. Έχει αναφερθεί στους διαχειριστές της σελίδας μέσω email, "
+"και λογικά θα διορθωθεί αμεσα. Ευχαριστούμε για την υπομονή σας."
+
+msgid "Run the selected action"
+msgstr "Εκτέλεση της επιλεγμένης ενέργειας"
+
+msgid "Go"
+msgstr "Μετάβαση"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Κάντε κλικ εδώ για να επιλέξετε τα αντικείμενα σε όλες τις σελίδες"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Επιλέξτε και τα %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Καθαρισμός επιλογής"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Αρχικά εισάγετε το όνομα χρήστη και τον κωδικό πρόσβασης. Μετά την "
+"ολοκλήρωση αυτού του βήματος θα έχετε την επιλογή να προσθέσετε όλα τα "
+"υπόλοιπα στοιχεία για τον χρήστη."
+
+msgid "Enter a username and password."
+msgstr "Εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
+
+msgid "Change password"
+msgstr "Αλλαγή συνθηματικού"
+
+msgid "Please correct the error below."
+msgstr "Παρακαλούμε διορθώστε το παρακάτω λάθος."
+
+msgid "Please correct the errors below."
+msgstr "Παρακαλοϋμε διορθώστε τα παρακάτω λάθη."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Εισάγετε ένα νέο κωδικό πρόσβασης για τον χρήστη <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Καλωσήρθατε,"
+
+msgid "View site"
+msgstr "Δες την εφαρμογή"
+
+msgid "Documentation"
+msgstr "Τεκμηρίωση"
+
+msgid "Log out"
+msgstr "Αποσύνδεση"
+
+msgid "Add"
+msgstr "Προσθήκη"
+
+msgid "History"
+msgstr "Ιστορικό"
+
+msgid "View on site"
+msgstr "Προβολή στην ιστοσελίδα"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Προσθήκη %(name)s"
+
+msgid "Filter"
+msgstr "Φίλτρο"
+
+msgid "Remove from sorting"
+msgstr "Διαγραφή από την ταξινόμηση"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Προτεραιότητα ταξινόμησης: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Εναλλαγή ταξινόμησης"
+
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Επιλέξατε την διαγραφή του αντικειμένου '%(escaped_object)s' είδους "
+"%(object_name)s. Αυτό συνεπάγεται την διαγραφή συσχετισμένων αντικειμενων "
+"για τα οποία δεν έχετε δικάιωμα διαγραφής. Τα είδη των αντικειμένων αυτών "
+"είναι:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Η διαγραφή του %(object_name)s '%(escaped_object)s' απαιτεί την διαγραφή "
+"των παρακάτω προστατευμένων αντικειμένων:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Επιβεβαιώστε ότι επιθημείτε την διαγραφή του %(object_name)s "
+"\"%(escaped_object)s\". Αν προχωρήσετε με την διαγραφή όλα τα παρακάτω "
+"συσχετισμένα αντικείμενα θα διαγραφούν επίσης:"
+
+msgid "Objects"
+msgstr "Αντικείμενα"
+
+msgid "Yes, I'm sure"
+msgstr "Ναι, είμαι βέβαιος"
+
+msgid "No, take me back"
+msgstr "Όχι, επέστρεψε με πίσω."
+
+msgid "Delete multiple objects"
+msgstr "Διαγραφή πολλών αντικειμένων"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Η διαγραφή των επιλεγμένων %(objects_name)s θα είχε σαν αποτέλεσμα την "
+"διαγραφή συσχετισμένων αντικειμένων για τα οποία δεν έχετε το διακαίωμα "
+"διαγραφής:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Η διαγραφή των επιλεγμένων %(objects_name)s απαιτεί την διαγραφή των "
+"παρακάτω προστατευμένων αντικειμένων:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Επιβεβαιώστε ότι επιθημείτε την διαγραφή των επιλεγμένων %(objects_name)s . "
+"Αν προχωρήσετε με την διαγραφή όλα τα παρακάτω συσχετισμένα αντικείμενα θα "
+"διαγραφούν επίσης:"
+
+msgid "Change"
+msgstr "Επεξεργασία"
+
+msgid "Remove"
+msgstr "Αφαίρεση"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Προσθήκη νέου %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Θέλετε να πραγματοποιηθεί διαγραφή?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Ανά %(filter_title)s "
+
+msgid "Summary"
+msgstr "Περίληψη"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Μοντέλα στην εφαρμογή %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Δεν έχετε δικαίωμα να επεξεργαστείτε τίποτα."
+
+msgid "Recent Actions"
+msgstr "Πρόσφατες ενέργειες"
+
+msgid "My Actions"
+msgstr "Οι ενέργειες μου"
+
+msgid "None available"
+msgstr "Κανένα διαθέσιμο"
+
+msgid "Unknown content"
+msgstr "Άγνωστο περιεχόμενο"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Φαίνεται να υπάρχει πρόβλημα με την εγκατάσταση της βάσης σας. Θα πρέπει να "
+"βεβαιωθείτε ότι οι απαραίτητοι πίνακες έχουν δημιουργηθεί και ότι η βάση "
+"είναι προσβάσιμη από τον αντίστοιχο χρήστη που έχετε δηλώσει."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Ξεχάσατε το συνθηματικό ή τον κωδικό χρήστη σας;"
+
+msgid "Date/time"
+msgstr "Ημερομηνία/ώρα"
+
+msgid "User"
+msgstr "Χρήστης"
+
+msgid "Action"
+msgstr "Ενέργεια"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Δεν υπάρχει ιστορικό αλλαγών γι' αυτό το αντικείμενο. Είναι πιθανό η "
+"προσθήκη του να μην πραγματοποιήθηκε χρησιμοποιώντας το διαχειριστικό."
+
+msgid "Show all"
+msgstr "Εμφάνιση όλων"
+
+msgid "Save"
+msgstr "Αποθήκευση"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Άλλαξε το επιλεγμένο %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Πρόσθεσε άλλο ένα %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Διέγραψε το επιλεγμένο %(model)s"
+
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s αποτέλεσμα"
+msgstr[1] "%(counter)s αποτελέσματα"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s συνολικά"
+
+msgid "Save as new"
+msgstr "Αποθήκευση ως νέο"
+
+msgid "Save and add another"
+msgstr "Αποθήκευση και προσθήκη καινούριου"
+
+msgid "Save and continue editing"
+msgstr "Αποθήκευση και συνέχεια επεξεργασίας"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ευχαριστούμε που διαθέσατε κάποιο ποιοτικό χρόνο στον ιστότοπο σήμερα."
+
+msgid "Log in again"
+msgstr "Σύνδεση ξανά"
+
+msgid "Password change"
+msgstr "Αλλαγή συνθηματικού"
+
+msgid "Your password was changed."
+msgstr "Το συνθηματικό σας έχει αλλαχτεί."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Παρακαλούμε εισάγετε το παλιό σας συνθηματικό, για λόγους ασφάλειας, και "
+"κατόπιν εισάγετε το νέο σας συνθηματικό δύο φορές ούτως ώστε να "
+"πιστοποιήσουμε ότι το πληκτρολογήσατε σωστά."
+
+msgid "Change my password"
+msgstr "Αλλαγή του συνθηματικού μου"
+
+msgid "Password reset"
+msgstr "Επαναφορά συνθηματικού"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Ορίσατε επιτυχώς έναν κωδικό πρόσβασής. Πλέον έχετε την δυνατότητα να "
+"συνδεθήτε."
+
+msgid "Password reset confirmation"
+msgstr "Επιβεβαίωση επαναφοράς κωδικού πρόσβασης"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Παρακαλούμε πληκτρολογήστε το νέο κωδικό πρόσβασης δύο φορές ώστε να "
+"βεβαιωθούμε ότι δεν πληκτρολογήσατε κάποιον χαρακτήρα λανθασμένα."
+
+msgid "New password:"
+msgstr "Νέο συνθηματικό:"
+
+msgid "Confirm password:"
+msgstr "Επιβεβαίωση συνθηματικού:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Ο σύνδεσμος που χρησιμοποιήσατε για την επαναφορά του κωδικού πρόσβασης δεν "
+"είναι πλεόν διαθέσιμος. Πιθανώς έχει ήδη χρησιμοποιηθεί. Θα χρειαστεί να "
+"πραγματοποιήσετε και πάλι την διαδικασία αίτησης επαναφοράς του κωδικού "
+"πρόσβασης."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Σας έχουμε αποστείλει οδηγίες σχετικά με τον ορισμό του κωδικού σας, αν "
+"υπάρχει ήδη κάποιος λογαριασμός με την διεύθυνση ηλεκτρονικού ταχυδρομείου "
+"που δηλώσατε. Θα λάβετε τις οδηγίες σύντομα."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Εάν δεν λάβετε email, παρακαλούμε σιγουρευτείτε οτί έχετε εισάγει την "
+"διεύθυνση με την οποία έχετε εγγραφεί, και ελέγξτε τον φάκελο με τα "
+"ανεπιθύμητα."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά κωδικού για τον λογαριασμό "
+"σας στο %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Παρακαλούμε επισκεφθήτε την ακόλουθη σελίδα και επιλέξτε ένα νέο κωδικό "
+"πρόσβασης: "
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+"Το όνομα χρήστη με το οποίο είστε καταχωρημένος για την περίπτωση στην οποία "
+"το έχετε ξεχάσει:"
+
+msgid "Thanks for using our site!"
+msgstr "Ευχαριστούμε που χρησιμοποιήσατε τον ιστότοπο μας!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Η ομάδα του %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Ξεχάσατε τον κωδικό σας; Εισάγετε το email σας παρακάτω, και θα σας "
+"αποστείλουμε οδηγίες για να ρυθμίσετε εναν καινούργιο."
+
+msgid "Email address:"
+msgstr "Ηλεκτρονική διεύθυνση:"
+
+msgid "Reset my password"
+msgstr "Επαναφορά του συνθηματικού μου"
+
+msgid "All dates"
+msgstr "Όλες οι ημερομηνίες"
+
+#, python-format
+msgid "Select %s"
+msgstr "Επιλέξτε %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Επιλέξτε %s προς αλλαγή"
+
+msgid "Date:"
+msgstr "Ημ/νία:"
+
+msgid "Time:"
+msgstr "Ώρα:"
+
+msgid "Lookup"
+msgstr "Αναζήτηση"
+
+msgid "Currently:"
+msgstr "Τώρα:"
+
+msgid "Change:"
+msgstr "Επεξεργασία:"
diff --git a/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..e0fbcca
--- /dev/null
+++ b/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2f8fed4
--- /dev/null
+++ b/tbc/static/admin/locale/el/LC_MESSAGES/djangojs.po
@@ -0,0 +1,167 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Dimitris Glezos <glezos@transifex.com>, 2011
+# glogiotatidis <seadog@sealabs.net>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Nikolas Demiridis <nikolas@demiridis.gr>, 2014
+# Panos Laganakos <panos.laganakos@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Διαθέσιμο %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Αυτή είναι η λίστα των διαθέσιμων %s. Μπορείτε να επιλέξετε κάποια, από το "
+"παρακάτω πεδίο και πατώντας το βέλος \"Επιλογή\" μεταξύ των δύο πεδίων."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Πληκτρολογήστε σε αυτό το πεδίο για να φιλτράρετε τη λίστα των διαθέσιμων %s."
+
+msgid "Filter"
+msgstr "Φίλτρο"
+
+msgid "Choose all"
+msgstr "Επιλογή όλων"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Πατήστε για επιλογή όλων των %s με τη μία."
+
+msgid "Choose"
+msgstr "Επιλογή"
+
+msgid "Remove"
+msgstr "Αφαίρεση"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Επιλέχθηκε %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Αυτή είναι η λίστα των επιλεγμένων %s. Μπορείτε να αφαιρέσετε μερικά "
+"επιλέγοντας τα απο το κουτί παρακάτω και μετά κάνοντας κλίκ στο βελάκι "
+"\"Αφαίρεση\" ανάμεσα στα δύο κουτιά."
+
+msgid "Remove all"
+msgstr "Αφαίρεση όλων"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Κλίκ για να αφαιρεθούν όλα τα επιλεγμένα %s αμέσως."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s από %(cnt)s επιλεγμένα"
+msgstr[1] "%(sel)s από %(cnt)s επιλεγμένα"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Έχετε μη αποθηκευμένες αλλαγές σε μεμονωμένα επεξεργάσιμα πεδία. Άν "
+"εκτελέσετε μια ενέργεια, οι μη αποθηκευμένες αλλάγες θα χαθούν"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Έχετε επιλέξει μια ενέργεια, αλλά δεν έχετε αποθηκεύσει τις αλλαγές στα "
+"εκάστωτε πεδία ακόμα. Παρακαλώ πατήστε ΟΚ για να τις αποθηκεύσετε. Θα "
+"χρειαστεί να εκτελέσετε ξανά την ενέργεια."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Έχετε επιλέξει μια ενέργεια, και δεν έχετε κάνει καμία αλλαγή στα εκάστωτε "
+"πεδία. Πιθανών θέλετε το κουμπί Go αντί του κουμπιού Αποθήκευσης."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Σημείωση: Είστε %s ώρα μπροστά από την ώρα του εξυπηρετητή."
+msgstr[1] "Σημείωση: Είστε %s ώρες μπροστά από την ώρα του εξυπηρετητή."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Σημείωση: Είστε %s ώρα πίσω από την ώρα του εξυπηρετητή"
+msgstr[1] "Σημείωση: Είστε %s ώρες πίσω από την ώρα του εξυπηρετητή."
+
+msgid "Now"
+msgstr "Τώρα"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Επιλέξτε χρόνο"
+
+msgid "Midnight"
+msgstr "Μεσάνυχτα"
+
+msgid "6 a.m."
+msgstr "6 π.μ."
+
+msgid "Noon"
+msgstr "Μεσημέρι"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Ακύρωση"
+
+msgid "Today"
+msgstr "Σήμερα"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Χθές"
+
+msgid "Tomorrow"
+msgstr "Αύριο"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος Μάιος Ιούνιος Ιούλιος Αύγουστος "
+"Σεπτέμβρης Οκτώβριος Νοέμβριος Δεκέμβριος"
+
+msgid "S M T W T F S"
+msgstr "Κ Δ Τ Τ Π Π Σ"
+
+msgid "Show"
+msgstr "Προβολή"
+
+msgid "Hide"
+msgstr "Απόκρυψη"
diff --git a/tbc/static/admin/locale/en/LC_MESSAGES/django.mo b/tbc/static/admin/locale/en/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..08a7b68
--- /dev/null
+++ b/tbc/static/admin/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en/LC_MESSAGES/django.po b/tbc/static/admin/locale/en/LC_MESSAGES/django.po
new file mode 100644
index 0000000..88f7b95
--- /dev/null
+++ b/tbc/static/admin/locale/en/LC_MESSAGES/django.po
@@ -0,0 +1,846 @@
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2010-05-13 15:35+0200\n"
+"Last-Translator: Django team\n"
+"Language-Team: English <en@li.org>\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/actions.py:50
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#: contrib/admin/actions.py:62 contrib/admin/options.py:1641
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+#: contrib/admin/actions.py:64 contrib/admin/options.py:1643
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/actions.py:88
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+#: contrib/admin/apps.py:11
+msgid "Administration"
+msgstr ""
+
+#: contrib/admin/filters.py:105 contrib/admin/filters.py:205
+#: contrib/admin/filters.py:241 contrib/admin/filters.py:278
+#: contrib/admin/filters.py:386
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filters.py:242
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filters.py:243
+msgid "No"
+msgstr ""
+
+#: contrib/admin/filters.py:257
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/filters.py:317
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filters.py:318
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/filters.py:322
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filters.py:326
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filters.py:330
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/forms.py:13
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+#: contrib/admin/helpers.py:30
+msgid "Action:"
+msgstr ""
+
+#: contrib/admin/models.py:34
+msgid "action time"
+msgstr ""
+
+#: contrib/admin/models.py:41
+msgid "user"
+msgstr ""
+
+#: contrib/admin/models.py:46
+msgid "content type"
+msgstr ""
+
+#: contrib/admin/models.py:49
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models.py:50
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:51
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models.py:52
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models.py:57
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:58
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/models.py:67
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#: contrib/admin/models.py:69
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#: contrib/admin/models.py:74
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+#: contrib/admin/models.py:76
+msgid "LogEntry Object"
+msgstr ""
+
+#: contrib/admin/options.py:192 contrib/admin/options.py:221
+msgid "None"
+msgstr ""
+
+#: contrib/admin/options.py:257
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: contrib/admin/options.py:931
+msgid "Added."
+msgstr ""
+
+#: contrib/admin/options.py:933
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+#: contrib/admin/options.py:933 contrib/admin/options.py:943
+#: contrib/admin/options.py:1848
+msgid "and"
+msgstr ""
+
+#: contrib/admin/options.py:938
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#: contrib/admin/options.py:942
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#: contrib/admin/options.py:947
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+#: contrib/admin/options.py:951
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/options.py:1076 contrib/admin/options.py:1132
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/options.py:1090
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#: contrib/admin/options.py:1097
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/options.py:1125
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#: contrib/admin/options.py:1142
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#: contrib/admin/options.py:1151
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/options.py:1234 contrib/admin/options.py:1498
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+#: contrib/admin/options.py:1253
+msgid "No action selected."
+msgstr ""
+
+#: contrib/admin/options.py:1271
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/options.py:1358 contrib/admin/options.py:1616
+#: contrib/admin/options.py:1672
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#: contrib/admin/options.py:1409
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#: contrib/admin/options.py:1409
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+#: contrib/admin/options.py:1477
+msgid "Database error"
+msgstr ""
+
+#: contrib/admin/options.py:1540
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/options.py:1567
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/options.py:1573
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#: contrib/admin/options.py:1689
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#: contrib/admin/options.py:1842
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#: contrib/admin/options.py:1849
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+#: contrib/admin/sites.py:40 contrib/admin/templates/admin/base_site.html.py:3
+msgid "Django site admin"
+msgstr ""
+
+#: contrib/admin/sites.py:43 contrib/admin/templates/admin/base_site.html.py:6
+msgid "Django administration"
+msgstr ""
+
+#: contrib/admin/sites.py:46
+msgid "Site administration"
+msgstr ""
+
+#: contrib/admin/sites.py:393 contrib/admin/templates/admin/login.html.py:61
+#: contrib/admin/templates/registration/password_reset_complete.html:18
+#: contrib/admin/tests.py:120
+msgid "Log in"
+msgstr ""
+
+#: contrib/admin/sites.py:520
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+#: contrib/admin/templates/admin/app_index.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/base.html:56
+#: contrib/admin/templates/admin/change_form.html:18
+#: contrib/admin/templates/admin/change_list.html:40
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:8
+#: contrib/admin/templates/admin/invalid_setup.html:6
+#: contrib/admin/templates/admin/object_history.html:6
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_form.html:7
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:6
+msgid "Home"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:7
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:11
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:14
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:15
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: contrib/admin/templates/admin/actions.html:4
+msgid "Run the selected action"
+msgstr ""
+
+#: contrib/admin/templates/admin/actions.html:4
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/actions.html:11
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#: contrib/admin/templates/admin/actions.html:11
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/actions.html:13
+msgid "Clear selection"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:8
+msgid "Enter a username and password."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:17
+#: contrib/admin/templates/admin/auth/user/change_password.html:54
+#: contrib/admin/templates/admin/base.html:44
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:4
+msgid "Change password"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#: contrib/admin/templates/admin/change_form.html:47
+#: contrib/admin/templates/admin/change_list.html:67
+#: contrib/admin/templates/admin/login.html:21
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Please correct the error below."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#: contrib/admin/templates/admin/change_form.html:47
+#: contrib/admin/templates/admin/change_list.html:67
+#: contrib/admin/templates/admin/login.html:21
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Please correct the errors below."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:31
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:30
+msgid "Welcome,"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:35
+msgid "View site"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:40
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:4
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:4
+msgid "Log out"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/index.html:31
+#: contrib/admin/templates/admin/related_widget_wrapper.html:16
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:33
+#: contrib/admin/templates/admin/object_history.html:10
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:35
+#: contrib/admin/templates/admin/edit_inline/stacked.html:10
+#: contrib/admin/templates/admin/edit_inline/tabular.html:33
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:58
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:78
+msgid "Filter"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list_results.html:17
+msgid "Remove from sorting"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list_results.html:18
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list_results.html:19
+msgid "Toggle sorting"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:12
+#: contrib/admin/templates/admin/related_widget_wrapper.html:23
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:32
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:34
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:33
+msgid "Objects"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:41
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:44
+msgid "Yes, I'm sure"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:42
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:45
+msgid "No, take me back"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:11
+msgid "Delete multiple objects"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:17
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:24
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_selected_confirmation.html:31
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/edit_inline/stacked.html:8
+#: contrib/admin/templates/admin/edit_inline/tabular.html:31
+#: contrib/admin/templates/admin/index.html:37
+#: contrib/admin/templates/admin/related_widget_wrapper.html:9
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/edit_inline/stacked.html:26
+#: contrib/admin/templates/admin/edit_inline/tabular.html:80
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/templates/admin/edit_inline/stacked.html:27
+#: contrib/admin/templates/admin/edit_inline/tabular.html:79
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/edit_inline/tabular.html:17
+msgid "Delete?"
+msgstr ""
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/includes/object_delete_summary.html:2
+msgid "Summary"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:20
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:47
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:55
+msgid "Recent Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "My Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:60
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:74
+msgid "Unknown content"
+msgstr ""
+
+#: contrib/admin/templates/admin/invalid_setup.html:12
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:37
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:57
+msgid "Forgotten your password or username?"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:22
+msgid "Date/time"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:23
+msgid "User"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:38
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+#: contrib/admin/templates/admin/search_form.html:9
+msgid "Show all"
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:11
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Save"
+msgstr ""
+
+#: contrib/admin/templates/admin/popup_response.html:3
+msgid "Popup closing..."
+msgstr ""
+
+#: contrib/admin/templates/admin/related_widget_wrapper.html:8
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/related_widget_wrapper.html:15
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/related_widget_wrapper.html:22
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:7
+msgid "Search"
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:9
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:9
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:8
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:9
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:10
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:7
+#: contrib/admin/templates/registration/password_change_form.html:8
+msgid "Password change"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:14
+msgid "Your password was changed."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:26
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:54
+#: contrib/admin/templates/registration/password_reset_confirm.html:24
+msgid "Change my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_complete.html:7
+#: contrib/admin/templates/registration/password_reset_done.html:7
+#: contrib/admin/templates/registration/password_reset_form.html:7
+msgid "Password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_complete.html:16
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:7
+msgid "Password reset confirmation"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:17
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "New password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:23
+msgid "Confirm password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:29
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:15
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:17
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:4
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:8
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:10
+msgid "Thanks for using our site!"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:12
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:15
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:19
+msgid "Email address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:19
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:389
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/main.py:81
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:83
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/widgets.py:95
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/widgets.py:96
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/widgets.py:178
+msgid "Lookup"
+msgstr ""
+
+#: contrib/admin/widgets.py:366
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/widgets.py:367
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..08a7b68
--- /dev/null
+++ b/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a5d3b3b
--- /dev/null
+++ b/tbc/static/admin/locale/en/LC_MESSAGES/djangojs.po
@@ -0,0 +1,189 @@
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2010-05-13 15:35+0200\n"
+"Last-Translator: Django team\n"
+"Language-Team: English <en@li.org>\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:47
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:53
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:69
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:74
+msgid "Filter"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:78
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:78
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:84
+msgid "Choose"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:86
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:92
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:98
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:108
+msgid "Remove all"
+msgstr ""
+
+#: contrib/admin/static/admin/js/SelectFilter2.js:108
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+#: contrib/admin/static/admin/js/actions.js:47
+#: contrib/admin/static/admin/js/actions.min.js:2
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/static/admin/js/actions.js:116
+#: contrib/admin/static/admin/js/actions.min.js:4
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+#: contrib/admin/static/admin/js/actions.js:128
+#: contrib/admin/static/admin/js/actions.min.js:5
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+#: contrib/admin/static/admin/js/actions.js:130
+#: contrib/admin/static/admin/js/actions.min.js:5
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:74
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:82
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:109
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:149
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:116
+msgid "Choose a Time"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:146
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:150
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:151
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:152
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:153
+msgid "6 p.m."
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:157
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:281
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:217
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:274
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:224
+msgid "Choose a Date"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:272
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:276
+msgid "Tomorrow"
+msgstr ""
+
+#: contrib/admin/static/admin/js/calendar.js:11
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/static/admin/js/calendar.js:12
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/static/admin/js/collapse.js:10
+#: contrib/admin/static/admin/js/collapse.js:21
+#: contrib/admin/static/admin/js/collapse.min.js:1
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/static/admin/js/collapse.js:18
+#: contrib/admin/static/admin/js/collapse.min.js:1
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.mo b/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ccef84e
--- /dev/null
+++ b/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.po b/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.po
new file mode 100644
index 0000000..65edc90
--- /dev/null
+++ b/tbc/static/admin/locale/en_AU/LC_MESSAGES/django.po
@@ -0,0 +1,636 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Tom Fifield <tom@openstack.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: English (Australia) (http://www.transifex.com/django/django/"
+"language/en_AU/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_AU\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Successfully deleted %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Cannot delete %(name)s"
+
+msgid "Are you sure?"
+msgstr "Are you sure?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Delete selected %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "All"
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Unknown"
+
+msgid "Any date"
+msgstr "Any date"
+
+msgid "Today"
+msgstr "Today"
+
+msgid "Past 7 days"
+msgstr "Past 7 days"
+
+msgid "This month"
+msgstr "This month"
+
+msgid "This year"
+msgstr "This year"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+
+msgid "Action:"
+msgstr "Action:"
+
+msgid "action time"
+msgstr "action time"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "object id"
+
+msgid "object repr"
+msgstr "object repr"
+
+msgid "action flag"
+msgstr "action flag"
+
+msgid "change message"
+msgstr "change message"
+
+msgid "log entry"
+msgstr "log entry"
+
+msgid "log entries"
+msgstr "log entries"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Added \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Changed \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Deleted \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry Object"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Changed %s."
+
+msgid "and"
+msgstr "and"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Added %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Changed %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Deleted %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "No fields changed."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "The %(name)s \"%(obj)s\" was added successfully."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "The %(name)s \"%(obj)s\" was changed successfully."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+
+msgid "No action selected."
+msgstr "No action selected."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s object with primary key %(key)r does not exist."
+
+#, python-format
+msgid "Add %s"
+msgstr "Add %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Change %s"
+
+msgid "Database error"
+msgstr "Database error"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s was changed successfully."
+msgstr[1] "%(count)s %(name)s were changed successfully."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selected"
+msgstr[1] "All %(total_count)s selected"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 of %(cnt)s selected"
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1d9029c
--- /dev/null
+++ b/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..bd75193
--- /dev/null
+++ b/tbc/static/admin/locale/en_AU/LC_MESSAGES/djangojs.po
@@ -0,0 +1,153 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Tom Fifield <tom@openstack.org>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: English (Australia) (http://www.transifex.com/django/django/"
+"language/en_AU/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_AU\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Available %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Type into this box to filter down the list of available %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Choose all"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Click to choose all %s at once."
+
+msgid "Choose"
+msgstr "Choose"
+
+msgid "Remove"
+msgstr "Remove"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Chosen %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+
+msgid "Remove all"
+msgstr "Remove all"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Click to remove all chosen %s at once."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.mo b/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..db8f07d
--- /dev/null
+++ b/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.po b/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2026b1d
--- /dev/null
+++ b/tbc/static/admin/locale/en_GB/LC_MESSAGES/django.po
@@ -0,0 +1,656 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# jon_atkinson <jon@jonatkinson.co.uk>, 2011-2012
+# Ross Poulton <ross@rossp.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/django/"
+"django/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Successfully deleted %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Cannot delete %(name)s"
+
+msgid "Are you sure?"
+msgstr "Are you sure?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Delete selected %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "All"
+
+msgid "Yes"
+msgstr "Yes"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Unknown"
+
+msgid "Any date"
+msgstr "Any date"
+
+msgid "Today"
+msgstr "Today"
+
+msgid "Past 7 days"
+msgstr "Past 7 days"
+
+msgid "This month"
+msgstr "This month"
+
+msgid "This year"
+msgstr "This year"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Action:"
+
+msgid "action time"
+msgstr "action time"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "object id"
+
+msgid "object repr"
+msgstr "object repr"
+
+msgid "action flag"
+msgstr "action flag"
+
+msgid "change message"
+msgstr "change message"
+
+msgid "log entry"
+msgstr "log entry"
+
+msgid "log entries"
+msgstr "log entries"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Added \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Changed \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Deleted \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry Object"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Changed %s."
+
+msgid "and"
+msgstr "and"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Added %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Changed %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Deleted %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "No fields changed."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "The %(name)s \"%(obj)s\" was added successfully."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "The %(name)s \"%(obj)s\" was changed successfully."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+
+msgid "No action selected."
+msgstr "No action selected."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "The %(name)s \"%(obj)s\" was deleted successfully."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s object with primary key %(key)r does not exist."
+
+#, python-format
+msgid "Add %s"
+msgstr "Add %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Change %s"
+
+msgid "Database error"
+msgstr "Database error"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s was changed successfully."
+msgstr[1] "%(count)s %(name)s were changed successfully."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selected"
+msgstr[1] "All %(total_count)s selected"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 of %(cnt)s selected"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Change history: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django site admin"
+
+msgid "Django administration"
+msgstr "Django administration"
+
+msgid "Site administration"
+msgstr "Site administration"
+
+msgid "Log in"
+msgstr "Log in"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Page not found"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "We're sorry, but the requested page could not be found."
+
+msgid "Home"
+msgstr "Home"
+
+msgid "Server error"
+msgstr "Server error"
+
+msgid "Server error (500)"
+msgstr "Server error (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Server Error <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Run the selected action"
+
+msgid "Go"
+msgstr "Go"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Click here to select the objects across all pages"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Select all %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Clear selection"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+
+msgid "Enter a username and password."
+msgstr "Enter a username and password."
+
+msgid "Change password"
+msgstr "Change password"
+
+msgid "Please correct the error below."
+msgstr "Please correct the errors below."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Enter a new password for the user <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Welcome,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Documentation"
+
+msgid "Log out"
+msgstr "Log out"
+
+msgid "Add"
+msgstr "Add"
+
+msgid "History"
+msgstr "History"
+
+msgid "View on site"
+msgstr "View on site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Add %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Remove from sorting"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorting priority: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Toggle sorting"
+
+msgid "Delete"
+msgstr "Delete"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Yes, I'm sure"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Delete multiple objects"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+
+msgid "Change"
+msgstr "Change"
+
+msgid "Remove"
+msgstr "Remove"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Add another %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Delete?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " By %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "You don't have permission to edit anything."
+
+msgid "Recent Actions"
+msgstr "Recent Actions"
+
+msgid "My Actions"
+msgstr "My Actions"
+
+msgid "None available"
+msgstr "None available"
+
+msgid "Unknown content"
+msgstr "Unknown content"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Forgotten your password or username?"
+
+msgid "Date/time"
+msgstr "Date/time"
+
+msgid "User"
+msgstr "User"
+
+msgid "Action"
+msgstr "Action"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+
+msgid "Show all"
+msgstr "Show all"
+
+msgid "Save"
+msgstr "Save"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Search"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s result"
+msgstr[1] "%(counter)s results"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+msgid "Save as new"
+msgstr "Save as new"
+
+msgid "Save and add another"
+msgstr "Save and add another"
+
+msgid "Save and continue editing"
+msgstr "Save and continue editing"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Thanks for spending some quality time with the Web site today."
+
+msgid "Log in again"
+msgstr "Log in again"
+
+msgid "Password change"
+msgstr "Password change"
+
+msgid "Your password was changed."
+msgstr "Your password was changed."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+
+msgid "Change my password"
+msgstr "Change my password"
+
+msgid "Password reset"
+msgstr "Password reset"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Your password has been set. You may go ahead and log in now."
+
+msgid "Password reset confirmation"
+msgstr "Password reset confirmation"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+
+msgid "New password:"
+msgstr "New password:"
+
+msgid "Confirm password:"
+msgstr "Confirm password:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Please go to the following page and choose a new password:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Your username, in case you've forgotten:"
+
+msgid "Thanks for using our site!"
+msgstr "Thanks for using our site!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "The %(site_name)s team"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Reset my password"
+
+msgid "All dates"
+msgstr "All dates"
+
+#, python-format
+msgid "Select %s"
+msgstr "Select %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Select %s to change"
+
+msgid "Date:"
+msgstr "Date:"
+
+msgid "Time:"
+msgstr "Time:"
+
+msgid "Lookup"
+msgstr "Lookup"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f95960d
--- /dev/null
+++ b/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..4b823f4
--- /dev/null
+++ b/tbc/static/admin/locale/en_GB/LC_MESSAGES/djangojs.po
@@ -0,0 +1,164 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# jon_atkinson <jon@jonatkinson.co.uk>, 2012
+# Ross Poulton <ross@rossp.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/django/"
+"django/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Available %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Type into this box to filter down the list of available %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Choose all"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Click to choose all %s at once."
+
+msgid "Choose"
+msgstr "Choose"
+
+msgid "Remove"
+msgstr "Remove"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Chosen %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+
+msgid "Remove all"
+msgstr "Remove all"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Click to remove all chosen %s at once."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s of %(cnt)s selected"
+msgstr[1] "%(sel)s of %(cnt)s selected"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Now"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Choose a time"
+
+msgid "Midnight"
+msgstr "Midnight"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Noon"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Cancel"
+
+msgid "Today"
+msgstr "Today"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Yesterday"
+
+msgid "Tomorrow"
+msgstr "Tomorrow"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"January February March April May June July August September October November "
+"December"
+
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+msgid "Show"
+msgstr "Show"
+
+msgid "Hide"
+msgstr "Hide"
diff --git a/tbc/static/admin/locale/eo/LC_MESSAGES/django.mo b/tbc/static/admin/locale/eo/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5612610
--- /dev/null
+++ b/tbc/static/admin/locale/eo/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/eo/LC_MESSAGES/django.po b/tbc/static/admin/locale/eo/LC_MESSAGES/django.po
new file mode 100644
index 0000000..97bebf3
--- /dev/null
+++ b/tbc/static/admin/locale/eo/LC_MESSAGES/django.po
@@ -0,0 +1,682 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2012-2013
+# Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2013-2015
+# Dinu Gherman <gherman@darwin.in-berlin.de>, 2011
+# kristjan <kristjan.schmidt@googlemail.com>, 2012
+# Adamo Mesha <adam.raizen@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-20 13:22+0000\n"
+"Last-Translator: Baptiste Darthenay <baptiste+transifex@darthenay.fr>\n"
+"Language-Team: Esperanto (http://www.transifex.com/django/django/language/"
+"eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Sukcese forigis %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ne povas forigi %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ĉu vi certas?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Forigi elektitajn %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administrado"
+
+msgid "All"
+msgstr "Ĉio"
+
+msgid "Yes"
+msgstr "Jes"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Nekonata"
+
+msgid "Any date"
+msgstr "Ajna dato"
+
+msgid "Today"
+msgstr "Hodiaŭ"
+
+msgid "Past 7 days"
+msgstr "Lastaj 7 tagoj"
+
+msgid "This month"
+msgstr "Ĉi tiu monato"
+
+msgid "This year"
+msgstr "Ĉi tiu jaro"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Bonvolu eniri la ĝustan %(username)s-n kaj pasvorton por personara konto. "
+"Notu, ke ambaŭ kampoj povas esti usklecodistinga."
+
+msgid "Action:"
+msgstr "Ago:"
+
+msgid "action time"
+msgstr "aga tempo"
+
+msgid "user"
+msgstr "uzanto"
+
+msgid "content type"
+msgstr "enhava tipo"
+
+msgid "object id"
+msgstr "objekta identigaĵo"
+
+msgid "object repr"
+msgstr "objekta prezento"
+
+msgid "action flag"
+msgstr "aga marko"
+
+msgid "change message"
+msgstr "ŝanĝmesaĝo"
+
+msgid "log entry"
+msgstr "protokolero"
+
+msgid "log entries"
+msgstr "protokoleroj"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" aldonita."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Ŝanĝita \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Forigita \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Protokolera objekto"
+
+msgid "None"
+msgstr "Neniu"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Premadu la stirklavon, aŭ Komando-klavon ĉe Mac, por elekti pli ol unu."
+
+msgid "Added."
+msgstr "Aldonita."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Ŝanĝita %s."
+
+msgid "and"
+msgstr "kaj"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Aldonita %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Ŝanĝita %(list)s por %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Forigita %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Neniu kampo ŝanĝita."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"La %(name)s \"%(obj)s\" estis aldonita sukcese. Vi rajtas ĝin redakti denove "
+"sube."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"La %(name)s \"%(obj)s\" estis sukcese aldonita. Vi povas sube aldoni alian "
+"%(name)s-n."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "La %(name)s \"%(obj)s\" estis aldonita sukcese."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"La %(name)s \"%(obj)s\" estis sukcese ŝanĝita. Vi povas sube redakti ĝin "
+"denove."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"La %(name)s \"%(obj)s\" estis sukcese ŝanĝita. Vi povas sube aldoni alian "
+"%(name)s-n."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "La %(name)s \"%(obj)s\" estis ŝanĝita sukcese."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Elementoj devas esti elektitaj por elfari agojn sur ilin. Neniu elemento "
+"estis ŝanĝita."
+
+msgid "No action selected."
+msgstr "Neniu ago elektita."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "La %(name)s \"%(obj)s\" estis forigita sukcese."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s objekto kun ĉefŝlosilo %(key)r ne ekzistas."
+
+#, python-format
+msgid "Add %s"
+msgstr "Aldoni %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Ŝanĝi %s"
+
+msgid "Database error"
+msgstr "Datumbaza eraro"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s estis sukcese ŝanĝita."
+msgstr[1] "%(count)s %(name)s estis sukcese ŝanĝitaj."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s elektitaj"
+msgstr[1] "Ĉiuj %(total_count)s elektitaj"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 el %(cnt)s elektita"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ŝanĝa historio: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Forigi la %(class_name)s-n “%(instance)s” postulus forigi la sekvajn "
+"protektitajn rilatajn objektojn: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Djanga reteja administrado"
+
+msgid "Django administration"
+msgstr "Djanga administrado"
+
+msgid "Site administration"
+msgstr "Reteja administrado"
+
+msgid "Log in"
+msgstr "Ensaluti"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administrado"
+
+msgid "Page not found"
+msgstr "Paĝo ne trovita"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Bedaŭrinde la petitan paĝon ne povas esti trovita."
+
+msgid "Home"
+msgstr "Ĉefpaĝo"
+
+msgid "Server error"
+msgstr "Servila eraro"
+
+msgid "Server error (500)"
+msgstr "Servila eraro (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Servila eraro <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Okazis eraro. Ĝi estis raportita al la retejaj administrantoj tra retpoŝto "
+"kaj baldaŭ devus esti riparita. Dankon por via pacienco."
+
+msgid "Run the selected action"
+msgstr "Lanĉi la elektita agon"
+
+msgid "Go"
+msgstr "Ek"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klaku ĉi-tie por elekti la objektojn trans ĉiuj paĝoj"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Elekti ĉiuj %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Viŝi elekton"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Unue, bovolu tajpi salutnomon kaj pasvorton. Tiam, vi povos redakti pli da "
+"uzantaj agordoj."
+
+msgid "Enter a username and password."
+msgstr "Enigu salutnomon kaj pasvorton."
+
+msgid "Change password"
+msgstr "Ŝanĝi pasvorton"
+
+msgid "Please correct the error below."
+msgstr "Bonvolu ĝustigi la erarojn sube."
+
+msgid "Please correct the errors below."
+msgstr "Bonvolu ĝustigi la erarojn sube."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Enigu novan pasvorton por la uzanto <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Bonvenon,"
+
+msgid "View site"
+msgstr "Vidi retejon"
+
+msgid "Documentation"
+msgstr "Dokumentaro"
+
+msgid "Log out"
+msgstr "Elsaluti"
+
+msgid "Add"
+msgstr "Aldoni"
+
+msgid "History"
+msgstr "Historio"
+
+msgid "View on site"
+msgstr "Vidi sur retejo"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Aldoni %(name)s"
+
+msgid "Filter"
+msgstr "Filtri"
+
+msgid "Remove from sorting"
+msgstr "Forigi el ordigado"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Ordiga prioritato: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Ŝalti ordigadon"
+
+msgid "Delete"
+msgstr "Forigi"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Foriganti la %(object_name)s '%(escaped_object)s' rezultus en foriganti "
+"rilatajn objektojn, sed via konto ne havas permeson por forigi la sekvantajn "
+"tipojn de objektoj:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Forigi la %(object_name)s '%(escaped_object)s' postulus forigi la sekvajn "
+"protektitajn rilatajn objektojn:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ĉu vi certas, ke vi volas forigi %(object_name)s \"%(escaped_object)s\"? "
+"Ĉiuj el la sekvaj rilataj eroj estos forigitaj:"
+
+msgid "Objects"
+msgstr "Objektoj"
+
+msgid "Yes, I'm sure"
+msgstr "Jes, mi certas"
+
+msgid "No, take me back"
+msgstr "Ne, reen"
+
+msgid "Delete multiple objects"
+msgstr "Forigi plurajn objektojn"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Forigi la %(objects_name)s rezultus en forigi rilatajn objektojn, sed via "
+"konto ne havas permeson por forigi la sekvajn tipojn de objektoj:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Forigi la %(objects_name)s postulus forigi la sekvajn protektitajn rilatajn "
+"objektojn:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ĉu vi certas, ke vi volas forigi la elektitajn %(objects_name)s? Ĉiuj el la "
+"sekvaj objektoj kaj iliaj rilataj eroj estos forigita:"
+
+msgid "Change"
+msgstr "Ŝanĝi"
+
+msgid "Remove"
+msgstr "Forigu"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Aldoni alian %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Forviŝi?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Laŭ %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resumo"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeloj en la %(name)s aplikaĵo"
+
+msgid "You don't have permission to edit anything."
+msgstr "Vi ne havas permeson por redakti ĉion ajn."
+
+msgid "Recent Actions"
+msgstr "Lastaj agoj"
+
+msgid "My Actions"
+msgstr "Miaj agoj"
+
+msgid "None available"
+msgstr "Neniu disponebla"
+
+msgid "Unknown content"
+msgstr "Nekonata enhavo"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Io malbonas en via datumbaza instalo. Bonvolu certigi ke la konvenaj tabeloj "
+"de datumbazo estis kreitaj, kaj ke la datumbazo estas legebla per la ĝusta "
+"uzanto."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Vi estas aŭtentikigita kiel %(username)s, sed ne havas permeson aliri tiun "
+"paĝon. Ĉu vi ŝatus ensaluti per alia konto?"
+
+msgid "Forgotten your password or username?"
+msgstr "Ĉu vi forgesis vian pasvorton aŭ salutnomo?"
+
+msgid "Date/time"
+msgstr "Dato/horo"
+
+msgid "User"
+msgstr "Uzanto"
+
+msgid "Action"
+msgstr "Ago"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ĉi tiu objekto ne havas ŝanĝ-historion. Eble ĝi ne estis aldonita per la "
+"administranta retejo."
+
+msgid "Show all"
+msgstr "Montri ĉion"
+
+msgid "Save"
+msgstr "Konservi"
+
+msgid "Popup closing..."
+msgstr "Ŝprucfenestro fermante…"
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Redaktu elektitan %(model)sn"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Aldoni alian %(model)sn"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Forigi elektitan %(model)sn"
+
+msgid "Search"
+msgstr "Serĉu"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resulto"
+msgstr[1] "%(counter)s resultoj"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s entute"
+
+msgid "Save as new"
+msgstr "Konservi kiel novan"
+
+msgid "Save and add another"
+msgstr "Konservi kaj aldoni alian"
+
+msgid "Save and continue editing"
+msgstr "Konservi kaj daŭre redakti"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dankon pro pasigo de kvalita tempon kun la retejo hodiaŭ."
+
+msgid "Log in again"
+msgstr "Ensaluti denove"
+
+msgid "Password change"
+msgstr "Pasvorta ŝanĝo"
+
+msgid "Your password was changed."
+msgstr "Via pasvorto estis sukcese ŝanĝita."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Bonvolu enigi vian malnovan pasvorton, pro sekureco, kaj tiam enigi vian "
+"novan pasvorton dufoje, tiel ni povas konfirmi ke vi ĝuste tajpis ĝin."
+
+msgid "Change my password"
+msgstr "Ŝanĝi mian passvorton"
+
+msgid "Password reset"
+msgstr "Pasvorta rekomencigo"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Via pasvorto estis ŝanĝita. Vi povas iri antaŭen kaj ensaluti nun."
+
+msgid "Password reset confirmation"
+msgstr "Pasvorta rekomenciga konfirmo"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Bonvolu entajpi vian novan pasvorton dufoje, tiel ni povas konfirmi ke vi "
+"ĝuste tajpis ĝin."
+
+msgid "New password:"
+msgstr "Nova pasvorto:"
+
+msgid "Confirm password:"
+msgstr "Konfirmi pasvorton:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"La pasvorta rekomenciga ligo malvalidis, eble ĉar ĝi jam estis uzata. "
+"Bonvolu peti novan pasvortan rekomencigon."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Ni retpoŝte sendis al vi instrukciojn por agordi la pasvorton, se konto "
+"ekzistas, al la retpoŝto kiun vi sendis. Vi baldaŭ devus ĝin ricevi."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Se vi ne ricevas retpoŝton, bonvolu certigi vin eniris la adreson kun kiu vi "
+"registris, kaj kontroli vian spaman dosierujon."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Vi ricevis ĉi tiun retpoŝton ĉar vi petis pasvortan rekomencigon por via "
+"uzanta konto ĉe %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Bonvolu iri al la sekvanta paĝo kaj elekti novan pasvorton:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Via salutnomo, se vi forgesis:"
+
+msgid "Thanks for using our site!"
+msgstr "Dankon pro uzo de nia retejo!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "La %(site_name)s teamo"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Vi forgesis vian pasvorton? Malsupre enigu vian retpoŝtan adreson kaj ni "
+"retpoŝte sendos instrukciojn por agordi novan."
+
+msgid "Email address:"
+msgstr "Retpoŝto:"
+
+msgid "Reset my password"
+msgstr "Rekomencigi mian pasvorton"
+
+msgid "All dates"
+msgstr "Ĉiuj datoj"
+
+#, python-format
+msgid "Select %s"
+msgstr "Elekti %sn"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Elekti %sn por ŝanĝi"
+
+msgid "Date:"
+msgstr "Dato:"
+
+msgid "Time:"
+msgstr "Horo:"
+
+msgid "Lookup"
+msgstr "Trarigardo"
+
+msgid "Currently:"
+msgstr "Nuntempe:"
+
+msgid "Change:"
+msgstr "Ŝanĝo:"
diff --git a/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..578b4c0
--- /dev/null
+++ b/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..080d281
--- /dev/null
+++ b/tbc/static/admin/locale/eo/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2012
+# Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2014-2015
+# Jaffa McNeill <jaffa.mcneill@gmail.com>, 2011
+# Adamo Mesha <adam.raizen@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-20 13:21+0000\n"
+"Last-Translator: Baptiste Darthenay <baptiste+transifex@darthenay.fr>\n"
+"Language-Team: Esperanto (http://www.transifex.com/django/django/language/"
+"eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Disponebla %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Tio ĉi estas la listo de disponeblaj %s. Vi povas forigi kelkajn elektante "
+"ilin en la suba skatolo kaj tiam klakante la \"Elekti\" sagon inter la du "
+"skatoloj."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Entipu en ĉi-tiu skatolo por filtri la liston de haveblaj %s."
+
+msgid "Filter"
+msgstr "Filtru"
+
+msgid "Choose all"
+msgstr "Elekti ĉiuj"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klaku por tuj elekti ĉiuj %s."
+
+msgid "Choose"
+msgstr "Elekti"
+
+msgid "Remove"
+msgstr "Forigu"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Elektita %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Tio ĉi estas la listo de elektitaj %s. Vi povas forigi kelkajn elektante "
+"ilin en la suba skatolo kaj tiam klakante la \"Forigi\" sagon inter la du "
+"skatoloj."
+
+msgid "Remove all"
+msgstr "Forigu ĉiujn"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klaku por tuj forigi ĉiujn %s elektitajn."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s elektita"
+msgstr[1] "%(sel)s de %(cnt)s elektitaj"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Vi havas neŝirmitajn ŝanĝojn je unuopaj redakteblaj kampoj. Se vi faros "
+"agon, viaj neŝirmitaj ŝanĝoj perdiĝos."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Vi elektas agon, sed vi ne ŝirmis viajn ŝanĝojn al individuaj kampoj ĝis "
+"nun. Bonvolu klaku BONA por ŝirmi. Vi devos ripeton la agon"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Vi elektas agon, kaj vi ne faris ajnajn ŝanĝojn ĉe unuopaj kampoj. Vi "
+"verŝajne serĉas la Iru-butonon prefere ol la Ŝirmu-butono."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Noto: Vi estas %s horo antaŭ la servila horo."
+msgstr[1] "Noto: Vi estas %s horoj antaŭ la servila horo."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Noto: Vi estas %s horo post la servila horo."
+msgstr[1] "Noto: Vi estas %s horoj post la servila horo."
+
+msgid "Now"
+msgstr "Nun"
+
+msgid "Choose a Time"
+msgstr "Elektu horon"
+
+msgid "Choose a time"
+msgstr "Elektu tempon"
+
+msgid "Midnight"
+msgstr "Noktomezo"
+
+msgid "6 a.m."
+msgstr "6 a.t.m."
+
+msgid "Noon"
+msgstr "Tagmezo"
+
+msgid "6 p.m."
+msgstr "6 ptm"
+
+msgid "Cancel"
+msgstr "Malmendu"
+
+msgid "Today"
+msgstr "Hodiaŭ"
+
+msgid "Choose a Date"
+msgstr "Elektu daton"
+
+msgid "Yesterday"
+msgstr "Hieraŭ"
+
+msgid "Tomorrow"
+msgstr "Morgaŭ"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januaro Februaro Marto Aprilo Majo Junio Julio Aŭgusto Septembro Oktobro "
+"Novembro Decembro"
+
+msgid "S M T W T F S"
+msgstr "D L M M Ĵ V S"
+
+msgid "Show"
+msgstr "Montru"
+
+msgid "Hide"
+msgstr "Kaŝu"
diff --git a/tbc/static/admin/locale/es/LC_MESSAGES/django.mo b/tbc/static/admin/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c091f68
--- /dev/null
+++ b/tbc/static/admin/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es/LC_MESSAGES/django.po b/tbc/static/admin/locale/es/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4f34059
--- /dev/null
+++ b/tbc/static/admin/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,700 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# abraham.martin <abraham.martin@gmail.com>, 2014
+# Antoni Aloy <aaloy@apsl.net>, 2011-2014
+# Claude Paroz <claude@2xlibre.net>, 2014
+# Ernesto Avilés Vázquez <whippiii@gmail.com>, 2015
+# franchukelly <inactive+franchukelly@transifex.com>, 2011
+# guillem <serra.guillem@gmail.com>, 2012
+# Igor Támara <igor@tamarapatino.org>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jorge Puente-Sarrín <puentesarrin@gmail.com>, 2014-2015
+# Josue Naaman Nistal Guerra <josuenistal@hotmail.com>, 2014
+# Marc Garcia <garcia.marc@gmail.com>, 2011
+# Pablo, 2015
+# Veronicabh <vero.blazher@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (http://www.transifex.com/django/django/language/"
+"es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "No se puede eliminar %(name)s"
+
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar %(verbose_name_plural)s seleccionado/s"
+
+msgid "Administration"
+msgstr "Administración"
+
+msgid "All"
+msgstr "Todo"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+msgid "This month"
+msgstr "Este mes"
+
+msgid "This year"
+msgstr "Este año"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor introduzca el %(username)s y la clave correctos para una cuenta de "
+"personal. Observe que ambos campos pueden ser sensibles a mayúsculas."
+
+msgid "Action:"
+msgstr "Acción:"
+
+msgid "action time"
+msgstr "hora de la acción"
+
+msgid "user"
+msgstr "usuario"
+
+msgid "content type"
+msgstr "tipo de contenido"
+
+msgid "object id"
+msgstr "id del objeto"
+
+msgid "object repr"
+msgstr "repr del objeto"
+
+msgid "action flag"
+msgstr "marca de acción"
+
+msgid "change message"
+msgstr "mensaje de cambio"
+
+msgid "log entry"
+msgstr "entrada de registro"
+
+msgid "log entries"
+msgstr "entradas de registro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Añadidos \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Cambiados \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Eliminado/a \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto de registro de Log"
+
+msgid "None"
+msgstr "Ninguno"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar "
+"más de una opción."
+
+msgid "Added."
+msgstr "Añadido."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado/a %s."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Añadido/a \"%(object)s\" %(name)s."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificados %(list)s para \"%(object)s\" %(name)s."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Eliminado/a \"%(object)s\" %(name)s."
+
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se añadió con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue añadido satisfactoriamente. Puede añadir otro "
+"%(name)s a continuación."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue cambiado satisfactoriamente. Puede editarlo otra "
+"vez a continuación."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue cambiado satisfactoriamente. Puede añadir otro "
+"%(name)s a continuación."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s\"."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Se deben seleccionar elementos para poder realizar acciones sobre estos. No "
+"se han modificado elementos."
+
+msgid "No action selected."
+msgstr "No se seleccionó ninguna acción."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "No existe ningún objeto %(name)s con la clave primaria %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Añadir %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Error en la base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s fué modificado con éxito."
+msgstr[1] "%(count)s %(name)s fueron modificados con éxito."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionado"
+msgstr[1] "%(total_count)s seleccionados en total"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "seleccionados 0 de %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificaciones: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"La eliminación de %(class_name)s %(instance)s requeriría eliminar los "
+"siguientes objetos relacionados protegidos: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+msgid "Django administration"
+msgstr "Administración de Django"
+
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administración de %(app)s "
+
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+msgid "Home"
+msgstr "Inicio"
+
+msgid "Server error"
+msgstr "Error del servidor"
+
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha habido un error. Ha sido comunicado al administrador del sitio por correo "
+"electrónico y debería solucionarse a la mayor brevedad. Gracias por su "
+"paciencia y comprensión."
+
+msgid "Run the selected action"
+msgstr "Ejecutar la acción seleccionada"
+
+msgid "Go"
+msgstr "Ir"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccionar todos los %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Limpiar selección"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar "
+"el resto de opciones del usuario."
+
+msgid "Enter a username and password."
+msgstr "Introduzca un nombre de usuario y contraseña"
+
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+msgid "Please correct the error below."
+msgstr "Por favor, corrija los siguientes errores."
+
+msgid "Please correct the errors below."
+msgstr "Por favor, corrija los siguientes errores."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Bienvenido/a,"
+
+msgid "View site"
+msgstr "Ver el sitio"
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr "Terminar sesión"
+
+msgid "Add"
+msgstr "Añadir"
+
+msgid "History"
+msgstr "Histórico"
+
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Añadir %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Elimina de la ordenación"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridad de la ordenación: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Activar la ordenación"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para borrar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los "
+"siguientes objetos relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s"
+"\"? Se borrarán los siguientes objetos relacionados:"
+
+msgid "Objects"
+msgstr "Objetos"
+
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+msgid "No, take me back"
+msgstr "No, llévame atrás"
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples objetos."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de "
+"objetos relacionados, pero su cuenta no tiene permisos para borrar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los "
+"siguientes objetos protegidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? "
+"Todos los siguientes objetos y sus elementos relacionados serán borrados:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Agregar %(verbose_name)s adicional."
+
+msgid "Delete?"
+msgstr "¿Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resumen"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos en la aplicación %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+msgid "My Actions"
+msgstr "Mis acciones"
+
+msgid "None available"
+msgstr "Ninguno disponible"
+
+msgid "Unknown content"
+msgstr "Contenido desconocido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Algo va mal con la instalación de la base de datos. Asegúrese de que las "
+"tablas necesarias han sido creadas, y de que la base de datos puede ser "
+"leída por el usuario apropiado."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Se ha autenticado como %(username)s, pero no está autorizado a acceder a "
+"esta página. ¿Desea autenticarse con una cuenta diferente?"
+
+msgid "Forgotten your password or username?"
+msgstr "¿Ha olvidado la contraseña o el nombre de usuario?"
+
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Action"
+msgstr "Acción"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene histórico de cambios. Probablemente no fue añadido "
+"usando este sitio de administración."
+
+msgid "Show all"
+msgstr "Mostrar todo"
+
+msgid "Save"
+msgstr "Grabar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Cambiar %(model)s seleccionado"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Añadir otro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Eliminar %(model)s seleccionada/o"
+
+msgid "Search"
+msgstr "Buscar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web."
+
+msgid "Log in again"
+msgstr "Iniciar sesión de nuevo"
+
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, introduzca su contraseña antigua, por seguridad, y después "
+"introduzca la nueva contraseña dos veces para verificar que la ha escrito "
+"correctamente."
+
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+msgid "Password reset"
+msgstr "Restablecer contraseña"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar "
+"sesión."
+
+msgid "Password reset confirmation"
+msgstr "Confirmación de restablecimiento de contraseña"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor, introduzca su contraseña nueva dos veces para verificar que la ha "
+"escrito correctamente."
+
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"El enlace de restablecimiento de contraseña era inválido, seguramente porque "
+"se haya usado antes. Por favor, solicite un nuevo restablecimiento de "
+"contraseña."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Le hemos enviado por email las instrucciones para restablecer la contraseña, "
+"si es que existe una cuenta con la dirección electrónica que indicó. Debería "
+"recibirlas en breve."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si no recibe un correo, por favor asegúrese de que ha introducido la "
+"dirección de correo con la que se registró y verifique su carpeta de spam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Ha recibido este correo electrónico porque ha solicitado restablecer la "
+"contraseña para su cuenta en %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"¿Ha olvidado su clave? Introduzca su dirección de correo a continuación y le "
+"enviaremos por correo electrónico las instrucciones para establecer una "
+"nueva."
+
+msgid "Email address:"
+msgstr "Correo electrónico:"
+
+msgid "Reset my password"
+msgstr "Restablecer mi contraseña"
+
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Escoja %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Escoja %s a modificar"
+
+msgid "Date:"
+msgstr "Fecha:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Buscar"
+
+msgid "Currently:"
+msgstr "Actualmente:"
+
+msgid "Change:"
+msgstr "Cambiar:"
diff --git a/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..4ad9c68
--- /dev/null
+++ b/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..b7ac1e4
--- /dev/null
+++ b/tbc/static/admin/locale/es/LC_MESSAGES/djangojs.po
@@ -0,0 +1,170 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Antoni Aloy <aaloy@apsl.net>, 2011-2012
+# Ernesto Avilés Vázquez <whippiii@gmail.com>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Josue Naaman Nistal Guerra <josuenistal@hotmail.com>, 2014
+# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2011
+# Veronicabh <vero.blazher@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 15:42+0000\n"
+"Last-Translator: Ernesto Avilés Vázquez <whippiii@gmail.com>\n"
+"Language-Team: Spanish (http://www.transifex.com/django/django/language/"
+"es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en "
+"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre "
+"las dos cajas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Selecciona todos"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Haga clic para seleccionar todos los %s de una vez"
+
+msgid "Choose"
+msgstr "Elegir"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s elegidos"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de los %s elegidos. Puede elmininar algunos "
+"seleccionándolos en la caja inferior y luego haciendo click en la flecha "
+"\"Eliminar\" que hay entre las dos cajas."
+
+msgid "Remove all"
+msgstr "Eliminar todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Haz clic para eliminar todos los %s elegidos"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seleccionado"
+msgstr[1] "%(sel)s de %(cnt)s seleccionados"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una "
+"acción, los cambios no guardados se perderán."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ha seleccionado una acción, pero no ha guardado los cambios en los campos "
+"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la "
+"acción."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ha seleccionado una acción y no hs hecho ningún cambio en campos "
+"individuales. Probablemente esté buscando el botón Ejecutar en lugar del "
+"botón Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor."
+msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor."
+msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor."
+
+msgid "Now"
+msgstr "Ahora"
+
+msgid "Choose a Time"
+msgstr "Elija una hora"
+
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+msgid "Midnight"
+msgstr "Medianoche"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Mediodía"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Choose a Date"
+msgstr "Elija una fecha"
+
+msgid "Yesterday"
+msgstr "Ayer"
+
+msgid "Tomorrow"
+msgstr "Mañana"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Esconder"
diff --git a/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.mo b/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6d8b6d5
--- /dev/null
+++ b/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.po b/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d099ba2
--- /dev/null
+++ b/tbc/static/admin/locale/es_AR/LC_MESSAGES/django.po
@@ -0,0 +1,690 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Leonardo José Guzmán <ljguzman@gmail.com>, 2013
+# Ramiro Morales, 2013-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-30 00:25+0000\n"
+"Last-Translator: Ramiro Morales\n"
+"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/"
+"language/es_AR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_AR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Se eliminaron con éxito %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "No se puede eliminar %(name)s"
+
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar %(verbose_name_plural)s seleccionados/as"
+
+msgid "Administration"
+msgstr "Administración"
+
+msgid "All"
+msgstr "Todos/as"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+msgid "This month"
+msgstr "Este mes"
+
+msgid "This year"
+msgstr "Este año"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor introduza %(username)s y contraseña correctos de una cuenta de "
+"staff. Note que puede que ambos campos sean estrictos en relación a "
+"diferencias entre mayúsculas y minúsculas."
+
+msgid "Action:"
+msgstr "Acción:"
+
+msgid "action time"
+msgstr "hora de la acción"
+
+msgid "user"
+msgstr "usuario"
+
+msgid "content type"
+msgstr "tipo de contenido"
+
+msgid "object id"
+msgstr "id de objeto"
+
+msgid "object repr"
+msgstr "repr de objeto"
+
+msgid "action flag"
+msgstr "marca de acción"
+
+msgid "change message"
+msgstr "mensaje de cambio"
+
+msgid "log entry"
+msgstr "entrada de registro"
+
+msgid "log entries"
+msgstr "entradas de registro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Se agrega \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Se modifica \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Se elimina \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto LogEntry"
+
+msgid "None"
+msgstr "Ninguno"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
+"más de uno."
+
+msgid "Added."
+msgstr "Agregado."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modifica %s."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Se agregó %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Se modificaron %(list)s en %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Se eliminó %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "No ha modificado ningún campo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Se agregó con éxito %(name)s \"%(obj)s\". Puede modificarlo/a abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede agregar otro %(name)s abajo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se agregó con éxito %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Se modificó con éxito %(name)s \"%(obj)s\". Puede modificarlo/a nuevamente "
+"abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Se modificó con éxito %(name)s \"%(obj)s\". Puede agregar otro %(name)s "
+"abajo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito %(name)s \"%(obj)s\"."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Deben existir items seleccionados para poder realizar acciones sobre los "
+"mismos. No se modificó ningún item."
+
+msgid "No action selected."
+msgstr "No se ha seleccionado ninguna acción."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "No existe un objeto %(name)s con una clave primaria %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Error de base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Se ha modificado con éxito %(count)s %(name)s."
+msgstr[1] "Se han modificado con éxito %(count)s %(name)s."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionados/as"
+msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s seleccionados/as"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de modificaciones: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de "
+"los siguientes objetos relacionados protegidos: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Administración de sitio Django"
+
+msgid "Django administration"
+msgstr "Administración de Django"
+
+msgid "Site administration"
+msgstr "Administración de sitio"
+
+msgid "Log in"
+msgstr "Identificarse"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administración de %(app)s"
+
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+msgid "Home"
+msgstr "Inicio"
+
+msgid "Server error"
+msgstr "Error del servidor"
+
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Se ha reportado el mismo a los administradores del "
+"sitio vía email y debería ser solucionado en breve. Le agradecemos por su "
+"paciencia."
+
+msgid "Run the selected action"
+msgstr "Ejecutar la acción seleccionada"
+
+msgid "Go"
+msgstr "Ejecutar"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Haga click aquí para seleccionar los objetos de todas las páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccionar lo(s)/a(s) %(total_count)s %(module_name)s existentes"
+
+msgid "Clear selection"
+msgstr "Borrar selección"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
+"configurar opciones adicionales acerca del usuario."
+
+msgid "Enter a username and password."
+msgstr "Introduzca un nombre de usuario y una contraseña."
+
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+msgid "Please correct the error below."
+msgstr "Por favor, corrija los siguientes errores."
+
+msgid "Please correct the errors below."
+msgstr "Por favor corrija los errores detallados abajo."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Bienvenido/a,"
+
+msgid "View site"
+msgstr "Ver sitio"
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+msgid "Add"
+msgstr "Agregar"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Remove from sorting"
+msgstr "Remover de ordenamiento"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridad de ordenamiento: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "(des)activar ordenamiento"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Eliminar los %(object_name)s '%(escaped_object)s' requeriría eliminar "
+"también los siguientes objetos relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que desea eliminar los %(object_name)s \"%(escaped_object)s"
+"\"? Se eliminarán los siguientes objetos relacionados:"
+
+msgid "Objects"
+msgstr "Objectos"
+
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+msgid "No, take me back"
+msgstr "No, volver"
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples objetos"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Eliminar el/los objetos %(objects_name)s seleccionados provocaría la "
+"eliminación de objetos relacionados a los mismos, pero su cuenta de usuario "
+"no tiene los permisos necesarios para eliminar los siguientes tipos de "
+"objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Eliminar el/los objetos %(objects_name)s seleccionados requeriría eliminar "
+"también los siguientes objetos relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"¿Está seguro de que desea eliminar el/los objetos %(objects_name)s?. Todos "
+"los siguientes objetos e items relacionados a los mismos también serán "
+"eliminados:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Agregar otro/a %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "¿Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resumen"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos en la aplicación %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+msgid "My Actions"
+msgstr "Mis acciones"
+
+msgid "None available"
+msgstr "Ninguna disponible"
+
+msgid "Unknown content"
+msgstr "Contenido desconocido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
+"apropiado tenga permisos de lectura en la base de datos."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Ud. se halla autenticado como %(username)s, pero no está autorizado a "
+"acceder a esta página ¿Desea autenticarse con una cuenta diferente?"
+
+msgid "Forgotten your password or username?"
+msgstr "¿Olvidó su contraseña o nombre de usuario?"
+
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Action"
+msgstr "Acción"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fue "
+"añadido usando este sitio de administración."
+
+msgid "Show all"
+msgstr "Mostrar todos/as"
+
+msgid "Save"
+msgstr "Guardar"
+
+msgid "Popup closing..."
+msgstr "Cerrando ventana emergente..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Modificar %(model)s seleccionados/as"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Agregar otro/a %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Eliminar %(model)s seleccionados/as"
+
+msgid "Search"
+msgstr "Buscar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Guardar como nuevo"
+
+msgid "Save and add another"
+msgstr "Guardar y agregar otro"
+
+msgid "Save and continue editing"
+msgstr "Guardar y continuar editando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, por razones de seguridad, introduzca primero su contraseña "
+"antigua y luego introduzca la nueva contraseña dos veces para verificar que "
+"la ha escrito correctamente."
+
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+msgid "Password reset"
+msgstr "Recuperar contraseña"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Su contraseña ha sido cambiada. Ahora puede continuar e ingresar."
+
+msgid "Password reset confirmation"
+msgstr "Confirmación de reincialización de contraseña"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor introduzca su nueva contraseña dos veces de manera que podamos "
+"verificar que la ha escrito correctamente."
+
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"El enlace de reinicialización de contraseña es inválido, posiblemente debido "
+"a que ya ha sido usado. Por favor solicite una nueva reinicialización de "
+"contraseña."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Se le han enviado instrucciones sobre cómo establecer su contraseña. Si la "
+"dirección de email que proveyó existe, debería recibir las mismas pronto."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si no ha recibido un email, por favor asegúrese de que ha introducido la "
+"dirección de correo con la que se había registrado y verifique su carpeta de "
+"Correo no deseado."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Le enviamos este email porque Ud. ha solicitado que se reestablezca la "
+"contraseña para su cuenta de usuario en %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Por favor visite la página que se muestra a continuación y elija una nueva "
+"contraseña:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"¿Olvidó su contraseña? Introduzca su dirección de email abajo y le "
+"enviaremos instrucciones para establecer una nueva."
+
+msgid "Email address:"
+msgstr "Dirección de email:"
+
+msgid "Reset my password"
+msgstr "Recuperar mi contraseña"
+
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s a modificar"
+
+msgid "Date:"
+msgstr "Fecha:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Buscar"
+
+msgid "Currently:"
+msgstr "Actualmente:"
+
+msgid "Change:"
+msgstr "Cambiar:"
diff --git a/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..cdd2a2f
--- /dev/null
+++ b/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..43daaf0
--- /dev/null
+++ b/tbc/static/admin/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,174 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Ramiro Morales, 2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-30 00:25+0000\n"
+"Last-Translator: Ramiro Morales\n"
+"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/"
+"language/es_AR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_AR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponibles"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de %s disponibles. Puede elegir algunos/as seleccionándolos/"
+"as en el cuadro de abajo y luego haciendo click en la flecha \"Seleccionar\" "
+"ubicada entre las dos listas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriba en esta caja para filtrar la lista de %s disponibles."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Seleccionar todos/as"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Haga click para seleccionar todos/as los/as %s."
+
+msgid "Choose"
+msgstr "Seleccionar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s seleccionados/as"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de %s seleccionados. Puede deseleccionar algunos de ellos "
+"activándolos en la lista de abajo y luego haciendo click en la flecha "
+"\"Eliminar\" ubicada entre las dos listas."
+
+msgid "Remove all"
+msgstr "Eliminar todos/as"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Haga clic para deselecionar todos/as los/as %s."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seleccionado/a"
+msgstr[1] "%(sel)s de %(cnt)s seleccionados/as"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tiene modificaciones sin guardar en campos modificables individuales. Si "
+"ejecuta una acción las mismas se perderán."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ha seleccionado una acción, pero todavía no ha grabado las modificaciones "
+"que ha realizado en campos individuales. Por favor haga click en Aceptar "
+"para grabarlas. Necesitará ejecutar la acción nuevamente."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ha seleccionado una acción pero no ha realizado ninguna modificación en "
+"campos individuales. Es probable que lo que necesite usar en realidad sea el "
+"botón Ejecutar y no el botón Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"Nota: Ud. se encuentra en una zona horaria que está %s hora adelantada "
+"respecto a la del servidor."
+msgstr[1] ""
+"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada "
+"respecto a la del servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Nota: Ud. se encuentra en una zona horaria que está %s hora atrasada "
+"respecto a la del servidor."
+msgstr[1] ""
+"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada "
+"respecto a la del servidor."
+
+msgid "Now"
+msgstr "Ahora"
+
+msgid "Choose a Time"
+msgstr "Seleccione una Hora"
+
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+msgid "Midnight"
+msgstr "Medianoche"
+
+msgid "6 a.m."
+msgstr "6 AM"
+
+msgid "Noon"
+msgstr "Mediodía"
+
+msgid "6 p.m."
+msgstr "6 PM"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Choose a Date"
+msgstr "Seleccione una Fecha"
+
+msgid "Yesterday"
+msgstr "Ayer"
+
+msgid "Tomorrow"
+msgstr "Mañana"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Setiembre Octubre "
+"Noviembre Diciembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Ocultar"
diff --git a/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.mo b/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c07bbfc
--- /dev/null
+++ b/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.po b/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.po
new file mode 100644
index 0000000..36eaa36
--- /dev/null
+++ b/tbc/static/admin/locale/es_CO/LC_MESSAGES/django.po
@@ -0,0 +1,697 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# abraham.martin <abraham.martin@gmail.com>, 2014
+# Axel Díaz <diaz.axelio@gmail.com>, 2015
+# Claude Paroz <claude@2xlibre.net>, 2014
+# Ernesto Avilés Vázquez <whippiii@gmail.com>, 2015
+# franchukelly <inactive+franchukelly@transifex.com>, 2011
+# guillem <serra.guillem@gmail.com>, 2012
+# Igor Támara <igor@tamarapatino.org>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Josue Naaman Nistal Guerra <josuenistal@hotmail.com>, 2014
+# Marc Garcia <garcia.marc@gmail.com>, 2011
+# Pablo, 2015
+# Veronicabh <vero.blazher@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/"
+"language/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "No se puede eliminar %(name)s"
+
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar %(verbose_name_plural)s seleccionado/s"
+
+msgid "Administration"
+msgstr "Administración"
+
+msgid "All"
+msgstr "Todo"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+msgid "This month"
+msgstr "Este mes"
+
+msgid "This year"
+msgstr "Este año"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor ingrese el %(username)s y la clave correctos para obtener cuenta "
+"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas."
+
+msgid "Action:"
+msgstr "Acción:"
+
+msgid "action time"
+msgstr "hora de la acción"
+
+msgid "user"
+msgstr "usuario"
+
+msgid "content type"
+msgstr "tipo de contenido"
+
+msgid "object id"
+msgstr "id del objeto"
+
+msgid "object repr"
+msgstr "repr del objeto"
+
+msgid "action flag"
+msgstr "marca de acción"
+
+msgid "change message"
+msgstr "mensaje de cambio"
+
+msgid "log entry"
+msgstr "entrada de registro"
+
+msgid "log entries"
+msgstr "entradas de registro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Añadidos \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Cambiados \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Eliminado/a \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto de registro de Log"
+
+msgid "None"
+msgstr "Ninguno"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar "
+"más de una opción."
+
+msgid "Added."
+msgstr "Añadido."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado/a %s."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Añadido/a \"%(object)s\" %(name)s."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificados %(list)s para \"%(object)s\" %(name)s."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Eliminado/a \"%(object)s\" %(name)s."
+
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se añadió con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue añadido satisfactoriamente. Puede añadir otro "
+"%(name)s a continuación."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue cambiado satisfactoriamente. Puede editarlo otra "
+"vez a continuación."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"El %(name)s \"%(obj)s\" fue cambiado satisfactoriamente. Puede añadir otro "
+"%(name)s a continuación."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s\"."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Se deben seleccionar elementos para poder realizar acciones sobre estos. No "
+"se han modificado elementos."
+
+msgid "No action selected."
+msgstr "No se seleccionó ninguna acción."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "No existe ningún objeto %(name)s con la clave primaria %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Añadir %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Error en la base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s fué modificado con éxito."
+msgstr[1] "%(count)s %(name)s fueron modificados con éxito."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionado"
+msgstr[1] "%(total_count)s seleccionados en total"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "seleccionados 0 de %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificaciones: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"La eliminación de %(class_name)s %(instance)s requeriría eliminar los "
+"siguientes objetos relacionados protegidos: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+msgid "Django administration"
+msgstr "Administración de Django"
+
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administración de %(app)s "
+
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+msgid "Home"
+msgstr "Inicio"
+
+msgid "Server error"
+msgstr "Error del servidor"
+
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha habido un error. Ha sido comunicado al administrador del sitio por correo "
+"electrónico y debería solucionarse a la mayor brevedad. Gracias por su "
+"paciencia y comprensión."
+
+msgid "Run the selected action"
+msgstr "Ejecutar la acción seleccionada"
+
+msgid "Go"
+msgstr "Ir"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccionar todos los %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Limpiar selección"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar "
+"el resto de opciones del usuario."
+
+msgid "Enter a username and password."
+msgstr "Ingrese un nombre de usuario y contraseña"
+
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+msgid "Please correct the error below."
+msgstr "Por favor, corrija los siguientes errores."
+
+msgid "Please correct the errors below."
+msgstr "Por favor, corrija los siguientes errores."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Ingrese una nueva contraseña para el usuario <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Bienvenido/a,"
+
+msgid "View site"
+msgstr "Ver el sitio"
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr "Terminar sesión"
+
+msgid "Add"
+msgstr "Añadir"
+
+msgid "History"
+msgstr "Histórico"
+
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Añadir %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Elimina de la ordenación"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridad de la ordenación: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Activar la ordenación"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para borrar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los "
+"siguientes objetos relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s"
+"\"? Se borrarán los siguientes objetos relacionados:"
+
+msgid "Objects"
+msgstr "Objetos"
+
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+msgid "No, take me back"
+msgstr "No, llévame atrás"
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples objetos."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de "
+"objetos relacionados, pero su cuenta no tiene permisos para borrar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los "
+"siguientes objetos protegidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? "
+"Todos los siguientes objetos y sus elementos relacionados serán borrados:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Agregar %(verbose_name)s adicional."
+
+msgid "Delete?"
+msgstr "¿Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resumen"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos en la aplicación %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+msgid "My Actions"
+msgstr "Mis acciones"
+
+msgid "None available"
+msgstr "Ninguno disponible"
+
+msgid "Unknown content"
+msgstr "Contenido desconocido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Algo va mal con la instalación de la base de datos. Asegúrese de que las "
+"tablas necesarias han sido creadas, y de que la base de datos puede ser "
+"leída por el usuario apropiado."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Se ha autenticado como %(username)s, pero no está autorizado a acceder a "
+"esta página. ¿Desea autenticarse con una cuenta diferente?"
+
+msgid "Forgotten your password or username?"
+msgstr "¿Ha olvidado la contraseña o el nombre de usuario?"
+
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Action"
+msgstr "Acción"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene histórico de cambios. Probablemente no fue añadido "
+"usando este sitio de administración."
+
+msgid "Show all"
+msgstr "Mostrar todo"
+
+msgid "Save"
+msgstr "Grabar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Cambiar %(model)s seleccionado"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Añadir otro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Eliminar %(model)s seleccionada/o"
+
+msgid "Search"
+msgstr "Buscar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web."
+
+msgid "Log in again"
+msgstr "Iniciar sesión de nuevo"
+
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, ingrese su contraseña antigua, por seguridad, y después "
+"introduzca la nueva contraseña dos veces para verificar que la ha escrito "
+"correctamente."
+
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+msgid "Password reset"
+msgstr "Restablecer contraseña"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar "
+"sesión."
+
+msgid "Password reset confirmation"
+msgstr "Confirmación de restablecimiento de contraseña"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha "
+"escrito correctamente."
+
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"El enlace de restablecimiento de contraseña era inválido, seguramente porque "
+"se haya usado antes. Por favor, solicite un nuevo restablecimiento de "
+"contraseña."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Le hemos enviado por email las instrucciones para restablecer la contraseña, "
+"si es que existe una cuenta con la dirección electrónica que indicó. Debería "
+"recibirlas en breve."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si no recibe un correo, por favor asegúrese de que ha introducido la "
+"dirección de correo con la que se registró y verifique su carpeta de spam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Ha recibido este correo electrónico porque ha solicitado restablecer la "
+"contraseña para su cuenta en %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a "
+"continuación y le enviaremos las instrucciones para establecer una nueva."
+
+msgid "Email address:"
+msgstr "Correo electrónico:"
+
+msgid "Reset my password"
+msgstr "Restablecer mi contraseña"
+
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Escoja %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Escoja %s a modificar"
+
+msgid "Date:"
+msgstr "Fecha:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Buscar"
+
+msgid "Currently:"
+msgstr "Actualmente:"
+
+msgid "Change:"
+msgstr "Cambiar:"
diff --git a/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ca450c4
--- /dev/null
+++ b/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..69cfc72
--- /dev/null
+++ b/tbc/static/admin/locale/es_CO/LC_MESSAGES/djangojs.po
@@ -0,0 +1,169 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ernesto Avilés Vázquez <whippiii@gmail.com>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Josue Naaman Nistal Guerra <josuenistal@hotmail.com>, 2014
+# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2011
+# Veronicabh <vero.blazher@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-11 21:32+0000\n"
+"Last-Translator: Carlos Muñoz <cmuozdiaz@outlook.com>\n"
+"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/"
+"language/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en "
+"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre "
+"las dos cajas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Selecciona todos"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Haga clic para seleccionar todos los %s de una vez"
+
+msgid "Choose"
+msgstr "Elegir"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s elegidos"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de los %s elegidos. Puede eliminar algunos seleccionándolos "
+"en la caja inferior y luego haciendo click en la flecha \"Eliminar\" que hay "
+"entre las dos cajas."
+
+msgid "Remove all"
+msgstr "Eliminar todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Haz clic para eliminar todos los %s elegidos"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seleccionado"
+msgstr[1] "%(sel)s de %(cnt)s seleccionados"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una "
+"acción, los cambios no guardados se perderán."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ha seleccionado una acción, pero no ha guardado los cambios en los campos "
+"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la "
+"acción."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ha seleccionado una acción y no ha hecho ningún cambio en campos "
+"individuales. Probablemente esté buscando el botón Ejecutar en lugar del "
+"botón Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor."
+msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor."
+msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor."
+
+msgid "Now"
+msgstr "Ahora"
+
+msgid "Choose a Time"
+msgstr "Elija una hora"
+
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+msgid "Midnight"
+msgstr "Medianoche"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Mediodía"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Choose a Date"
+msgstr "Elija una fecha"
+
+msgid "Yesterday"
+msgstr "Ayer"
+
+msgid "Tomorrow"
+msgstr "Mañana"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Esconder"
diff --git a/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.mo b/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3ac9a90
--- /dev/null
+++ b/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.po b/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0593abd
--- /dev/null
+++ b/tbc/static/admin/locale/es_MX/LC_MESSAGES/django.po
@@ -0,0 +1,683 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Abraham Estrada <abraham.estrada@gmail.com>, 2011-2013
+# Alex Dzul <alexexc2@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/"
+"language/es_MX/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_MX\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Se eliminaron con éxito %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "No se puede eliminar %(name)s "
+
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar %(verbose_name_plural)s seleccionados/as"
+
+msgid "Administration"
+msgstr "Administración"
+
+msgid "All"
+msgstr "Todos/as"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+msgid "This month"
+msgstr "Este mes"
+
+msgid "This year"
+msgstr "Este año"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor introduza %(username)s y contraseña correctos de una cuenta de "
+"staff. Note que puede que ambos campos sean estrictos en relación a "
+"diferencias entre mayúsculas y minúsculas."
+
+msgid "Action:"
+msgstr "Acción:"
+
+msgid "action time"
+msgstr "hora de la acción"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id de objeto"
+
+msgid "object repr"
+msgstr "repr de objeto"
+
+msgid "action flag"
+msgstr "marca de acción"
+
+msgid "change message"
+msgstr "mensaje de cambio"
+
+msgid "log entry"
+msgstr "entrada de registro"
+
+msgid "log entries"
+msgstr "entradas de registro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Añadidos \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Modificados \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Eliminados \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto de registro de Log"
+
+msgid "None"
+msgstr "Ninguno"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionado \"Control, o \"Command\" en una Mac, para seleccionar "
+"más de uno."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modifica %s."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Se agregó %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Se modificaron %(list)s en %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Se eliminó %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "No ha modificado ningún campo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede modificarlo/a nuevamente "
+"abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede agregar otro %(name)s abajo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se agregó con éxito %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Se modificó con éxito %(name)s \"%(obj)s\". Puede modificarlo/a nuevamente "
+"abajo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Se modificó con éxito %(name)s \"%(obj)s\". Puede agregar otro %(name)s "
+"abajo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito %(name)s \"%(obj)s\"."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Deben existir items seleccionados para poder realizar acciones sobre los "
+"mismos. No se modificó ningún item."
+
+msgid "No action selected."
+msgstr "No se ha seleccionado ninguna acción."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "No existe un objeto %(name)s con una clave primaria %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Error en la base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Se ha modificado con éxito %(count)s %(name)s."
+msgstr[1] "Se han modificado con éxito %(count)s %(name)s."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionados/as"
+msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s seleccionados/as"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de modificaciones: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de "
+"los siguientes objetos relacionados protegidos: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+msgid "Django administration"
+msgstr "Administración de Django"
+
+msgid "Site administration"
+msgstr "Administración del sitio"
+
+msgid "Log in"
+msgstr "Identificarse"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administración de %(app)s "
+
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+msgid "Home"
+msgstr "Inicio"
+
+msgid "Server error"
+msgstr "Error del servidor"
+
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha habido un error. Se ha informado a los administradores del sitio a través "
+"de correo electrónico y debe ser reparado en breve. Gracias por su paciencia."
+
+msgid "Run the selected action"
+msgstr "Ejecutar la acción seleccionada"
+
+msgid "Go"
+msgstr "Ejecutar"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Haga click aquí para seleccionar los objetos de todas las páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccionar lo(s)/a(s) %(total_count)s de %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Borrar selección"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
+"configurar opciones adicionales acerca del usuario."
+
+msgid "Enter a username and password."
+msgstr "Introduzca un nombre de usuario y una contraseña."
+
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+msgid "Please correct the error below."
+msgstr "Por favor, corrija los siguientes errores."
+
+msgid "Please correct the errors below."
+msgstr "Por favor, corrija los siguientes errores."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Bienvenido,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+msgid "Add"
+msgstr "Agregar"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Remove from sorting"
+msgstr "Elimina de la clasificación"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridad de la clasificación: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Activar la clasificación"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
+"siguientes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Para eliminar %(object_name)s '%(escaped_object)s' requiere eliminar los "
+"siguientes objetos relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s"
+"\"? Se eliminarán los siguientes objetos relacionados:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples objetos"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Para eliminar %(objects_name)s requiere eliminar los objetos relacionado, "
+"pero tu cuenta no tiene permisos para eliminar los siguientes tipos de "
+"objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Eliminar el seleccionado %(objects_name)s requiere eliminar los siguientes "
+"objetos relacionados protegidas:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"¿Está seguro que desea eliminar el seleccionado %(objects_name)s ? Todos los "
+"objetos siguientes y sus elementos asociados serán eliminados:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Agregar otro/a %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Por %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos en la aplicación %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada"
+
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+msgid "My Actions"
+msgstr "Mis acciones"
+
+msgid "None available"
+msgstr "Ninguna disponible"
+
+msgid "Unknown content"
+msgstr "Contenido desconocido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
+"apropiado tenga permisos de lectura en la base de datos."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "¿Ha olvidado su contraseña o nombre de usuario?"
+
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Action"
+msgstr "Acción"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fue "
+"añadido usando este sitio de administración."
+
+msgid "Show all"
+msgstr "Mostrar todos/as"
+
+msgid "Save"
+msgstr "Guardar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Buscar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s results"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Guardar como nuevo"
+
+msgid "Save and add another"
+msgstr "Guardar y agregar otro"
+
+msgid "Save and continue editing"
+msgstr "Guardar y continuar editando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, por razones de seguridad, introduzca primero su contraseña "
+"antigua y luego introduzca la nueva contraseña dos veces para verificar que "
+"la ha escrito correctamente."
+
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+msgid "Password reset"
+msgstr "Recuperar contraseña"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Se le ha enviado su contraseña. Ahora puede continuar e ingresar."
+
+msgid "Password reset confirmation"
+msgstr "Confirmación de reincialización de contraseña"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor introduzca su nueva contraseña dos veces de manera que podamos "
+"verificar que la ha escrito correctamente."
+
+msgid "New password:"
+msgstr "Nueva contraseña:"
+
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"El enlace de reinicialización de contraseña es inválido, posiblemente debido "
+"a que ya ha sido usado. Por favor solicite una nueva reinicialización de "
+"contraseña."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si usted no recibe un correo electrónico, por favor, asegúrese de que ha "
+"introducido la dirección con la que se registró, y revise su carpeta de spam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Usted está recibiendo este correo electrónico porque ha solicitado un "
+"restablecimiento de contraseña para la cuenta de usuario en %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Por favor visite la página que se muestra a continuación y elija una nueva "
+"contraseña:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"¿Olvidó su contraseña? Ingrese su dirección de correo electrónico, y le "
+"enviaremos las instrucciones para establecer una nueva."
+
+msgid "Email address:"
+msgstr "Correo electrónico:"
+
+msgid "Reset my password"
+msgstr "Recuperar mi contraseña"
+
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s a modificar"
+
+msgid "Date:"
+msgstr "Fecha:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Buscar"
+
+msgid "Currently:"
+msgstr "Actualmente:"
+
+msgid "Change:"
+msgstr "Modificar:"
diff --git a/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..c480486
--- /dev/null
+++ b/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..24e38b1
--- /dev/null
+++ b/tbc/static/admin/locale/es_MX/LC_MESSAGES/djangojs.po
@@ -0,0 +1,165 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Abraham Estrada <abraham.estrada@gmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/"
+"language/es_MX/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_MX\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Disponible %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de los %s disponibles. Usted puede elegir algunos "
+"seleccionándolos en el cuadro de abajo y haciendo click en la flecha "
+"\"Seleccionar\" entre las dos cajas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriba en esta casilla para filtrar la lista de %s disponibles."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Seleccionar todos"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Da click para seleccionar todos los %s de una vez."
+
+msgid "Choose"
+msgstr "Seleccionar"
+
+msgid "Remove"
+msgstr "Quitar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s seleccionados"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta es la lista de los %s elegidos. Usted puede eliminar algunos "
+"seleccionándolos en el cuadro de abajo y haciendo click en la flecha "
+"\"Eliminar\" entre las dos cajas."
+
+msgid "Remove all"
+msgstr "Eliminar todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Da click para eliminar todos los %s seleccionados de una vez."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seleccionado/a"
+msgstr[1] "%(sel)s de %(cnt)s seleccionados/as"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tiene modificaciones sin guardar en campos modificables individuales. Si "
+"ejecuta una acción las mismas se perderán."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ha seleccionado una acción, pero todavía no ha grabado las modificaciones "
+"que ha realizado en campos individuales. Por favor haga click en Aceptar "
+"para grabarlas. Necesitará ejecutar la acción nuevamente."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ha seleccionado una acción pero no ha realizado ninguna modificación en "
+"campos individuales. Es probable que lo que necesite usar en realidad sea el "
+"botón Ejecutar y no el botón Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Ahora"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+msgid "Midnight"
+msgstr "Medianoche"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Mediodía"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoy"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Ayer"
+
+msgid "Tomorrow"
+msgstr "Mañana"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Setiembre Octubre "
+"Noviembre Diciembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Ocultar"
diff --git a/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.mo b/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c50b3b2
--- /dev/null
+++ b/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.po b/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fad221d
--- /dev/null
+++ b/tbc/static/admin/locale/es_VE/LC_MESSAGES/django.po
@@ -0,0 +1,609 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-18 08:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/"
+"django/language/es_VE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_VE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Any date"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr ""
+
+msgid "This year"
+msgstr ""
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+msgid "(None)"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..32f6e8f
--- /dev/null
+++ b/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..61f231f
--- /dev/null
+++ b/tbc/static/admin/locale/es_VE/LC_MESSAGES/djangojs.po
@@ -0,0 +1,145 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:12+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/"
+"django/language/es_VE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_VE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/et/LC_MESSAGES/django.mo b/tbc/static/admin/locale/et/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..fca53fc
--- /dev/null
+++ b/tbc/static/admin/locale/et/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/et/LC_MESSAGES/django.po b/tbc/static/admin/locale/et/LC_MESSAGES/django.po
new file mode 100644
index 0000000..219a884
--- /dev/null
+++ b/tbc/static/admin/locale/et/LC_MESSAGES/django.po
@@ -0,0 +1,677 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# eallik <eallik@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janno Liivak <jannolii@gmail.com>, 2013-2015
+# Martin <martinpajuste@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 09:05+0000\n"
+"Last-Translator: Martin <martinpajuste@gmail.com>\n"
+"Language-Team: Estonian (http://www.transifex.com/django/django/language/"
+"et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s kustutamine õnnestus."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ei saa kustutada %(name)s"
+
+msgid "Are you sure?"
+msgstr "Kas olete kindel?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Kustuta valitud %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administreerimine"
+
+msgid "All"
+msgstr "Kõik"
+
+msgid "Yes"
+msgstr "Jah"
+
+msgid "No"
+msgstr "Ei"
+
+msgid "Unknown"
+msgstr "Tundmatu"
+
+msgid "Any date"
+msgstr "Suvaline kuupäev"
+
+msgid "Today"
+msgstr "Täna"
+
+msgid "Past 7 days"
+msgstr "Viimased 7 päeva"
+
+msgid "This month"
+msgstr "Käesolev kuu"
+
+msgid "This year"
+msgstr "Käesolev aasta"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Palun sisestage personali kontole õige %(username)s ja parool. Teadke, et "
+"mõlemad väljad võivad olla tõstutundlikud."
+
+msgid "Action:"
+msgstr "Toiming:"
+
+msgid "action time"
+msgstr "toimingu aeg"
+
+msgid "user"
+msgstr "kasutaja"
+
+msgid "content type"
+msgstr "sisutüüp"
+
+msgid "object id"
+msgstr "objekti id"
+
+msgid "object repr"
+msgstr "objekti esitus"
+
+msgid "action flag"
+msgstr "toimingu lipp"
+
+msgid "change message"
+msgstr "muudatuse tekst"
+
+msgid "log entry"
+msgstr "logisissekanne"
+
+msgid "log entries"
+msgstr "logisissekanded"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Lisatud \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Muudetud \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Kustutatud \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objekt LogEntry"
+
+msgid "None"
+msgstr "Puudub"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Et valida mitu, hoidke all \"Control\"-nuppu (Maci puhul \"Command\")."
+
+msgid "Added."
+msgstr "Lisatud."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Muutsin %s."
+
+msgid "and"
+msgstr "ja"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lisatud %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Muudetud %(list)s objektil %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Kustutatud %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ühtegi välja ei muudetud."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" lisamine õnnestus. Te võite seda muuta."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" lisamine õnnestus. Allpool saate lisada uue %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" lisamine õnnestus."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" muutmine õnnestus. Allpool saate seda uuesti muuta."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" muutmine õnnestus. Allpool saate lisada uue %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" muutmine õnnestus."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Palun märgistage elemendid, millega soovite toiminguid sooritada. Ühtegi "
+"elementi ei muudetud."
+
+msgid "No action selected."
+msgstr "Toiming valimata."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" kustutati."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s objekt primaarvõtmega %(key)r ei eksisteeri."
+
+#, python-format
+msgid "Add %s"
+msgstr "Lisa %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Muuda %s"
+
+msgid "Database error"
+msgstr "Andmebaasi viga"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s muutmine õnnestus."
+msgstr[1] "%(count)s %(name)s muutmine õnnestus."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s valitud"
+msgstr[1] "Kõik %(total_count)s valitud"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "valitud 0/%(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Muudatuste ajalugu: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Et kustutada %(class_name)s %(instance)s, on vaja kustutada järgmised "
+"kaitstud seotud objektid: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django administreerimisliides"
+
+msgid "Django administration"
+msgstr "Django administreerimisliides"
+
+msgid "Site administration"
+msgstr "Saidi administreerimine"
+
+msgid "Log in"
+msgstr "Sisene"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administreerimine"
+
+msgid "Page not found"
+msgstr "Lehte ei leitud"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vabandame, kuid soovitud lehte ei leitud."
+
+msgid "Home"
+msgstr "Kodu"
+
+msgid "Server error"
+msgstr "Serveri viga"
+
+msgid "Server error (500)"
+msgstr "Serveri viga (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serveri Viga <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ilmnes viga. Sellest on e-posti teel teavitatud lehe administraatorit ja "
+"viga parandatakse esimesel võimalusel. Täname kannatlikkuse eest."
+
+msgid "Run the selected action"
+msgstr "Käivita valitud toiming"
+
+msgid "Go"
+msgstr "Mine"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliki siin, et märgistada objektid üle kõigi lehekülgede"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Märgista kõik %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Tühjenda valik"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Kõige pealt sisestage kasutajatunnus ja salasõna, seejärel on võimalik muuta "
+"täiendavaid kasutajaandmeid."
+
+msgid "Enter a username and password."
+msgstr "Sisestage kasutajanimi ja salasõna."
+
+msgid "Change password"
+msgstr "Muuda salasõna"
+
+msgid "Please correct the error below."
+msgstr "Palun parandage allolevad vead"
+
+msgid "Please correct the errors below."
+msgstr "Palun parandage allolevad vead."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Sisestage uus salasõna kasutajale <strong>%(username)s</strong>"
+
+msgid "Welcome,"
+msgstr "Tere tulemast,"
+
+msgid "View site"
+msgstr "Vaata saiti"
+
+msgid "Documentation"
+msgstr "Dokumentatsioon"
+
+msgid "Log out"
+msgstr "Logi välja"
+
+msgid "Add"
+msgstr "Lisa"
+
+msgid "History"
+msgstr "Ajalugu"
+
+msgid "View on site"
+msgstr "Näita lehel"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lisa %(name)s"
+
+msgid "Filter"
+msgstr "Filtreeri"
+
+msgid "Remove from sorting"
+msgstr "Eemalda sorteerimisest"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteerimisjärk: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Sorteerimine"
+
+msgid "Delete"
+msgstr "Kustuta"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Selleks, et kustutada %(object_name)s '%(escaped_object)s', on vaja "
+"kustutada lisaks ka kõik seotud objecktid, aga teil puudub õigus järgnevat "
+"tüüpi objektide kustutamiseks:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Et kustutada %(object_name)s '%(escaped_object)s', on vaja kustutada "
+"järgmised kaitstud seotud objektid:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Kas olete kindel, et soovite kustutada objekti %(object_name)s "
+"\"%(escaped_object)s\"? Kõik järgnevad seotud objektid kustutatakse koos "
+"sellega:"
+
+msgid "Objects"
+msgstr "Objektid"
+
+msgid "Yes, I'm sure"
+msgstr "Jah, olen kindel"
+
+msgid "No, take me back"
+msgstr "Ei, mine tagasi"
+
+msgid "Delete multiple objects"
+msgstr "Kustuta mitu objekti"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Kui kustutada valitud %(objects_name)s, peaks kustutama ka seotud objektid, "
+"aga sinu kasutajakontol pole õigusi järgmiste objektitüüpide kustutamiseks:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Et kustutada valitud %(objects_name)s, on vaja kustutada ka järgmised "
+"kaitstud seotud objektid:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Kas oled kindel, et soovid kustutada valitud %(objects_name)s? Kõik "
+"järgnevad objektid ja seotud objektid kustutatakse:"
+
+msgid "Change"
+msgstr "Muuda"
+
+msgid "Remove"
+msgstr "Eemalda"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Lisa veel üks %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Kustutan?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr "Kokkuvõte"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Rakenduse %(name)s moodulid"
+
+msgid "You don't have permission to edit anything."
+msgstr "Teil ei ole õigust midagi muuta."
+
+msgid "Recent Actions"
+msgstr "Hiljutised Toimingud"
+
+msgid "My Actions"
+msgstr "Minu Toimingud"
+
+msgid "None available"
+msgstr "Ei leitud ühtegi"
+
+msgid "Unknown content"
+msgstr "Tundmatu sisu"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"On tekkinud viga seoses andmebaasiga. Veenduge, et kõik vajalikud "
+"andmebaasitabelid on loodud ning et andmebaas on vastava kasutaja poolt "
+"loetav."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Olete sisse logitud kasutajana %(username)s, kuid teil puudub ligipääs "
+"lehele. Kas te soovite teise kontoga sisse logida?"
+
+msgid "Forgotten your password or username?"
+msgstr "Unustasite oma parooli või kasutajanime?"
+
+msgid "Date/time"
+msgstr "Kuupäev/kellaaeg"
+
+msgid "User"
+msgstr "Kasutaja"
+
+msgid "Action"
+msgstr "Toiming"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Sellel objektil puudub muudatuste ajalugu. Tõenäoliselt ei kasutatud selle "
+"objekti lisamisel käesolevat administreerimislidest."
+
+msgid "Show all"
+msgstr "Näita kõiki"
+
+msgid "Save"
+msgstr "Salvesta"
+
+msgid "Popup closing..."
+msgstr "Hüpikaken sulgub..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Muuda valitud %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Lisa veel üks %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Kustuta valitud %(model)s"
+
+msgid "Search"
+msgstr "Otsing"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s tulemus"
+msgstr[1] "%(counter)s tulemust"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Kokku %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Salvesta uuena"
+
+msgid "Save and add another"
+msgstr "Salvesta ja lisa uus"
+
+msgid "Save and continue editing"
+msgstr "Salvesta ja jätka muutmist"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tänan, et veetsite aega meie lehel."
+
+msgid "Log in again"
+msgstr "Logi uuesti sisse"
+
+msgid "Password change"
+msgstr "Salasõna muutmine"
+
+msgid "Your password was changed."
+msgstr "Teie salasõna on vahetatud."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Turvalisuse tagamiseks palun sisestage oma praegune salasõna ning seejärel "
+"uus salasõna.Veendumaks, et uue salasõna sisestamisel ei tekkinud vigu, "
+"palun sisestage see kaks korda."
+
+msgid "Change my password"
+msgstr "Muuda salasõna"
+
+msgid "Password reset"
+msgstr "Uue parooli loomine"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Teie salasõna on määratud. Võite nüüd sisse logida."
+
+msgid "Password reset confirmation"
+msgstr "Uue salasõna loomise kinnitamine"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Palun sisestage uus salasõna kaks korda, et saaksime veenduda, et "
+"sisestamisel ei tekkinud vigu."
+
+msgid "New password:"
+msgstr "Uus salasõna:"
+
+msgid "Confirm password:"
+msgstr "Kinnita salasõna:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Uue salasõna loomise link ei olnud korrektne. Võimalik, et seda on varem "
+"kasutatud. Esitage uue salasõna taotlus uuesti."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Saatsime teile parooli muutmise juhendi, kui teie poolt sisestatud e-posti "
+"aadressiga konto on olemas. Peaksite selle lähiajal kätte saama."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Kui te ei saa kirja siis kontrollige, et sisestasite e-posti aadressi "
+"millega registreerisite ning kontrollige oma rämpsposti kausta."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Saite käesoleva kirja kuna soovisite muuta lehel %(site_name)s oma "
+"kasutajakontoga seotud parooli."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Palun minge järmisele lehele ning sisestage uus salasõna"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Teie kasutajatunnus juhul, kui olete unustanud:"
+
+msgid "Thanks for using our site!"
+msgstr "Täname meie lehte külastamast!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s meeskond"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Unustasite oma parooli? Sisestage allpool oma e-posti aadress ja me saadame "
+"teile juhendi, kuidas parooli muuta."
+
+msgid "Email address:"
+msgstr "E-posti aadress:"
+
+msgid "Reset my password"
+msgstr "Reseti parool"
+
+msgid "All dates"
+msgstr "Kõik kuupäevad"
+
+#, python-format
+msgid "Select %s"
+msgstr "Vali %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Vali %s mida muuta"
+
+msgid "Date:"
+msgstr "Kuupäev:"
+
+msgid "Time:"
+msgstr "Aeg:"
+
+msgid "Lookup"
+msgstr "Otsi"
+
+msgid "Currently:"
+msgstr "Hetkel:"
+
+msgid "Change:"
+msgstr "Muuda:"
diff --git a/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..438a5ba
--- /dev/null
+++ b/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c1daee4
--- /dev/null
+++ b/tbc/static/admin/locale/et/LC_MESSAGES/djangojs.po
@@ -0,0 +1,165 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# eallik <eallik@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janno Liivak <jannolii@gmail.com>, 2013-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-11 20:52+0000\n"
+"Last-Translator: Janno Liivak <jannolii@gmail.com>\n"
+"Language-Team: Estonian (http://www.transifex.com/django/django/language/"
+"et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Saadaval %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Nimekiri välja \"%s\" võimalikest väärtustest. Saad valida ühe või mitu "
+"kirjet allolevast kastist ning vajutades noolt \"Vali\" liigutada neid ühest "
+"kastist teise."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Filtreeri selle kasti abil välja \"%s\" nimekirja."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Vali kõik"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kliki, et valida kõik %s korraga."
+
+msgid "Choose"
+msgstr "Vali"
+
+msgid "Remove"
+msgstr "Eemalda"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valitud %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Nimekiri välja \"%s\" valitud väärtustest. Saad valida ühe või mitu kirjet "
+"allolevast kastist ning vajutades noolt \"Eemalda\" liigutada neid ühest "
+"kastist teise."
+
+msgid "Remove all"
+msgstr "Eemalda kõik"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kliki, et eemaldada kõik valitud %s korraga."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s %(cnt)sst valitud"
+msgstr[1] "%(sel)s %(cnt)sst valitud"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Muudetavates lahtrites on salvestamata muudatusi. Kui sooritate mõne "
+"toimingu, lähevad salvestamata muudatused kaotsi."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Valisid toimingu, kuid pole salvestanud muudatusi lahtrites. Salvestamiseks "
+"palun vajuta OK. Pead toimingu uuesti käivitama."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Valisid toimingu, kuid sa pole ühtegi lahtrit muutnud. Tõenäoliselt peaksid "
+"vajutama 'Mine' mitte 'Salvesta' nuppu."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Märkus: Olete %s tund serveri ajast ees."
+msgstr[1] "Märkus: Olete %s tundi serveri ajast ees."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Märkus: Olete %s tund serveri ajast maas."
+msgstr[1] "Märkus: Olete %s tundi serveri ajast maas."
+
+msgid "Now"
+msgstr "Praegu"
+
+msgid "Choose a Time"
+msgstr "Vali aeg"
+
+msgid "Choose a time"
+msgstr "Vali aeg"
+
+msgid "Midnight"
+msgstr "Kesköö"
+
+msgid "6 a.m."
+msgstr "6 hommikul"
+
+msgid "Noon"
+msgstr "Keskpäev"
+
+msgid "6 p.m."
+msgstr "6 õhtul"
+
+msgid "Cancel"
+msgstr "Tühista"
+
+msgid "Today"
+msgstr "Täna"
+
+msgid "Choose a Date"
+msgstr "Vali kuupäev"
+
+msgid "Yesterday"
+msgstr "Eile"
+
+msgid "Tomorrow"
+msgstr "Homme"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Jaanuar Veebruar Märts Aprill Mai Juuni Juuli August September Oktoober "
+"November Detsember"
+
+msgid "S M T W T F S"
+msgstr "P E T K N R L"
+
+msgid "Show"
+msgstr "Näita"
+
+msgid "Hide"
+msgstr "Varja"
diff --git a/tbc/static/admin/locale/eu/LC_MESSAGES/django.mo b/tbc/static/admin/locale/eu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3aad6be
--- /dev/null
+++ b/tbc/static/admin/locale/eu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/eu/LC_MESSAGES/django.po b/tbc/static/admin/locale/eu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..685a45d
--- /dev/null
+++ b/tbc/static/admin/locale/eu/LC_MESSAGES/django.po
@@ -0,0 +1,672 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aitzol Naberan <anaberan@codesyntax.com>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# julen <julenx@gmail.com>, 2012-2013
+# julen <julenx@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s elementu ezabatu dira."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ezin da %(name)s ezabatu"
+
+msgid "Are you sure?"
+msgstr "Ziur zaude?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Ezabatu aukeratutako %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Dena"
+
+msgid "Yes"
+msgstr "Bai"
+
+msgid "No"
+msgstr "Ez"
+
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+msgid "Any date"
+msgstr "Edozein data"
+
+msgid "Today"
+msgstr "Gaur"
+
+msgid "Past 7 days"
+msgstr "Aurreko 7 egunak"
+
+msgid "This month"
+msgstr "Hilabete hau"
+
+msgid "This year"
+msgstr "Urte hau"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Idatzi kudeaketa gunerako %(username)s eta pasahitz zuzena. Kontuan izan "
+"biek maiuskula/minuskulak desberdintzen dituztela."
+
+msgid "Action:"
+msgstr "Ekintza:"
+
+msgid "action time"
+msgstr "Ekintza hordua"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "Objetuaren id-a"
+
+msgid "object repr"
+msgstr "Objeturaren aurkezpena"
+
+msgid "action flag"
+msgstr "Ekintza botoia"
+
+msgid "change message"
+msgstr "Mezua aldatu"
+
+msgid "log entry"
+msgstr "Log sarrera"
+
+msgid "log entries"
+msgstr "log sarrerak"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" gehituta."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" aldatuta - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" ezabatuta."
+
+msgid "LogEntry Object"
+msgstr "LogEntry objektua"
+
+msgid "None"
+msgstr "Bat ere ez"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s aldatuta."
+
+msgid "and"
+msgstr "eta"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" gehituta."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Changed %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ezabatuta."
+
+msgid "No fields changed."
+msgstr "Ez da eremurik aldatu."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" ondo gehitu da. Jarraian aldatu dezakezu berriro."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ondo gehitu da. Beste %(name)s bat gehitu dezakezu "
+"jarraian."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" ondo gehitu da."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" ondo aldatu da. Aldaketa gehiago egin ditzazkezu "
+"jarraian."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ondo aldatu da. Beste %(name)s bat gehitu dezakezu "
+"jarraian."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ondo aldatu da."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Elementuak aukeratu behar dira beraien gain ekintzak burutzeko. Ez da "
+"elementurik aldatu."
+
+msgid "No action selected."
+msgstr "Ez dago ekintzarik aukeratuta."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" ondo ezabatu da."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Ez dago %(key)r gakodun %(name)s objekturik."
+
+#, python-format
+msgid "Add %s"
+msgstr "Gehitu %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Aldatu %s"
+
+msgid "Database error"
+msgstr "Datu-basearen errorea"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(name)s %(count)s ondo aldatu da."
+msgstr[1] "%(count)s %(name)s ondo aldatu dira."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Guztira %(total_count)s aukeratuta"
+msgstr[1] "Guztira %(total_count)s aukeratuta"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Guztira %(cnt)s, 0 aukeratuta"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Aldaketen historia: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s klaseko %(instance)s instantziak ezabatzeak erlazionatutako "
+"objektu hauek ezabatzea eragingo du:\n"
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django kudeaketa gunea"
+
+msgid "Django administration"
+msgstr "Django kudeaketa"
+
+msgid "Site administration"
+msgstr "Webgunearen kudeaketa"
+
+msgid "Log in"
+msgstr "Sartu"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Ez da orririk aurkitu"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Barkatu, eskatutako orria ezin daiteke aurkitu"
+
+msgid "Home"
+msgstr "Hasiera"
+
+msgid "Server error"
+msgstr "Zerbitzariaren errorea"
+
+msgid "Server error (500)"
+msgstr "Zerbitzariaren errorea (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Zerbitzariaren errorea <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Errore bat gertatu da. Errorea guneko kudeatzaileari jakinarazi zaio email "
+"bidez eta laister egon beharko luke konponduta. Barkatu eragozpenak."
+
+msgid "Run the selected action"
+msgstr "Burutu hautatutako ekintza"
+
+msgid "Go"
+msgstr "Joan"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Egin klik hemen orri guztietako objektuak aukeratzeko"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Hautatu %(total_count)s %(module_name)s guztiak"
+
+msgid "Clear selection"
+msgstr "Garbitu hautapena"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Lehenik idatzi erabiltzaile-izena eta pasahitza. Gero erabiltzaile-aukera "
+"gehiago aldatu ahal izango dituzu."
+
+msgid "Enter a username and password."
+msgstr "Idatzi erabiltzaile-izen eta pasahitza."
+
+msgid "Change password"
+msgstr "Aldatu pasahitza"
+
+msgid "Please correct the error below."
+msgstr "Zuzendu azpiko erroreak."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Idatzi pasahitz berria <strong>%(username)s</strong> erabiltzailearentzat."
+
+msgid "Welcome,"
+msgstr "Ongi etorri,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentazioa"
+
+msgid "Log out"
+msgstr "Irten"
+
+msgid "Add"
+msgstr "Gehitu"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Ikusi gunean"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Gehitu %(name)s"
+
+msgid "Filter"
+msgstr "Iragazkia"
+
+msgid "Remove from sorting"
+msgstr "Kendu ordenaziotik"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Ordenatzeko lehentasuna: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Txandakatu ordenazioa"
+
+msgid "Delete"
+msgstr "Ezabatu"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s ezabatzean bere '%(escaped_object)s' ere ezabatzen dira, "
+"baina zure kontuak ez dauka baimenik objetu mota hauek ezabatzeko:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' ezabatzeak erlazionatutako objektu "
+"babestu hauek ezabatzea eskatzen du:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ziur zaude %(object_name)s \"%(escaped_object)s\" ezabatu nahi dituzula? "
+"Erlazionaturik dauden hurrengo elementuak ere ezabatuko dira:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Bai, ziur nago"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Ezabatu hainbat objektu"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Hautatutako %(objects_name)s ezabatzeak erlazionatutako objektuak ezabatzea "
+"eskatzen du baina zure kontuak ez dauka baimen nahikorik objektu mota hauek "
+"ezabatzeko: "
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Hautatutako %(objects_name)s ezabatzeak erlazionatutako objektu babestu "
+"hauek ezabatzea eskatzen du:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ziur zaude hautatutako %(objects_name)s ezabatu nahi duzula? Objektu guzti "
+"hauek eta erlazionatutako elementu guztiak ezabatuko dira:"
+
+msgid "Change"
+msgstr "Aldatu"
+
+msgid "Remove"
+msgstr "Kendu"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Gehitu beste %(verbose_name)s bat"
+
+msgid "Delete?"
+msgstr "Ezabatu?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Irizpidea: %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s aplikazioaren modeloak"
+
+msgid "You don't have permission to edit anything."
+msgstr "Ez daukazu ezer aldatzeko baimenik."
+
+msgid "Recent Actions"
+msgstr "Azken ekintzak"
+
+msgid "My Actions"
+msgstr "Nire ekintzak"
+
+msgid "None available"
+msgstr "Ez dago ezer"
+
+msgid "Unknown content"
+msgstr "Eduki ezezaguna"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Zerbait gaizki dago zure datu-basearekin. Ziurtatu datu-baseko taulak sortu "
+"direla eta erabiltzaile egokiak irakurtzeko baimena duela."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Pasahitza edo erabiltzaile-izena ahaztu duzu?"
+
+msgid "Date/time"
+msgstr "Data/ordua"
+
+msgid "User"
+msgstr "Erabiltzailea"
+
+msgid "Action"
+msgstr "Ekintza"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Objektu honek ez dauka aldaketen historiarik. Ziurrenik kudeaketa gunetik "
+"kanpo gehituko zen."
+
+msgid "Show all"
+msgstr "Erakutsi dena"
+
+msgid "Save"
+msgstr "Gorde"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Bilatu"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "Emaitza %(counter)s "
+msgstr[1] "%(counter)s emaitza"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s guztira"
+
+msgid "Save as new"
+msgstr "Gorde berri gisa"
+
+msgid "Save and add another"
+msgstr "Gorde eta gehitu beste bat"
+
+msgid "Save and continue editing"
+msgstr "Gorde eta jarraitu editatzen"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Eskerrik asko webguneari zure probetxuzko denbora eskaintzeagatik."
+
+msgid "Log in again"
+msgstr "Hasi saioa berriro"
+
+msgid "Password change"
+msgstr "Aldatu pasahitza"
+
+msgid "Your password was changed."
+msgstr "Zure pasahitza aldatu egin da."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Idatzi pasahitz zaharra segurtasun arrazoiengatik eta gero pasahitz berria "
+"bi aldiz, akatsik egiten ez duzula ziurta dezagun."
+
+msgid "Change my password"
+msgstr "Aldatu nire pasahitza"
+
+msgid "Password reset"
+msgstr "Berrezarri pasahitza"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Zure pasahitza ezarri da. Orain aurrera egin eta sartu zaitezke."
+
+msgid "Password reset confirmation"
+msgstr "Pasahitza berrezartzeko berrespena"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Idatzi pasahitz berria birritan ondo idatzita dagoela ziurta dezagun."
+
+msgid "New password:"
+msgstr "Pasahitz berria:"
+
+msgid "Confirm password:"
+msgstr "Berretsi pasahitza:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Pasahitza berrezartzeko loturak baliogabea dirudi. Baliteke lotura aurretik "
+"erabilita egotea. Eskatu berriro pasahitza berrezartzea."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ez baduzu mezurik jasotzen, ziurtatu izena ematean erabilitako helbide "
+"berdina idatzi duzula eta egiaztatu spam karpeta."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Mezu hau %(site_name)s webgunean pasahitza berrezartzea eskatu duzulako jaso "
+"duzu"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Zoaz hurrengo orrira eta aukeratu pasahitz berria:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Zure erabiltzaile-izena (ahaztu baduzu):"
+
+msgid "Thanks for using our site!"
+msgstr "Mila esker gure webgunea erabiltzeagatik!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s webguneko taldea"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Pasahitza ahaztu duzu? Idatzi zure helbide elektronikoa eta berri bat "
+"ezartzeko jarraibideak bidaliko dizkizugu."
+
+msgid "Email address:"
+msgstr "Helbide elektronikoa:"
+
+msgid "Reset my password"
+msgstr "Berrezarri pasahitza"
+
+msgid "All dates"
+msgstr "Data guztiak"
+
+#, python-format
+msgid "Select %s"
+msgstr "Hautatu %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Hautatu %s aldatzeko"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Ordua:"
+
+msgid "Lookup"
+msgstr "Lookup"
+
+msgid "Currently:"
+msgstr "Oraingoa:"
+
+msgid "Change:"
+msgstr "Aldatu:"
diff --git a/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..4429b9d
--- /dev/null
+++ b/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..4b437e5
--- /dev/null
+++ b/tbc/static/admin/locale/eu/LC_MESSAGES/djangojs.po
@@ -0,0 +1,163 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aitzol Naberan <anaberan@codesyntax.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# julen <julenx@gmail.com>, 2012-2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s Erabilgarri"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Hau da aukeran dauden %s zerrenda. Hauetako zenbait aukera ditzakezu "
+"azpiko \n"
+"kaxan hautatu eta kutxen artean dagoen \"Aukeratu\" gezian klik eginez."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Idatzi kutxa honetan erabilgarri dauden %s objektuak iragazteko."
+
+msgid "Filter"
+msgstr "Filtroa"
+
+msgid "Choose all"
+msgstr "Denak aukeratu"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Egin klik %s guztiak batera aukeratzeko."
+
+msgid "Choose"
+msgstr "Aukeratu"
+
+msgid "Remove"
+msgstr "Kendu"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s Aukeratuak"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Hau da aukeratutako %s zerrenda. Hauetako zenbait ezaba ditzakezu azpiko "
+"kutxan hautatu eta bi kutxen artean dagoen \"Ezabatu\" gezian klik eginez."
+
+msgid "Remove all"
+msgstr "Kendu guztiak"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Egin klik aukeratutako %s guztiak kentzeko."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s-etik %(sel)s aukeratuta"
+msgstr[1] "%(cnt)s-etik %(sel)s aukeratuta"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Gorde gabeko aldaketak dauzkazu eremuetan. Ekintza bat exekutatzen baduzu, "
+"gorde gabeko aldaketak galduko dira."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ekintza bat hautatu duzu, baina oraindik ez duzu eremuetako aldaketak gorde. "
+"Mesedez, sakatu OK gordetzeko. Ekintza berriro exekutatu beharko duzu."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ekintza bat hautatu duzu, baina ez duzu inongo aldaketarik egin eremuetan. "
+"Litekeena da, Gorde botoia beharrean Aurrera botoiaren bila aritzea."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Orain"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Aukeratu ordu bat"
+
+msgid "Midnight"
+msgstr "Gauerdia"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Eguerdia"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Atzera"
+
+msgid "Today"
+msgstr "Gaur"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Atzo"
+
+msgid "Tomorrow"
+msgstr "Bihar"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Urtarrila Otsaila Martxoa Apirila Maiatza Ekaina Uztaila Abuztua Iraila "
+"Urria Azaroa Abendua"
+
+msgid "S M T W T F S"
+msgstr "I A A A O O L"
+
+msgid "Show"
+msgstr "Erakutsi"
+
+msgid "Hide"
+msgstr "Izkutatu"
diff --git a/tbc/static/admin/locale/fa/LC_MESSAGES/django.mo b/tbc/static/admin/locale/fa/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ecbe33b
--- /dev/null
+++ b/tbc/static/admin/locale/fa/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fa/LC_MESSAGES/django.po b/tbc/static/admin/locale/fa/LC_MESSAGES/django.po
new file mode 100644
index 0000000..271ea12
--- /dev/null
+++ b/tbc/static/admin/locale/fa/LC_MESSAGES/django.po
@@ -0,0 +1,678 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ali Nikneshan <ali@nikneshan.com>, 2015
+# Ali Vakilzade <ali.vakilzade@gmail.com>, 2015
+# Arash Fazeli <a.fazeli@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Reza Mohammadi <reza@teeleh.ir>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-29 23:38+0000\n"
+"Last-Translator: Ali Vakilzade <ali.vakilzade@gmail.com>\n"
+"Language-Team: Persian (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d تا %(items)s با موفقیت حذف شدند."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "امکان حذف %(name)s نیست."
+
+msgid "Are you sure?"
+msgstr "آیا مطمئن هستید؟"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "حذف %(verbose_name_plural)s های انتخاب شده"
+
+msgid "Administration"
+msgstr "مدیریت"
+
+msgid "All"
+msgstr "همه"
+
+msgid "Yes"
+msgstr "بله"
+
+msgid "No"
+msgstr "خیر"
+
+msgid "Unknown"
+msgstr "ناشناخته"
+
+msgid "Any date"
+msgstr "هر تاریخی"
+
+msgid "Today"
+msgstr "امروز"
+
+msgid "Past 7 days"
+msgstr "۷ روز اخیر"
+
+msgid "This month"
+msgstr "این ماه"
+
+msgid "This year"
+msgstr "امسال"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"لطفا %(username)s و گذرواژه را برای یک حساب کارمند وارد کنید.\n"
+"توجه داشته باشید که ممکن است هر دو به کوچکی و بزرگی حروف حساس باشند."
+
+msgid "Action:"
+msgstr "اقدام:"
+
+msgid "action time"
+msgstr "زمان اقدام"
+
+msgid "user"
+msgstr "کاربر"
+
+msgid "content type"
+msgstr "نوع محتوی"
+
+msgid "object id"
+msgstr "شناسهٔ شیء"
+
+msgid "object repr"
+msgstr "صورت شیء"
+
+msgid "action flag"
+msgstr "نشانه عمل"
+
+msgid "change message"
+msgstr "پیغام تغییر"
+
+msgid "log entry"
+msgstr "مورد اتفاقات"
+
+msgid "log entries"
+msgstr "موارد اتفاقات"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" افروده شد."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "تغییر \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" حدف شد."
+
+msgid "LogEntry Object"
+msgstr "شئ LogEntry"
+
+msgid "None"
+msgstr "هیچ"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"برای انتخاب بیش از یکی \"Control\"، یا \"Command\" روی Mac، را پایین نگه "
+"دارید."
+
+msgid "Added."
+msgstr "اضافه شد"
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s تغییر یافته."
+
+msgid "and"
+msgstr "و"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s «%(object)s» اضافه شد."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s %(name)s «%(object)s» تغییر یافت."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s «%(object)s» حذف شد."
+
+msgid "No fields changed."
+msgstr "فیلدی تغییر نیافته است."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s·\"%(obj)s\" با موفقیت اضافه شد. می‌توانید در این پایین ویرایشش کنید."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" با موفقیت اضافه شد. شما می‌توانید در ذیل یک %(name)s "
+"دیگر اضافه نمایید."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s «%(obj)s» با موفقیت اضافه شد."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" با موفقیت تغییر یافت. شما می‌توانید در ذیل مجدداُ آنرا "
+"ویرایش نمایید."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" با موفقیت تغییر یافت. شما می‌توانید در ذیل یک %(name)s "
+"دیگر اضافه نمایید."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s·\"%(obj)s\" با موفقیت تغییر یافت."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"آیتم ها باید به منظور انجام عملیات بر روی آنها انتخاب شوند. هیچ آیتمی با "
+"تغییر نیافته است."
+
+msgid "No action selected."
+msgstr "فعالیتی انتخاب نشده"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s·\"%(obj)s\" با موفقیت حذف شد."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "ایتم%(name)s با کلید اصلی %(key)r وجود ندارد."
+
+#, python-format
+msgid "Add %s"
+msgstr "اضافه کردن %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "تغییر %s"
+
+msgid "Database error"
+msgstr "خطا در بانک اطلاعاتی"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s با موفقیت تغییر کرد."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "همه موارد %(total_count)s انتخاب شده"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 از %(cnt)s انتخاب شده‌اند"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "تاریخچهٔ تغییر: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"برای حذف %(class_name)s %(instance)s لازم است اشیای حفاظت شدهٔ زیر هم حذف "
+"شوند: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "مدیریت وب‌گاه Django"
+
+msgid "Django administration"
+msgstr "مدیریت Django"
+
+msgid "Site administration"
+msgstr "مدیریت وب‌گاه"
+
+msgid "Log in"
+msgstr "ورود"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "مدیریت ‎%(app)s‎"
+
+msgid "Page not found"
+msgstr "صفحه یافت نشد"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "شرمنده، صفحه مورد تقاضا یافت نشد."
+
+msgid "Home"
+msgstr "شروع"
+
+msgid "Server error"
+msgstr "خطای سرور"
+
+msgid "Server error (500)"
+msgstr "خطای سرور (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "خطای سرور <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"مشکلی پیش آمده. این مشکل از طریق ایمیل به مدیران سایت اطلاع داده شد و به "
+"زودی اصلاح میگردد. از صبر شما ممنونیم"
+
+msgid "Run the selected action"
+msgstr "اجرای حرکت انتخاب شده"
+
+msgid "Go"
+msgstr "برو"
+
+msgid "Click here to select the objects across all pages"
+msgstr "برای انتخاب موجودیت‌ها در تمام صفحات اینجا را کلیک کنید"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "انتخاب تمامی %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "لغو انتخاب‌ها"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ابتدا یک نام کاربری و گذرواژه وارد کنید. سپس می توانید مشخصات دیگر کاربر را "
+"ویرایش کنید."
+
+msgid "Enter a username and password."
+msgstr "یک نام کاربری و رمز عبور را وارد کنید."
+
+msgid "Change password"
+msgstr "تغییر گذرواژه"
+
+msgid "Please correct the error below."
+msgstr "لطفاً خطای زیر را تصحیح کنید."
+
+msgid "Please correct the errors below."
+msgstr "لطفاً خطاهای زیر را تصحیح کنید."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "برای کابر <strong>%(username)s</strong> یک گذرنامهٔ جدید وارد کنید."
+
+msgid "Welcome,"
+msgstr "خوش آمدید،"
+
+msgid "View site"
+msgstr "نمایش وبگاه"
+
+msgid "Documentation"
+msgstr "مستندات"
+
+msgid "Log out"
+msgstr "خروج"
+
+msgid "Add"
+msgstr "اضافه کردن"
+
+msgid "History"
+msgstr "تاریخچه"
+
+msgid "View on site"
+msgstr "مشاهده در وب‌گاه"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "اضافه‌کردن %(name)s"
+
+msgid "Filter"
+msgstr "فیلتر"
+
+msgid "Remove from sorting"
+msgstr "حذف از مرتب سازی"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "اولویت مرتب‌سازی: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "تعویض مرتب سازی"
+
+msgid "Delete"
+msgstr "حذف"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"حذف %(object_name)s·'%(escaped_object)s' می تواند باعث حذف اشیاء مرتبط شود. "
+"اما حساب شما دسترسی لازم برای حذف اشیای از انواع زیر را ندارد:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"حذف %(object_name)s '%(escaped_object)s' نیاز به حذف موجودیت‌های مرتبط محافظت "
+"شده ذیل دارد:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"آیا مطمئنید که می‌خواهید %(object_name)s·\"%(escaped_object)s\" را حذف کنید؟ "
+"کلیهٔ اشیای مرتبط زیر حذف خواهند شد:"
+
+msgid "Objects"
+msgstr "اشیاء"
+
+msgid "Yes, I'm sure"
+msgstr "بله، مطمئن هستم."
+
+msgid "No, take me back"
+msgstr "نه، من را برگردان"
+
+msgid "Delete multiple objects"
+msgstr "حذف اشیاء متعدد"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"حذف %(objects_name)s انتخاب شده منجر به حذف موجودیت‌های مرتبط خواهد شد، ولی "
+"شناسه شما اجازه حذف اینگونه از موجودیت‌های ذیل را ندارد:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"حذف %(objects_name)s انتخاب شده نیاز به حذف موجودیت‌های مرتبط محافظت شده ذیل "
+"دارد:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"آیا در خصوص حذف %(objects_name)s انتخاب شده اطمینان دارید؟ تمام موجودیت‌های "
+"ذیل به همراه موارد مرتبط با آنها حذف خواهند شد:"
+
+msgid "Change"
+msgstr "تغییر"
+
+msgid "Remove"
+msgstr "حذف"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "افزودن یک %(verbose_name)s دیگر"
+
+msgid "Delete?"
+msgstr "حذف؟"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "براساس %(filter_title)s "
+
+msgid "Summary"
+msgstr "خلاصه"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "مدلها در برنامه %(name)s "
+
+msgid "You don't have permission to edit anything."
+msgstr "شما اجازهٔ ویرایش چیزی را ندارید."
+
+msgid "Recent Actions"
+msgstr "اعمال اخیر"
+
+msgid "My Actions"
+msgstr "اعمال من"
+
+msgid "None available"
+msgstr "چیزی در دسترس نیست"
+
+msgid "Unknown content"
+msgstr "محتوا ناشناخته"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"در نصب بانک اطلاعاتی شما مشکلی وجود دارد. مطمئن شوید که جداول مربوطه به "
+"درستی ایجاد شده‌اند و اطمینان حاصل کنید که بانک اطلاعاتی توسط کاربر مربوطه "
+"قابل خواندن می باشد."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"شما به عنوان %(username)sوارد شده اید. ولی اجازه مشاهده صفحه فوق را نداریدو "
+"آیا مایلید با کاربر دیگری وارد شوید؟"
+
+msgid "Forgotten your password or username?"
+msgstr "گذرواژه یا نام کاربری خود را فراموش کرده‌اید؟"
+
+msgid "Date/time"
+msgstr "تاریخ/ساعت"
+
+msgid "User"
+msgstr "کاربر"
+
+msgid "Action"
+msgstr "عمل"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"این شیء تاریخچهٔ تغییرات ندارد. احتمالا این شیء توسط وب‌گاه مدیریت ایجاد نشده "
+"است."
+
+msgid "Show all"
+msgstr "نمایش همه"
+
+msgid "Save"
+msgstr "ذخیره"
+
+msgid "Popup closing..."
+msgstr "در حال بستن پنجره..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "تغییر دادن %(model)s انتخاب شده"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "افزدون %(model)s دیگر"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "حذف کردن %(model)s انتخاب شده"
+
+msgid "Search"
+msgstr "جستجو"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s نتیجه"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "در مجموع %(full_result_count)s تا"
+
+msgid "Save as new"
+msgstr "ذخیره به عنوان جدید"
+
+msgid "Save and add another"
+msgstr "ذخیره و ایجاد یکی دیگر"
+
+msgid "Save and continue editing"
+msgstr "ذخیره و ادامهٔ ویرایش"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "متشکر از اینکه مدتی از وقت خود را به ما اختصاص دادید."
+
+msgid "Log in again"
+msgstr "ورود دوباره"
+
+msgid "Password change"
+msgstr "تغییر گذرواژه"
+
+msgid "Your password was changed."
+msgstr "گذرواژهٔ شما تغییر یافت."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"گذرواژهٔ قدیمی خود را، برای امنیت بیشتر، وارد کنید و سپس گذرواژهٔ جدیدتان را "
+"دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید."
+
+msgid "Change my password"
+msgstr "تغییر گذرواژهٔ من"
+
+msgid "Password reset"
+msgstr "ایجاد گذرواژهٔ جدید"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "گذرواژهٔ جدیدتان تنظیم شد. اکنون می‌توانید وارد وب‌گاه شوید."
+
+msgid "Password reset confirmation"
+msgstr "تأیید گذرواژهٔ جدید"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"گذرواژهٔ جدیدتان را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ "
+"کرده‌اید."
+
+msgid "New password:"
+msgstr "گذرواژهٔ جدید:"
+
+msgid "Confirm password:"
+msgstr "تکرار گذرواژه:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"پیوند ایجاد گذرواژهٔ جدید نامعتبر بود، احتمالاً به این علت که قبلاً از آن "
+"استفاده شده است. لطفاً برای یک گذرواژهٔ جدید درخواست دهید."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"دستورالعمل تنظیم گذرواژه را برایتان ایمیل کردیم. اگر با ایمیلی که وارد کردید "
+"اکانتی وجود داشت باشد باید به زودی این دستورالعمل‌ها را دریافت کنید."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"اگر ایمیلی دریافت نمی‌کنید، لطفاً بررسی کنید که آدرسی که وارد کرده‌اید همان است "
+"که با آن ثبت نام کرده‌اید، و پوشهٔ اسپم خود را نیز چک کنید."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"شما این ایمیل را بخاطر تقاضای تغییر رمز حساب در %(site_name)s. دریافت کرده "
+"اید."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "لطفاً به صفحهٔ زیر بروید و یک گذرواژهٔ جدید انتخاب کنید:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "نام کاربری‌تان، چنانچه احیاناً یادتان رفته است:"
+
+msgid "Thanks for using our site!"
+msgstr "ممنون از استفادهٔ شما از وب‌گاه ما"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "گروه %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"رمز خود را فراموش کرده اید؟ آدرس ایمیل خود را در زیر وارد کنید، و ما روش "
+"تنظیم رمز جدید را برایتان می فرستیم."
+
+msgid "Email address:"
+msgstr "آدرس ایمیل:"
+
+msgid "Reset my password"
+msgstr "ایجاد گذرواژهٔ جدید"
+
+msgid "All dates"
+msgstr "همهٔ تاریخ‌ها"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s انتخاب کنید"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s را برای تغییر انتخاب کنید"
+
+msgid "Date:"
+msgstr "تاریخ:"
+
+msgid "Time:"
+msgstr "زمان:"
+
+msgid "Lookup"
+msgstr "جستجو"
+
+msgid "Currently:"
+msgstr "در حال حاضر:"
+
+msgid "Change:"
+msgstr "تغییر یافته:"
diff --git a/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f87437e
--- /dev/null
+++ b/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9b006e3
--- /dev/null
+++ b/tbc/static/admin/locale/fa/LC_MESSAGES/djangojs.po
@@ -0,0 +1,162 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ali Nikneshan <ali@nikneshan.com>, 2011-2012
+# Alireza Savand <alireza.savand@gmail.com>, 2012
+# Ali Vakilzade <ali.vakilzade@gmail.com>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Reza Mohammadi <reza@teeleh.ir>, 2014
+# Sina Cheraghi <sinacher@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-18 21:43+0000\n"
+"Last-Translator: Ali Vakilzade <ali.vakilzade@gmail.com>\n"
+"Language-Team: Persian (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%sی موجود"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"این لیست%s های در دسترس است. شما ممکن است برخی از آنها را در محل زیرانتخاب "
+"نمایید و سپس روی \"انتخاب\" بین دو جعبه کلیک کنید."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "برای غربال فهرست %sی موجود درون این جعبه تایپ کنید."
+
+msgid "Filter"
+msgstr "غربال"
+
+msgid "Choose all"
+msgstr "انتخاب همه"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "برای انتخاب یکجای همهٔ %s کلیک کنید."
+
+msgid "Choose"
+msgstr "انتخاب"
+
+msgid "Remove"
+msgstr "حذف"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s انتخاب شده"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"این فهرست %s های انتخاب شده است. شما ممکن است برخی از انتخاب آنها را در محل "
+"زیر وارد نمایید و سپس روی \"حذف\" جهت دار بین دو جعبه حذف شده است."
+
+msgid "Remove all"
+msgstr "حذف همه"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "برای حذف یکجای همهٔ %sی انتخاب شده کلیک کنید."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] " %(sel)s از %(cnt)s انتخاب شده‌اند"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"شما تغییراتی در بعضی فیلدهای قابل تغییر انجام داده اید. اگر کاری انجام "
+"دهید، تغییرات از دست خواهند رفت"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"شما کاری را انتخاب کرده اید، ولی هنوز تغییرات بعضی فیلد ها را ذخیره نکرده "
+"اید. لطفا OK را فشار دهید تا ذخیره شود.\n"
+"شما باید عملیات را دوباره انجام دهید."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"شما عملی را انجام داده اید، ولی تغییری انجام نداده اید. احتمالا دنبال کلید "
+"Go به جای Save میگردید."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "توجه: شما %s ساعت از زمان سرور جلو هستید."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "توجه: شما %s ساعت از زمان سرور عقب هستید."
+
+msgid "Now"
+msgstr "اکنون"
+
+msgid "Choose a Time"
+msgstr "یک زمان انتخاب کنید"
+
+msgid "Choose a time"
+msgstr "یک زمان انتخاب کنید"
+
+msgid "Midnight"
+msgstr "نیمه‌شب"
+
+msgid "6 a.m."
+msgstr "۶ صبح"
+
+msgid "Noon"
+msgstr "ظهر"
+
+msgid "6 p.m."
+msgstr "۶ بعدازظهر"
+
+msgid "Cancel"
+msgstr "انصراف"
+
+msgid "Today"
+msgstr "امروز"
+
+msgid "Choose a Date"
+msgstr "یک تاریخ انتخاب کنید"
+
+msgid "Yesterday"
+msgstr "دیروز"
+
+msgid "Tomorrow"
+msgstr "فردا"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ژانویه فوریه مارس آوریل مه ژوئن ژوئیه اوت سپتامبر اکتبر نوامبر دسامبر"
+
+msgid "S M T W T F S"
+msgstr "یکشنبه دوشنبه سه‌شنبه چهارشنبه پنجشنبه جمعه شنبه"
+
+msgid "Show"
+msgstr "نمایش"
+
+msgid "Hide"
+msgstr "پنهان کردن"
diff --git a/tbc/static/admin/locale/fi/LC_MESSAGES/django.mo b/tbc/static/admin/locale/fi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1fe8c2b
--- /dev/null
+++ b/tbc/static/admin/locale/fi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fi/LC_MESSAGES/django.po b/tbc/static/admin/locale/fi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f0e8896
--- /dev/null
+++ b/tbc/static/admin/locale/fi/LC_MESSAGES/django.po
@@ -0,0 +1,674 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aarni Koskela, 2015
+# Antti Kaihola <antti.15+transifex@kaihola.fi>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Klaus Dahlén <klaus.dahlen@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Finnish (http://www.transifex.com/django/django/language/"
+"fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d \"%(items)s\"-kohdetta poistettu."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ei voida poistaa: %(name)s"
+
+msgid "Are you sure?"
+msgstr "Oletko varma?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet"
+
+msgid "Administration"
+msgstr "Hallinta"
+
+msgid "All"
+msgstr "Kaikki"
+
+msgid "Yes"
+msgstr "Kyllä"
+
+msgid "No"
+msgstr "Ei"
+
+msgid "Unknown"
+msgstr "Tuntematon"
+
+msgid "Any date"
+msgstr "Mikä tahansa päivä"
+
+msgid "Today"
+msgstr "Tänään"
+
+msgid "Past 7 days"
+msgstr "Viimeiset 7 päivää"
+
+msgid "This month"
+msgstr "Tässä kuussa"
+
+msgid "This year"
+msgstr "Tänä vuonna"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Ole hyvä ja syötä henkilökuntatilin %(username)s ja salasana. Huomaa että "
+"kummassakin kentässä isoilla ja pienillä kirjaimilla saattaa olla merkitystä."
+
+msgid "Action:"
+msgstr "Toiminto:"
+
+msgid "action time"
+msgstr "tapahtumahetki"
+
+msgid "user"
+msgstr "käyttäjä"
+
+msgid "content type"
+msgstr "sisältötyyppi"
+
+msgid "object id"
+msgstr "kohteen tunniste"
+
+msgid "object repr"
+msgstr "kohteen tiedot"
+
+msgid "action flag"
+msgstr "tapahtumatyyppi"
+
+msgid "change message"
+msgstr "selitys"
+
+msgid "log entry"
+msgstr "lokimerkintä"
+
+msgid "log entries"
+msgstr "lokimerkinnät"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Lisätty \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Muokattu \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Poistettu \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Lokimerkintätietue"
+
+msgid "None"
+msgstr "Ei arvoa"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Pidä \"Ctrl\" (tai Macin \"Command\") pohjassa valitaksesi useita "
+"vaihtoehtoja."
+
+msgid "Added."
+msgstr "Lisätty."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Muokattu: %s."
+
+msgid "and"
+msgstr "ja"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lisätty %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Muutettu %(list)s kohteelle %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Poistettu %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ei muutoksia kenttiin."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" on lisätty. Voit muokata sitä uudelleen alla."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" on lisätty. Voit lisätä toisen %(name)s alla."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" on lisätty."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" on muokattu. Voit muokata sitä uudelleen alla."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" on muokattu. Voit lisätä toisen %(name)s alla."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" on muutettu."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Kohteiden täytyy olla valittuna, jotta niihin voi kohdistaa toimintoja. "
+"Kohteita ei ole muutettu."
+
+msgid "No action selected."
+msgstr "Ei toimintoa valittuna."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" on poistettu."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s perusavaimella %(key)r ei ole olemassa."
+
+#, python-format
+msgid "Add %s"
+msgstr "Lisää %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Muokkaa %s"
+
+msgid "Database error"
+msgstr "Tietokantavirhe"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s on muokattu."
+msgstr[1] "%(count)s \"%(name)s\"-kohdetta on muokattu."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s valittu"
+msgstr[1] "Kaikki %(total_count)s valittu"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 valittuna %(cnt)s mahdollisesta"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Muokkaushistoria: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s %(instance)s poistaminen vaatisi myös seuraavien suojattujen "
+"liittyvien kohteiden poiston: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django-sivuston ylläpito"
+
+msgid "Django administration"
+msgstr "Djangon ylläpito"
+
+msgid "Site administration"
+msgstr "Sivuston ylläpito"
+
+msgid "Log in"
+msgstr "Kirjaudu sisään"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s-ylläpito"
+
+msgid "Page not found"
+msgstr "Sivua ei löydy"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt."
+
+msgid "Home"
+msgstr "Etusivu"
+
+msgid "Server error"
+msgstr "Palvelinvirhe"
+
+msgid "Server error (500)"
+msgstr "Palvelinvirhe (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Palvelinvirhe <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Sattui virhe. Virheestä on huomautettu sivuston ylläpitäjille sähköpostitse "
+"ja se korjautunee piakkoin. Kiitos kärsivällisyydestä."
+
+msgid "Run the selected action"
+msgstr "Suorita valittu toiminto"
+
+msgid "Go"
+msgstr "Suorita"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klikkaa tästä valitaksesi kohteet kaikilta sivuilta"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Valitse kaikki %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Tyhjennä valinta"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita "
+"käyttäjän tietoja."
+
+msgid "Enter a username and password."
+msgstr "Syötä käyttäjätunnus ja salasana."
+
+msgid "Change password"
+msgstr "Vaihda salasana"
+
+msgid "Please correct the error below."
+msgstr "Korjaa allaolevat virheet."
+
+msgid "Please correct the errors below."
+msgstr "Korjaa allaolevat virheet."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Syötä käyttäjän <strong>%(username)s</strong> uusi salasana."
+
+msgid "Welcome,"
+msgstr "Tervetuloa,"
+
+msgid "View site"
+msgstr "Näytä sivusto"
+
+msgid "Documentation"
+msgstr "Ohjeita"
+
+msgid "Log out"
+msgstr "Kirjaudu ulos"
+
+msgid "Add"
+msgstr "Lisää"
+
+msgid "History"
+msgstr "Muokkaushistoria"
+
+msgid "View on site"
+msgstr "Näytä lopputulos"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lisää %(name)s"
+
+msgid "Filter"
+msgstr "Suodatin"
+
+msgid "Remove from sorting"
+msgstr "Poista järjestämisestä"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Järjestysprioriteetti: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Kytke järjestäminen"
+
+msgid "Delete"
+msgstr "Poista"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen "
+"liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden "
+"poistamiseen:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s': poistettaessa joudutaan poistamaan "
+"myös seuraavat suojatut siihen liittyvät kohteet:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? "
+"Myös seuraavat kohteet poistettaisiin samalla:"
+
+msgid "Objects"
+msgstr "Kohteet"
+
+msgid "Yes, I'm sure"
+msgstr "Kyllä, olen varma"
+
+msgid "No, take me back"
+msgstr "Ei, mennään takaisin"
+
+msgid "Delete multiple objects"
+msgstr "Poista useita kohteita"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Jos valitut %(objects_name)s poistettaisiin, jouduttaisiin poistamaan niihin "
+"liittyviä kohteita. Sinulla ei kuitenkaan ole oikeutta poistaa seuraavia "
+"kohdetyyppejä:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Jos valitut %(objects_name)s poistetaan, pitää poistaa myös seuraavat "
+"suojatut niihin liittyvät kohteet:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Haluatki varmasti poistaa valitut %(objects_name)s? Samalla poistetaan "
+"kaikki alla mainitut ja niihin liittyvät kohteet:"
+
+msgid "Change"
+msgstr "Muokkaa"
+
+msgid "Remove"
+msgstr "Poista"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Lisää toinen %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Poista?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr "Yhteenveto"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s -applikaation mallit"
+
+msgid "You don't have permission to edit anything."
+msgstr "Sinulla ei ole oikeutta muokata mitään."
+
+msgid "Recent Actions"
+msgstr "Viimeisimmät tapahtumat"
+
+msgid "My Actions"
+msgstr "Omat tapahtumani"
+
+msgid "None available"
+msgstr "Ei yhtään"
+
+msgid "Unknown content"
+msgstr "Tuntematon sisältö"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Tietokanta-asennuksessa on jotain vialla. Varmista, että sopivat taulut on "
+"luotu ja että oikea käyttäjä voi lukea tietokantaa."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Olet kirjautunut käyttäjänä %(username)s, mutta sinulla ei ole pääsyä tälle "
+"sivulle. Haluaisitko kirjautua eri tilille?"
+
+msgid "Forgotten your password or username?"
+msgstr "Unohditko salasanasi tai käyttäjätunnuksesi?"
+
+msgid "Date/time"
+msgstr "Pvm/klo"
+
+msgid "User"
+msgstr "Käyttäjä"
+
+msgid "Action"
+msgstr "Tapahtuma"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole ilmeisesti lisätty tämän "
+"ylläpitosivun avulla."
+
+msgid "Show all"
+msgstr "Näytä kaikki"
+
+msgid "Save"
+msgstr "Tallenna ja poistu"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Muuta valittuja %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Lisää toinen %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Poista valitut %(model)s"
+
+msgid "Search"
+msgstr "Haku"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s osuma"
+msgstr[1] "%(counter)s osumaa"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "yhteensä %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Tallenna uutena"
+
+msgid "Save and add another"
+msgstr "Tallenna ja lisää toinen"
+
+msgid "Save and continue editing"
+msgstr "Tallenna välillä ja jatka muokkaamista"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Kiitos sivuillamme viettämästäsi ajasta."
+
+msgid "Log in again"
+msgstr "Kirjaudu uudelleen sisään"
+
+msgid "Password change"
+msgstr "Salasanan vaihtaminen"
+
+msgid "Your password was changed."
+msgstr "Salasanasi on vaihdettu."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi kaksi "
+"kertaa, jotta se tulee varmasti oikein."
+
+msgid "Change my password"
+msgstr "Vaihda salasana"
+
+msgid "Password reset"
+msgstr "Salasanan nollaus"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Salasanasi on asetettu. Nyt voit kirjautua sisään."
+
+msgid "Password reset confirmation"
+msgstr "Salasanan nollauksen vahvistus"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Syötä uusi salasanasi kaksi kertaa, jotta voimme varmistaa että syötit sen "
+"oikein."
+
+msgid "New password:"
+msgstr "Uusi salasana:"
+
+msgid "Confirm password:"
+msgstr "Varmista uusi salasana:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Salasanan nollauslinkki oli virheellinen, mahdollisesti siksi että se on jo "
+"käytetty. Ole hyvä ja pyydä uusi salasanan nollaus."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Sinulle on lähetetty sähköpostitse ohjeet salasanasi asettamiseen, mikäli "
+"antamallasi sähköpostiosoitteella on olemassa tili."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Jos viestiä ei näy, ole hyvä ja varmista syöttäneesi oikea sähköpostiosoite "
+"sekä tarkista sähköpostisi roskapostikansio."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Tämä viesti on lähetetty sinulle, koska olet pyytänyt %(site_name)s -"
+"sivustolla salasanan palautusta."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Määrittele uusi salasanasi oheisella sivulla:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:"
+
+msgid "Thanks for using our site!"
+msgstr "Kiitos vierailustasi sivuillamme!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s -sivuston ylläpitäjät"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Unohditko salasanasi? Syötä sähköpostiosoitteesi alle ja lähetämme sinulle "
+"ohjeet uuden salasanan asettamiseksi."
+
+msgid "Email address:"
+msgstr "Sähköpostiosoite:"
+
+msgid "Reset my password"
+msgstr "Nollaa salasanani"
+
+msgid "All dates"
+msgstr "Kaikki päivät"
+
+#, python-format
+msgid "Select %s"
+msgstr "Valitse %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Valitse muokattava %s"
+
+msgid "Date:"
+msgstr "Pvm:"
+
+msgid "Time:"
+msgstr "Klo:"
+
+msgid "Lookup"
+msgstr "Etsi"
+
+msgid "Currently:"
+msgstr "Tällä hetkellä:"
+
+msgid "Change:"
+msgstr "Muokkaa:"
diff --git a/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..472c6dd
--- /dev/null
+++ b/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a757ba8
--- /dev/null
+++ b/tbc/static/admin/locale/fi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aarni Koskela, 2015
+# Antti Kaihola <antti.15+transifex@kaihola.fi>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-11 11:44+0000\n"
+"Last-Translator: Aarni Koskela\n"
+"Language-Team: Finnish (http://www.transifex.com/django/django/language/"
+"fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Mahdolliset %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Tämä on lista saatavillaolevista %s. Valitse allaolevasta laatikosta "
+"haluamasi ja siirrä ne valittuihin klikkamalla \"Valitse\"-nuolta "
+"laatikoiden välillä."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Kirjoita tähän listaan suodattaaksesi %s-listaa."
+
+msgid "Filter"
+msgstr "Suodatin"
+
+msgid "Choose all"
+msgstr "Valitse kaikki"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klikkaa valitaksesi kaikki %s kerralla."
+
+msgid "Choose"
+msgstr "Valitse"
+
+msgid "Remove"
+msgstr "Poista"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valitut %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Tämä on lista valituista %s. Voit poistaa valintoja valitsemalla ne "
+"allaolevasta laatikosta ja siirtämällä ne takaisin valitsemattomiin "
+"klikkamalla \"Poista\"-nuolta laatikoiden välillä."
+
+msgid "Remove all"
+msgstr "Poista kaikki"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klikkaa poistaaksesi kaikki valitut %s kerralla."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s valittuna %(cnt)s mahdollisesta"
+msgstr[1] "%(sel)s valittuna %(cnt)s mahdollisesta"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Sinulla on tallentamattomia muutoksia yksittäisissä muokattavissa kentissä. "
+"Jos suoritat toiminnon, tallentamattomat muutoksesi katoavat."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Olet valinnut toiminnon, mutta et ole vielä tallentanut muutoksiasi "
+"yksittäisiin kenttiin. Paina OK tallentaaksesi. Sinun pitää suorittaa "
+"toiminto uudelleen."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Olet valinnut toiminnon etkä ole tehnyt yhtään muutosta yksittäisissä "
+"kentissä. Etsit todennäköisesti Suorita-nappia Tallenna-napin sijaan."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Huom: Olet %s tunnin palvelinaikaa edellä."
+msgstr[1] "Huom: Olet %s tuntia palvelinaikaa edellä."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Huom: Olet %s tunnin palvelinaikaa jäljessä."
+msgstr[1] "Huom: Olet %s tuntia palvelinaikaa jäljessä."
+
+msgid "Now"
+msgstr "Nyt"
+
+msgid "Choose a Time"
+msgstr "Valitse kellonaika"
+
+msgid "Choose a time"
+msgstr "Valitse kellonaika"
+
+msgid "Midnight"
+msgstr "24"
+
+msgid "6 a.m."
+msgstr "06"
+
+msgid "Noon"
+msgstr "12"
+
+msgid "6 p.m."
+msgstr "18:00"
+
+msgid "Cancel"
+msgstr "Peruuta"
+
+msgid "Today"
+msgstr "Tänään"
+
+msgid "Choose a Date"
+msgstr "Valitse päivämäärä"
+
+msgid "Yesterday"
+msgstr "Eilen"
+
+msgid "Tomorrow"
+msgstr "Huomenna"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Tammikuu Helmikuu Maaliskuu Huhtikuu Toukokuu Kesäkuu Heinäkuu Elokuu "
+"Syyskuu Lokakuu Marraskuu Joulukuu"
+
+msgid "S M T W T F S"
+msgstr "S M T K T P L"
+
+msgid "Show"
+msgstr "Näytä"
+
+msgid "Hide"
+msgstr "Piilota"
diff --git a/tbc/static/admin/locale/fr/LC_MESSAGES/django.mo b/tbc/static/admin/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c496fcd
--- /dev/null
+++ b/tbc/static/admin/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fr/LC_MESSAGES/django.po b/tbc/static/admin/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7dc7a89
--- /dev/null
+++ b/tbc/static/admin/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,693 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Claude Paroz <claude@2xlibre.net>, 2013-2015
+# Claude Paroz <claude@2xlibre.net>, 2011,2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 19:45+0000\n"
+"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
+"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "La suppression de %(count)d %(items)s a réussi."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Impossible de supprimer %(name)s"
+
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Supprimer les %(verbose_name_plural)s sélectionnés"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "All"
+msgstr "Tout"
+
+msgid "Yes"
+msgstr "Oui"
+
+msgid "No"
+msgstr "Non"
+
+msgid "Unknown"
+msgstr "Inconnu"
+
+msgid "Any date"
+msgstr "Toutes les dates"
+
+msgid "Today"
+msgstr "Aujourd'hui"
+
+msgid "Past 7 days"
+msgstr "Les 7 derniers jours"
+
+msgid "This month"
+msgstr "Ce mois-ci"
+
+msgid "This year"
+msgstr "Cette année"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Veuillez compléter correctement les champs « %(username)s » et « mot de "
+"passe » d'un compte autorisé. Sachez que les deux champs peuvent être "
+"sensibles à la casse."
+
+msgid "Action:"
+msgstr "Action :"
+
+msgid "action time"
+msgstr "heure de l'action"
+
+msgid "user"
+msgstr "utilisateur"
+
+msgid "content type"
+msgstr "type de contenu"
+
+msgid "object id"
+msgstr "id de l'objet"
+
+msgid "object repr"
+msgstr "représentation de l'objet"
+
+msgid "action flag"
+msgstr "indicateur de l'action"
+
+msgid "change message"
+msgstr "message de modification"
+
+msgid "log entry"
+msgstr "entrée d'historique"
+
+msgid "log entries"
+msgstr "entrées d'historique"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "%(object)s ajouté(e)s."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "%(object)s modifié(e)s - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "%(object)s supprimé(e)s"
+
+msgid "LogEntry Object"
+msgstr "Objet de journal"
+
+msgid "None"
+msgstr "Aucun(e)"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour "
+"en sélectionner plusieurs."
+
+msgid "Added."
+msgstr "Ajout."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modification de %s."
+
+msgid "and"
+msgstr "et"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s « %(object)s » ajouté."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s modifié pour %(name)s « %(object)s »."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s « %(object)s » supprimé."
+
+msgid "No fields changed."
+msgstr "Aucun champ modifié."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"L'objet %(name)s « %(obj)s » a été ajouté avec succès. Vous pouvez continuer "
+"l'édition ci-dessous."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"L'objet %(name)s « %(obj)s » a été ajouté avec succès. Vous pouvez ajouter "
+"un autre objet « %(name)s » ci-dessous."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "L'objet %(name)s « %(obj)s » a été ajouté avec succès."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"L'objet %(name)s « %(obj)s » a été modifié avec succès. Vous pouvez "
+"continuer l'édition ci-dessous."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"L'objet %(name)s « %(obj)s » a été modifié avec succès. Vous pouvez ajouter "
+"un autre objet %(name)s ci-dessous."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "L'objet %(name)s « %(obj)s » a été modifié avec succès."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Des éléments doivent être sélectionnés afin d'appliquer les actions. Aucun "
+"élément n'a été modifié."
+
+msgid "No action selected."
+msgstr "Aucune action sélectionnée."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "L'objet %(name)s « %(obj)s » a été supprimé avec succès."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "L'objet %(name)s avec la clef primaire %(key)r n'existe pas."
+
+#, python-format
+msgid "Add %s"
+msgstr "Ajout %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modification de %s"
+
+msgid "Database error"
+msgstr "Erreur de base de données"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s objet %(name)s a été modifié avec succès."
+msgstr[1] "%(count)s objets %(name)s ont été modifiés avec succès."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s sélectionné"
+msgstr[1] "Tous les %(total_count)s sélectionnés"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 sur %(cnt)s sélectionné"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historique des changements : %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Supprimer l'objet %(class_name)s « %(instance)s » provoquerait la "
+"suppression des objets liés et protégés suivants : %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+msgid "Django administration"
+msgstr "Administration de Django"
+
+msgid "Site administration"
+msgstr "Administration du site"
+
+msgid "Log in"
+msgstr "Connexion"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administration de %(app)s"
+
+msgid "Page not found"
+msgstr "Cette page n'a pas été trouvée"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Nous sommes désolés, mais la page demandée est introuvable."
+
+msgid "Home"
+msgstr "Accueil"
+
+msgid "Server error"
+msgstr "Erreur du serveur"
+
+msgid "Server error (500)"
+msgstr "Erreur du serveur (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Erreur du serveur <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Une erreur est survenue. Elle a été transmise par courriel aux "
+"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
+"pour votre patience."
+
+msgid "Run the selected action"
+msgstr "Exécuter l'action sélectionnée"
+
+msgid "Go"
+msgstr "Envoyer"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Cliquez ici pour sélectionner tous les objets sur l'ensemble des pages"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Sélectionner tous les %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Effacer la sélection"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Saisissez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
+"ensuite modifier plus d'options."
+
+msgid "Enter a username and password."
+msgstr "Saisissez un nom d'utilisateur et un mot de passe."
+
+msgid "Change password"
+msgstr "Modifier le mot de passe"
+
+msgid "Please correct the error below."
+msgstr "Corrigez les erreurs suivantes."
+
+msgid "Please correct the errors below."
+msgstr "Corrigez les erreurs ci-dessous."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Saisissez un nouveau mot de passe pour l'utilisateur <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Bienvenue,"
+
+msgid "View site"
+msgstr "Voir le site"
+
+msgid "Documentation"
+msgstr "Documentation"
+
+msgid "Log out"
+msgstr "Déconnexion"
+
+msgid "Add"
+msgstr "Ajouter"
+
+msgid "History"
+msgstr "Historique"
+
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
+
+msgid "Filter"
+msgstr "Filtre"
+
+msgid "Remove from sorting"
+msgstr "Enlever du tri"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Priorité de tri : %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Inverser le tri"
+
+msgid "Delete"
+msgstr "Supprimer"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Supprimer l'objet %(object_name)s « %(escaped_object)s » provoquerait la "
+"suppression des objets qui lui sont liés, mais votre compte ne possède pas "
+"la permission de supprimer les types d'objets suivants :"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Supprimer l'objet %(object_name)s « %(escaped_object)s » provoquerait la "
+"suppression des objets liés et protégés suivants :"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Voulez-vous vraiment supprimer l'objet %(object_name)s "
+"« %(escaped_object)s » ? Les éléments suivants sont liés à celui-ci et "
+"seront aussi supprimés :"
+
+msgid "Objects"
+msgstr "Objets"
+
+msgid "Yes, I'm sure"
+msgstr "Oui, je suis sûr"
+
+msgid "No, take me back"
+msgstr "Non, revenir à la page précédente"
+
+msgid "Delete multiple objects"
+msgstr "Supprimer plusieurs objets"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"La suppression des objets %(objects_name)s sélectionnés provoquerait la "
+"suppression d'objets liés, mais votre compte n'est pas autorisé à supprimer "
+"les types d'objet suivants :"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"La suppression des objets %(objects_name)s sélectionnés provoquerait la "
+"suppression des objets liés et protégés suivants :"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Voulez-vous vraiment supprimer les objets %(objects_name)s sélectionnés ? "
+"Tous les objets suivants et les éléments liés seront supprimés :"
+
+msgid "Change"
+msgstr "Modifier"
+
+msgid "Remove"
+msgstr "Supprimer"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Ajouter un objet %(verbose_name)s supplémentaire"
+
+msgid "Delete?"
+msgstr "Supprimer ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Par %(filter_title)s "
+
+msgid "Summary"
+msgstr "Résumé"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modèles de l'application %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Vous n'avez pas la permission de modifier quoi que ce soit."
+
+msgid "Recent Actions"
+msgstr "Actions récentes"
+
+msgid "My Actions"
+msgstr "Mes actions"
+
+msgid "None available"
+msgstr "Aucun(e) disponible"
+
+msgid "Unknown content"
+msgstr "Contenu inconnu"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"L'installation de votre base de données est incorrecte. Vérifiez que les "
+"tables utiles ont été créées, et que la base est accessible par "
+"l'utilisateur concerné."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Vous êtes authentifié sous le nom %(username)s, mais vous n'êtes pas "
+"autorisé à accéder à cette page. Souhaitez-vous vous connecter avec un autre "
+"compte utilisateur ?"
+
+msgid "Forgotten your password or username?"
+msgstr "Mot de passe ou nom d'utilisateur oublié ?"
+
+msgid "Date/time"
+msgstr "Date/heure"
+
+msgid "User"
+msgstr "Utilisateur"
+
+msgid "Action"
+msgstr "Action"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Cet objet n'a pas d'historique de modification. Il n'a probablement pas été "
+"ajouté au moyen de ce site d'administration."
+
+msgid "Show all"
+msgstr "Tout afficher"
+
+msgid "Save"
+msgstr "Enregistrer"
+
+msgid "Popup closing..."
+msgstr "Fenêtre en cours de fermeture…"
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Modifier l'objet %(model)s sélectionné"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Ajouter un autre objet %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Supprimer l'objet %(model)s sélectionné"
+
+msgid "Search"
+msgstr "Rechercher"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s résultat"
+msgstr[1] "%(counter)s résultats"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s résultats"
+
+msgid "Save as new"
+msgstr "Enregistrer en tant que nouveau"
+
+msgid "Save and add another"
+msgstr "Enregistrer et ajouter un nouveau"
+
+msgid "Save and continue editing"
+msgstr "Enregistrer et continuer les modifications"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Merci pour le temps que vous avez accordé à ce site aujourd'hui."
+
+msgid "Log in again"
+msgstr "Connectez-vous à nouveau"
+
+msgid "Password change"
+msgstr "Modification du mot de passe"
+
+msgid "Your password was changed."
+msgstr "Votre mot de passe a été modifié."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Pour des raisons de sécurité, saisissez votre ancien mot de passe puis votre "
+"nouveau mot de passe à deux reprises afin de vérifier qu'il est correctement "
+"saisi."
+
+msgid "Change my password"
+msgstr "Modifier mon mot de passe"
+
+msgid "Password reset"
+msgstr "Réinitialisation du mot de passe"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Votre mot de passe a été défini. Vous pouvez maintenant vous authentifier."
+
+msgid "Password reset confirmation"
+msgstr "Confirmation de mise à jour du mot de passe"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Saisissez deux fois votre nouveau mot de passe afin de vérifier qu'il est "
+"correctement saisi."
+
+msgid "New password:"
+msgstr "Nouveau mot de passe :"
+
+msgid "Confirm password:"
+msgstr "Confirmation du mot de passe :"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Le lien de mise à jour du mot de passe n'était pas valide, probablement en "
+"raison de sa précédente utilisation. Veuillez renouveler votre demande de "
+"mise à jour de mot de passe."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Nous vous avons envoyé par courriel les instructions pour changer de mot de "
+"passe, pour autant qu'un compte existe avec l'adresse que vous avez "
+"indiquée. Vous devriez recevoir rapidement ce message."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Si vous ne recevez pas de message, vérifiez que vous avez saisi l'adresse "
+"avec laquelle vous vous êtes enregistré et contrôlez votre dossier de "
+"pourriels."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Vous recevez ce message en réponse à votre demande de réinitialisation du "
+"mot de passe de votre compte sur %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Veuillez vous rendre sur cette page et choisir un nouveau mot de passe :"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Votre nom d'utilisateur, en cas d'oubli :"
+
+msgid "Thanks for using our site!"
+msgstr "Merci d'utiliser notre site !"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'équipe %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Mot de passe perdu ? Saisissez votre adresse électronique ci-dessous et nous "
+"vous enverrons les instructions pour en créer un nouveau."
+
+msgid "Email address:"
+msgstr "Adresse électronique :"
+
+msgid "Reset my password"
+msgstr "Réinitialiser mon mot de passe"
+
+msgid "All dates"
+msgstr "Toutes les dates"
+
+#, python-format
+msgid "Select %s"
+msgstr "Sélectionnez %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Sélectionnez l'objet %s à changer"
+
+msgid "Date:"
+msgstr "Date :"
+
+msgid "Time:"
+msgstr "Heure :"
+
+msgid "Lookup"
+msgstr "Recherche"
+
+msgid "Currently:"
+msgstr "Actuellement :"
+
+msgid "Change:"
+msgstr "Modifier :"
diff --git a/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b2dc72d
--- /dev/null
+++ b/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..62c821a
--- /dev/null
+++ b/tbc/static/admin/locale/fr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Claude Paroz <claude@2xlibre.net>, 2014-2015
+# Claude Paroz <claude@2xlibre.net>, 2011-2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 12:44+0000\n"
+"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
+"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponible(s)"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ceci est une liste des « %s » disponibles. Vous pouvez en choisir en les "
+"sélectionnant dans la zone ci-dessous, puis en cliquant sur la flèche "
+"« Choisir » entre les deux zones."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Écrivez dans cette zone pour filtrer la liste des « %s » disponibles."
+
+msgid "Filter"
+msgstr "Filtrer"
+
+msgid "Choose all"
+msgstr "Tout choisir"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Cliquez pour choisir tous les « %s » en une seule opération."
+
+msgid "Choose"
+msgstr "Choisir"
+
+msgid "Remove"
+msgstr "Enlever"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Choix des « %s »"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ceci est la liste des « %s » choisi(e)s. Vous pouvez en enlever en les "
+"sélectionnant dans la zone ci-dessous, puis en cliquant sur la flèche « "
+"Enlever » entre les deux zones."
+
+msgid "Remove all"
+msgstr "Tout enlever"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Cliquez pour enlever tous les « %s » en une seule opération."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s sur %(cnt)s sélectionné"
+msgstr[1] "%(sel)s sur %(cnt)s sélectionnés"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Vous avez des modifications non sauvegardées sur certains champs éditables. "
+"Si vous lancez une action, ces modifications vont être perdues."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Vous avez sélectionné une action, mais vous n'avez pas encore sauvegardé "
+"certains champs modifiés. Cliquez sur OK pour sauver. Vous devrez "
+"réappliquer l'action."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Vous avez sélectionné une action, et vous n'avez fait aucune modification "
+"sur des champs. Vous cherchez probablement le bouton Envoyer et non le "
+"bouton Sauvegarder."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Note : l'heure du serveur précède votre heure de %s heure."
+msgstr[1] "Note : l'heure du serveur précède votre heure de %s heures."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Note : votre heure précède l'heure du serveur de %s heure."
+msgstr[1] "Note : votre heure précède l'heure du serveur de %s heures."
+
+msgid "Now"
+msgstr "Maintenant"
+
+msgid "Choose a Time"
+msgstr "Choisir une heure"
+
+msgid "Choose a time"
+msgstr "Choisir une heure"
+
+msgid "Midnight"
+msgstr "Minuit"
+
+msgid "6 a.m."
+msgstr "6:00"
+
+msgid "Noon"
+msgstr "Midi"
+
+msgid "6 p.m."
+msgstr "18:00"
+
+msgid "Cancel"
+msgstr "Annuler"
+
+msgid "Today"
+msgstr "Aujourd'hui"
+
+msgid "Choose a Date"
+msgstr "Choisir une date"
+
+msgid "Yesterday"
+msgstr "Hier"
+
+msgid "Tomorrow"
+msgstr "Demain"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre "
+"Décembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Afficher"
+
+msgid "Hide"
+msgstr "Masquer"
diff --git a/tbc/static/admin/locale/fy/LC_MESSAGES/django.mo b/tbc/static/admin/locale/fy/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..cdea1d8
--- /dev/null
+++ b/tbc/static/admin/locale/fy/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fy/LC_MESSAGES/django.po b/tbc/static/admin/locale/fy/LC_MESSAGES/django.po
new file mode 100644
index 0000000..52310d3
--- /dev/null
+++ b/tbc/static/admin/locale/fy/LC_MESSAGES/django.po
@@ -0,0 +1,609 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-18 08:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/"
+"language/fy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fy\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Any date"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr ""
+
+msgid "This year"
+msgstr ""
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+msgid "(None)"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..489bbab
--- /dev/null
+++ b/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..ba09bad
--- /dev/null
+++ b/tbc/static/admin/locale/fy/LC_MESSAGES/djangojs.po
@@ -0,0 +1,145 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:13+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/"
+"language/fy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fy\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/ga/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ga/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..734bfe7
--- /dev/null
+++ b/tbc/static/admin/locale/ga/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ga/LC_MESSAGES/django.po b/tbc/static/admin/locale/ga/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8a2ad18
--- /dev/null
+++ b/tbc/static/admin/locale/ga/LC_MESSAGES/django.po
@@ -0,0 +1,685 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Michael Thornhill <michael@maithu.com>, 2011-2012,2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ga\n"
+"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
+"4);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "D'éirigh le scriosadh %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ní féidir scriosadh %(name)s "
+
+msgid "Are you sure?"
+msgstr "An bhfuil tú cinnte?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Scrios %(verbose_name_plural) roghnaithe"
+
+msgid "Administration"
+msgstr "Riarachán"
+
+msgid "All"
+msgstr "Gach"
+
+msgid "Yes"
+msgstr "Tá"
+
+msgid "No"
+msgstr "Níl"
+
+msgid "Unknown"
+msgstr "Gan aithne"
+
+msgid "Any date"
+msgstr "Aon dáta"
+
+msgid "Today"
+msgstr "Inniu"
+
+msgid "Past 7 days"
+msgstr "7 lá a chuaigh thart"
+
+msgid "This month"
+msgstr "Táim cinnte"
+
+msgid "This year"
+msgstr "An blian seo"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Cuir isteach an %(username)s agus focal faire ceart le haghaidh cuntas "
+"foirne. Tabhair faoi deara go bhféadfadh an dá réimsí a cás-íogair."
+
+msgid "Action:"
+msgstr "Aicsean:"
+
+msgid "action time"
+msgstr "am aicsean"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id oibiacht"
+
+msgid "object repr"
+msgstr "repr oibiacht"
+
+msgid "action flag"
+msgstr "brat an aicsean"
+
+msgid "change message"
+msgstr "teachtaireacht athrú"
+
+msgid "log entry"
+msgstr "loga iontráil"
+
+msgid "log entries"
+msgstr "loga iontrálacha"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" curtha isteach."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" - %(changes)s aithrithe"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s.\" scrioste"
+
+msgid "LogEntry Object"
+msgstr "Oibiacht LogEntry"
+
+msgid "None"
+msgstr "Dada"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Coinnigh síos \"Control\", nó \"Command\" ar Mac chun níos mó ná ceann "
+"amháin a roghnú."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Athraithe %s"
+
+msgid "and"
+msgstr "agus"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Suimithe %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Athraithe %(list)s le %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Scriosaithe %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Dada réimse aithraithe"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Chuir an %(name)s·\"%(obj)s\"·go rathúil.·Is féidir leat é a cuir in eagar "
+"thíos."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Bhí %(name)s \"%(obj)s\" cuireadh go rathúil. Is féidir leat %(name)s eile a "
+"chur thíos."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Bhí %(name)s \"%(obj)s\" breisithe go rathúil"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Bhí an %(name)s \"%(obj)s\" athraithe go rathúil. Is féidir leat é a cuir in "
+"eagar arís thíos."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Bhí an %(name)s \"%(obj)s\" athraithe go rathúil. Is féidir leat ceann eile "
+"%(name)s a cuir thíos."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Bhí an %(name)s \"%(obj)s\" aithraithe to rathúil"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Ní mór Míreanna a roghnú chun caingne a dhéanamh orthu. Níl aon mhíreanna a "
+"athrú."
+
+msgid "No action selected."
+msgstr "Uimh gníomh roghnaithe."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Bhí %(name)s \"%(obj)s\" scrioste go rathúil."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Níl réad le hainm %(name)s agus eochair %(key)r ann."
+
+#, python-format
+msgid "Add %s"
+msgstr "Cuir %s le"
+
+#, python-format
+msgid "Change %s"
+msgstr "Aithrigh %s"
+
+msgid "Database error"
+msgstr "Botún bunachar sonraí"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s athraithe go rathúil"
+msgstr[1] "%(count)s %(name)s athraithe go rathúil"
+msgstr[2] "%(count)s %(name)s athraithe go rathúil"
+msgstr[3] "%(count)s %(name)s athraithe go rathúil"
+msgstr[4] "%(count)s %(name)s athraithe go rathúil"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s roghnaithe"
+msgstr[1] "Gach %(total_count)s roghnaithe"
+msgstr[2] "Gach %(total_count)s roghnaithe"
+msgstr[3] "Gach %(total_count)s roghnaithe"
+msgstr[4] "Gach %(total_count)s roghnaithe"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 as %(cnt)s roghnaithe."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Athraigh stáir %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Teastaíodh scriosadh %(class_name)s %(instance)s scriosadh na rudaí a "
+"bhaineann leis: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Riarthóir suíomh Django"
+
+msgid "Django administration"
+msgstr "Riarachán Django"
+
+msgid "Site administration"
+msgstr "Riaracháin an suíomh"
+
+msgid "Log in"
+msgstr "Logáil isteach"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s riaracháin"
+
+msgid "Page not found"
+msgstr "Ní bhfuarthas an leathanach"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tá brón orainn, ach ní bhfuarthas an leathanach iarraite."
+
+msgid "Home"
+msgstr "Baile"
+
+msgid "Server error"
+msgstr "Botún freastalaí"
+
+msgid "Server error (500)"
+msgstr "Botún freastalaí (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Botún Freastalaí <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Tharla earráid. Tuairiscíodh don riarthóirí suíomh tríd an ríomhphost agus "
+"ba chóir a shocrú go luath. Go raibh maith agat as do foighne."
+
+msgid "Run the selected action"
+msgstr "Rith an gníomh roghnaithe"
+
+msgid "Go"
+msgstr "Té"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+"Cliceáil anseo chun na hobiacht go léir a roghnú ar fud gach leathanach"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Roghnaigh gach %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Scroiseadh modhnóir"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Ar dtús, iontráil ainm úsaideoir agus focal faire. Ansin, beidh tú in ann "
+"cuir in eagar níos mó roghaí úsaideoira."
+
+msgid "Enter a username and password."
+msgstr "Cuir isteach ainm úsáideora agus focal faire."
+
+msgid "Change password"
+msgstr "Athraigh focal faire"
+
+msgid "Please correct the error below."
+msgstr "Ceartaigh na botúin thíos le do thoil"
+
+msgid "Please correct the errors below."
+msgstr "Le do thoil cheartú earráidí thíos."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Iontráil focal faire nua le hadhaigh an úsaideor <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Fáilte"
+
+msgid "View site"
+msgstr "Breatnaigh ar an suíomh"
+
+msgid "Documentation"
+msgstr "Doiciméadúchán"
+
+msgid "Log out"
+msgstr "Logáil amach"
+
+msgid "Add"
+msgstr "Cuir le"
+
+msgid "History"
+msgstr "Stair"
+
+msgid "View on site"
+msgstr "Breath ar suíomh"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Cuir %(name)s le"
+
+msgid "Filter"
+msgstr "Scagaire"
+
+msgid "Remove from sorting"
+msgstr "Bain as sórtáil"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sórtáil tosaíocht: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Toggle sórtáil"
+
+msgid "Delete"
+msgstr "Cealaigh"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Má scriossan tú %(object_name)s '%(escaped_object)s' scriosfaidh oibiachtí "
+"gaolta. Ach níl cead ag do cuntas na oibiacht a leanúint a scriosadh:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Bheadh Scriosadh an %(object_name)s '%(escaped_object)s' a cheangal ar an "
+"méid seo a leanas a scriosadh nithe cosanta a bhaineann le:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"An bhfuil tú cinnte na %(object_name)s \"%(escaped_object)s\" a scroiseadh?"
+"Beidh gach oibiacht a leanúint scroiste freisin:"
+
+msgid "Objects"
+msgstr "Oibiachtaí"
+
+msgid "Yes, I'm sure"
+msgstr "Táim cinnte"
+
+msgid "No, take me back"
+msgstr "Ní hea, tóg ar ais mé"
+
+msgid "Delete multiple objects"
+msgstr "Scrios na réadanna"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Scriosadh an roghnaithe %(objects_name)s a bheadh mar thoradh ar na nithe "
+"gaolmhara a scriosadh, ach níl cead do chuntas a scriosadh na cineálacha seo "
+"a leanas na cuspóirí:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Teastaíonn scriosadh na %(objects_name)s roghnaithe scriosadh na hoibiacht "
+"gaolta cosainte a leanúint:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"An bhfuil tú cinnte gur mian leat a scriosadh %(objects_name)s roghnaithe? "
+"Beidh gach ceann de na nithe seo a leanas agus a n-ítimí gaolta scroiste:"
+
+msgid "Change"
+msgstr "Athraigh"
+
+msgid "Remove"
+msgstr "Tóg amach"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Cuir eile %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Cealaigh?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Trí %(filter_title)s "
+
+msgid "Summary"
+msgstr "Achoimre"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Samhlacha ins an %(name)s iarratais"
+
+msgid "You don't have permission to edit anything."
+msgstr "Níl cead agat aon rud a cuir in eagar."
+
+msgid "Recent Actions"
+msgstr "Aicsean úrnua"
+
+msgid "My Actions"
+msgstr "Mo Aicseain"
+
+msgid "None available"
+msgstr "Dada ar fáil"
+
+msgid "Unknown content"
+msgstr "Inneachair anaithnid"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Tá rud éigin mícheart le suitéail do bunachar sonraí. Déan cinnte go bhfuil "
+"boird an bunachar sonraI cruthaithe cheana, agus déan cinnte go bhfuil do "
+"úsaideoir in ann an bunacchar sonraí a léamh."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Dearmad déanta ar do focal faire nó ainm úsaideora"
+
+msgid "Date/time"
+msgstr "Dáta/am"
+
+msgid "User"
+msgstr "Úsaideoir"
+
+msgid "Action"
+msgstr "Aicsean"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Níl stáir aitraithe ag an oibiacht seo agús is dócha ná cuir le tríd an an "
+"suíomh riarachán."
+
+msgid "Show all"
+msgstr "Taispéan gach rud"
+
+msgid "Save"
+msgstr "Sábháil"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Athraigh roghnaithe %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Cuir le %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Scrios roghnaithe %(model)s"
+
+msgid "Search"
+msgstr "Cuardach"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s toradh"
+msgstr[1] "%(counter)s torthaí"
+msgstr[2] "%(counter)s torthaí"
+msgstr[3] "%(counter)s torthaí"
+msgstr[4] "%(counter)s torthaí"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s iomlán"
+
+msgid "Save as new"
+msgstr "Sabháil mar nua"
+
+msgid "Save and add another"
+msgstr "Sabháil agus cuir le ceann eile"
+
+msgid "Save and continue editing"
+msgstr "Sábhail agus lean ag cuir in eagar"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Go raibh maith agat le hadhaigh do cuairt ar an suíomh idirlínn inniú."
+
+msgid "Log in again"
+msgstr "Logáil isteacj arís"
+
+msgid "Password change"
+msgstr "Athrú focal faire"
+
+msgid "Your password was changed."
+msgstr "Bhí do focal faire aithraithe."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Le do thoil, iontráil do sean-focal faire, ar son slándáil, agus ansin "
+"iontráil do focal faire dhá uaire cé go mbeimid in ann a seiceal go bhfuil "
+"sé scríobhte isteach i gceart."
+
+msgid "Change my password"
+msgstr "Athraigh mo focal faire"
+
+msgid "Password reset"
+msgstr "Athsocraigh focal faire"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Tá do focal faire réidh. Is féidir leat logáil isteach anois."
+
+msgid "Password reset confirmation"
+msgstr "Deimhniú athshocraigh focal faire"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Le do thoil, iontráil do focal faire dhá uaire cé go mbeimid in ann a "
+"seiceal go bhfuil sé scríobhte isteach i gceart."
+
+msgid "New password:"
+msgstr "Focal faire nua:"
+
+msgid "Confirm password:"
+msgstr "Deimhnigh focal faire:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Bhí nasc athshocraigh an focal faire mícheart, b'fheidir mar go raibh sé "
+"úsaidte cheana. Le do thoil, iarr ar athsocraigh focal faire nua."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Le do thoil té go dtí an leathanach a leanúint agus roghmaigh focal faire "
+"nua:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Do ainm úsaideoir, má tá dearmad déanta agat."
+
+msgid "Thanks for using our site!"
+msgstr "Go raibh maith agat le hadhaigh do cuairt!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Foireann an %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr "Seoladh ríomhphoist:"
+
+msgid "Reset my password"
+msgstr "Athsocraigh mo focal faire"
+
+msgid "All dates"
+msgstr "Gach dáta"
+
+#, python-format
+msgid "Select %s"
+msgstr "Roghnaigh %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Roghnaigh %s a athrú"
+
+msgid "Date:"
+msgstr "Dáta:"
+
+msgid "Time:"
+msgstr "Am:"
+
+msgid "Lookup"
+msgstr "Cuardach"
+
+msgid "Currently:"
+msgstr "Faoi láthair:"
+
+msgid "Change:"
+msgstr "Athraigh:"
diff --git a/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..33b5b07
--- /dev/null
+++ b/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e65675c
--- /dev/null
+++ b/tbc/static/admin/locale/ga/LC_MESSAGES/djangojs.po
@@ -0,0 +1,179 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Michael Thornhill <michael@maithu.com>, 2011-2012,2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ga\n"
+"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
+"4);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s ar fáil"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Is é seo an liosta %s ar fáil. Is féidir leat a roghnú roinnt ag roghnú acu "
+"sa bhosca thíos agus ansin cliceáil ar an saighead \"Roghnaigh\" idir an dá "
+"boscaí."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Scríobh isteach sa bhosca seo a scagadh síos ar an liosta de %s ar fáil."
+
+msgid "Filter"
+msgstr "Scagaire"
+
+msgid "Choose all"
+msgstr "Roghnaigh iomlán"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Cliceáil anseo chun %s go léir a roghnú."
+
+msgid "Choose"
+msgstr "Roghnaigh"
+
+msgid "Remove"
+msgstr "Bain amach"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Roghnófar %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Is é seo an liosta de %s roghnaithe. Is féidir leat iad a bhaint amach má "
+"roghnaionn tú cuid acu sa bhosca thíos agus ansin cliceáil ar an saighead "
+"\"Bain\" idir an dá boscaí."
+
+msgid "Remove all"
+msgstr "Scrois gach ceann"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Cliceáil anseo chun %s go léir roghnaithe a scroiseadh."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s roghnaithe"
+msgstr[1] "%(sel)s de %(cnt)s roghnaithe"
+msgstr[2] "%(sel)s de %(cnt)s roghnaithe"
+msgstr[3] "%(sel)s de %(cnt)s roghnaithe"
+msgstr[4] "%(sel)s de %(cnt)s roghnaithe"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tá aithrithe nach bhfuil sabhailte ar chuid do na réimse. Má ritheann tú "
+"gníomh, caillfidh tú do chuid aithrithe."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Tá gníomh roghnaithe agat, ach níl do aithrithe sabhailte ar cuid de na "
+"réímse. Clic OK chun iad a sábháil. Caithfidh tú an gníomh a rith arís."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Tá gníomh roghnaithe agat, ach níl do aithrithe sabhailte ar cuid de na "
+"réímse. Is dócha go bhfuil tú ag iarraidh an cnaipe Té ná an cnaipe Sábháil."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí."
+msgstr[1] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí."
+msgstr[2] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí."
+msgstr[3] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí."
+msgstr[4] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí."
+msgstr[1] ""
+"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí."
+msgstr[2] ""
+"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí."
+msgstr[3] ""
+"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí."
+msgstr[4] ""
+"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí."
+
+msgid "Now"
+msgstr "Anois"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Roghnaigh am"
+
+msgid "Midnight"
+msgstr "Meán oíche"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Nóin"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Cealaigh"
+
+msgid "Today"
+msgstr "Inniu"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Inné"
+
+msgid "Tomorrow"
+msgstr "Amárach"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Eanair Feabhra Márta Aibreán Bealtaine Meitheamh Iúil Lúnasa Mean Fómhair "
+"Deireadh Fómhair Nollaig"
+
+msgid "S M T W T F S"
+msgstr "D L M C D A S"
+
+msgid "Show"
+msgstr "Taispeán"
+
+msgid "Hide"
+msgstr "Folaigh"
diff --git a/tbc/static/admin/locale/gd/LC_MESSAGES/django.mo b/tbc/static/admin/locale/gd/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8c86a02
--- /dev/null
+++ b/tbc/static/admin/locale/gd/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/gd/LC_MESSAGES/django.po b/tbc/static/admin/locale/gd/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cafb427
--- /dev/null
+++ b/tbc/static/admin/locale/gd/LC_MESSAGES/django.po
@@ -0,0 +1,704 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# GunChleoc, 2015
+# GunChleoc, 2015
+# GunChleoc, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-26 21:16+0000\n"
+"Last-Translator: GunChleoc\n"
+"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/"
+"language/gd/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gd\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Chaidh %(count)d %(items)s a sguabadh às gu soirbheachail."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Chan urrainn dhuinn %(name)s a sguabadh às"
+
+msgid "Are you sure?"
+msgstr "A bheil thu cinnteach?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Sguab às na %(verbose_name_plural)s a chaidh a thaghadh"
+
+msgid "Administration"
+msgstr "Rianachd"
+
+msgid "All"
+msgstr "Na h-uile"
+
+msgid "Yes"
+msgstr "Tha"
+
+msgid "No"
+msgstr "Chan eil"
+
+msgid "Unknown"
+msgstr "Chan eil fhios"
+
+msgid "Any date"
+msgstr "Ceann-là sam bith"
+
+msgid "Today"
+msgstr "An-diugh"
+
+msgid "Past 7 days"
+msgstr "Na 7 làithean seo chaidh"
+
+msgid "This month"
+msgstr "Am mìos seo"
+
+msgid "This year"
+msgstr "Am bliadhna"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Cuir a-steach %(username)s agus facal-faire ceart airson cunntas neach-"
+"obrach. Thoir an aire gum bi aire do litrichean mòra ’s beaga air an dà "
+"raon, ma dh’fhaoidte."
+
+msgid "Action:"
+msgstr "Gnìomh:"
+
+msgid "action time"
+msgstr "àm a’ ghnìomha"
+
+msgid "user"
+msgstr "cleachdaiche"
+
+msgid "content type"
+msgstr "seòrsa susbainte"
+
+msgid "object id"
+msgstr "id an oibceict"
+
+msgid "object repr"
+msgstr "riochdachadh oibseict"
+
+msgid "action flag"
+msgstr "bratach a’ ghnìomha"
+
+msgid "change message"
+msgstr "teachdaireachd atharrachaidh"
+
+msgid "log entry"
+msgstr "innteart loga"
+
+msgid "log entries"
+msgstr "innteartan loga"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Chaidh “%(object)s” a chur ris."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Chaidh “%(object)s” atharrachadh - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Chaidh “%(object)s” a sguabadh às."
+
+msgid "LogEntry Object"
+msgstr "Oibseact innteart an loga"
+
+msgid "None"
+msgstr "Chan eil gin"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Cum sìos “Control” no “Command” air Mac gus iomadh nì a thaghadh."
+
+msgid "Added."
+msgstr "Chaidh a chur ris."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Chaidh %s atharrachadh."
+
+msgid "and"
+msgstr "agus"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Chaidh %(name)s “%(object)s” a chur ris."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Chaidh %(list)s atharrachadh airson %(name)s “%(object)s”."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Chaidh %(name)s “%(object)s” a sguabadh às."
+
+msgid "No fields changed."
+msgstr "Cha deach raon atharrachadh."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Chaidh %(name)s “%(obj)s” a chur ris gu soirbheachail. ’S urrainn dhut a "
+"dheasachadh a-rithist gu h-ìosal."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Chaidh %(name)s “%(obj)s” a chur ris gu soirbheachail. ’S urrainn dhut "
+"%(name)s eile a chur ris gu h-ìosal."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Chaidh %(name)s “%(obj)s” a chur ris gu soirbheachail."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Chaidh %(name)s “%(obj)s” atharrachadh gu soirbheachail. ’S urrainn dhut a "
+"dheasachadh a-rithist gu h-ìosal."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Chaidh %(name)s “%(obj)s” atharrachadh gu soirbheachail. ’S urrainn dhut "
+"%(name)s eile a chur ris gu h-ìosal."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Chaidh %(name)s “%(obj)s” atharrachadh gu soirbheachail."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Feumaidh tu nithean a thaghadh mus dèan thu gnìomh orra. Cha deach nì "
+"atharrachadh."
+
+msgid "No action selected."
+msgstr "Cha deach gnìomh a thaghadh."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Chaidh %(name)s “%(obj)s” a sguabadh às gu soirbheachail."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Chan eil oibseact %(name)s air a bheil prìomh-iuchair %(key)r ann."
+
+#, python-format
+msgid "Add %s"
+msgstr "Cuir %s ris"
+
+#, python-format
+msgid "Change %s"
+msgstr "Atharraich %s"
+
+msgid "Database error"
+msgstr "Mearachd an stòir-dhàta"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Chaidh %(count)s %(name)s atharrachadh gu soirbheachail."
+msgstr[1] "Chaidh %(count)s %(name)s atharrachadh gu soirbheachail."
+msgstr[2] "Chaidh %(count)s %(name)s atharrachadh gu soirbheachail."
+msgstr[3] "Chaidh %(count)s %(name)s atharrachadh gu soirbheachail."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Chaidh %(total_count)s a thaghadh"
+msgstr[1] "Chaidh a h-uile %(total_count)s a thaghadh"
+msgstr[2] "Chaidh a h-uile %(total_count)s a thaghadh"
+msgstr[3] "Chaidh a h-uile %(total_count)s a thaghadh"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Chaidh 0 à %(cnt)s a thaghadh"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Eachdraidh nan atharraichean: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Gus %(class_name)s %(instance)s a sguabadh às, bhiodh againn ris na h-"
+"oibseactan dàimheach dìonta seo a sguabadh às cuideachd: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Rianachd làraich Django"
+
+msgid "Django administration"
+msgstr "Rianachd Django"
+
+msgid "Site administration"
+msgstr "Rianachd na làraich"
+
+msgid "Log in"
+msgstr "Clàraich a-steach"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Rianachd %(app)s"
+
+msgid "Page not found"
+msgstr "Cha deach an duilleag a lorg"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tha sinn duilich ach cha do lorg sinn an duilleag a dh’iarr thu."
+
+msgid "Home"
+msgstr "Dhachaigh"
+
+msgid "Server error"
+msgstr "Mearachd an fhrithealaiche"
+
+msgid "Server error (500)"
+msgstr "Mearachd an fhrithealaiche (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Mearachd an fhrithealaiche <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Chaidh rudeigin cearr. Fhuair rianairean na làraich aithris air a’ phost-d "
+"agus tha sinn an dùil gun dèid a chàradh a dh’aithghearr. Mòran taing airson "
+"d’ fhoighidinn."
+
+msgid "Run the selected action"
+msgstr "Ruith an gnìomh a thagh thu"
+
+msgid "Go"
+msgstr "Siuthad"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+"Briog an-seo gus na h-oibseactan a thaghadh air feadh nan duilleagan uile"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Tagh a h-uile %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Falamhaich an taghadh"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Cuir ainm-cleachdaiche is facal-faire a-steach an toiseach. ’S urrainn dhut "
+"barrachd roghainnean a’ chleachdaiche a dheasachadh an uairsin."
+
+msgid "Enter a username and password."
+msgstr "Cuir ainm-cleachdaiche ’s facal-faire a-steach."
+
+msgid "Change password"
+msgstr "Atharraich am facal-faire"
+
+msgid "Please correct the error below."
+msgstr "Feuch an cuir thu a’ mhearachd gu h-ìosal gu ceart."
+
+msgid "Please correct the errors below."
+msgstr "Feuch an cuir thu na mearachdan gu h-ìosal gu ceart."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Cuir a-steach facal-faire ùr airson a’ chleachdaiche <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Fàilte,"
+
+msgid "View site"
+msgstr "Seall an làrach"
+
+msgid "Documentation"
+msgstr "Docamaideadh"
+
+msgid "Log out"
+msgstr "Clàraich a-mach"
+
+msgid "Add"
+msgstr "Cuir ris"
+
+msgid "History"
+msgstr "An eachdraidh"
+
+msgid "View on site"
+msgstr "Seall e air an làrach"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Cuir %(name)s ris"
+
+msgid "Filter"
+msgstr "Criathraich"
+
+msgid "Remove from sorting"
+msgstr "Thoir air falbh on t-seòrsachadh"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prìomhachas an t-seòrsachaidh: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Toglaich an seòrsachadh"
+
+msgid "Delete"
+msgstr "Sguab às"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, rachadh oibseactan "
+"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus "
+"na seòrsaichean de dh’oibseact seo a sguabadh às:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, bhiodh againn ris "
+"na h-oibseactan dàimheach dìonta seo a sguabadh às cuideachd:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"A bheil thu cinnteach gu bheil thu airson %(object_name)s "
+"“%(escaped_object)s” a sguabadh às? Thèid a h-uile nì dàimheach a sguabadh "
+"às cuideachd:"
+
+msgid "Objects"
+msgstr "Oibseactan"
+
+msgid "Yes, I'm sure"
+msgstr "Tha, tha mi cinnteach"
+
+msgid "No, take me back"
+msgstr "Chan eil, air ais leam"
+
+msgid "Delete multiple objects"
+msgstr "Sguab às iomadh oibseact"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, rachadh oibseactan "
+"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus "
+"na seòrsaichean de dh’oibseact seo a sguabadh às:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, bhiodh againn ris na h-"
+"oibseactan dàimheach dìonta seo a sguabadh às cuideachd:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"A bheil thu cinnteach gu bheil thu airson a’ %(objects_name)s a thagh thu a "
+"sguabadh às? Thèid a h-uile oibseact seo ’s na nithean dàimheach aca a "
+"sguabadh às:"
+
+msgid "Change"
+msgstr "Atharraich"
+
+msgid "Remove"
+msgstr "Thoir air falbh"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Cuir %(verbose_name)s eile ris"
+
+msgid "Delete?"
+msgstr "A bheil thu airson a sguabadh às?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " le %(filter_title)s "
+
+msgid "Summary"
+msgstr "Gearr-chunntas"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modailean ann an aplacaid %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Chan eil cead agad gus dad a dheasachadh."
+
+msgid "Recent Actions"
+msgstr "Gnìomhan o chionn goirid"
+
+msgid "My Actions"
+msgstr "Na gnìomhan agam"
+
+msgid "None available"
+msgstr "Chan eil gin ann"
+
+msgid "Unknown content"
+msgstr "Susbaint nach aithne dhuinn"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Chaidh rudeigin cearr le stàladh an stòir-dhàta agad. Dèan cinnteach gun "
+"deach na clàran stòir-dhàta iomchaidh a chruthachadh agus gur urrainn dhan "
+"chleachdaiche iomchaidh an stòr-dàta a leughadh."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Chaidh do dhearbhadh mar %(username)s ach chan eil ùghdarras agad gus an "
+"duilleag seo inntrigeadh. Am bu toigh leat clàradh a-steach le cunntas eile?"
+
+msgid "Forgotten your password or username?"
+msgstr ""
+"An do dhìochuimhnich thu am facal-faire no an t-ainm-cleachdaiche agad?"
+
+msgid "Date/time"
+msgstr "Ceann-là ’s àm"
+
+msgid "User"
+msgstr "Cleachdaiche"
+
+msgid "Action"
+msgstr "Gnìomh"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Chan eil eachdraidh nan atharraichean aig an oibseact seo. Dh’fhaoidte nach "
+"deach a chur ris leis an làrach rianachd seo."
+
+msgid "Show all"
+msgstr "Seall na h-uile"
+
+msgid "Save"
+msgstr "Sàbhail"
+
+msgid "Popup closing..."
+msgstr "Tha a’ phriob-uinneag ’ga dùnadh…"
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Atharraich a’ %(model)s a thagh thu"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Cuir %(model)s eile ris"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Sguab às a’ %(model)s a thagh thu"
+
+msgid "Search"
+msgstr "Lorg"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s toradh"
+msgstr[1] "%(counter)s thoradh"
+msgstr[2] "%(counter)s toraidhean"
+msgstr[3] "%(counter)s toradh"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s gu h-iomlan"
+
+msgid "Save as new"
+msgstr "Sàbhail mar fhear ùr"
+
+msgid "Save and add another"
+msgstr "Sàbhail is cuir fear eile ris"
+
+msgid "Save and continue editing"
+msgstr "Sàbhail is deasaich a-rithist"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"Mòran taing gun do chuir thu seachad deagh-àm air an làrach-lìn an-diugh."
+
+msgid "Log in again"
+msgstr "Clàraich a-steach a-rithist"
+
+msgid "Password change"
+msgstr "Atharrachadh an facail-fhaire"
+
+msgid "Your password was changed."
+msgstr "Chaidh am facal-faire agad atharrachadh."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Cuir a-steach an seann fhacal-faire agad ri linn tèarainteachd agus cuir a-"
+"steach am facal-faire ùr agad dà thuras an uairsin ach an dearbhaich sinn "
+"nach do rinn thu mearachd sgrìobhaidh."
+
+msgid "Change my password"
+msgstr "Atharraich am facal-faire agam"
+
+msgid "Password reset"
+msgstr "Ath-shuidheachadh an fhacail-fhaire"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Chaidh am facal-faire agad a shuidheachadh. Faodaidh tu clàradh a-steach a-"
+"nis."
+
+msgid "Password reset confirmation"
+msgstr "Dearbhadh air ath-shuidheachadh an fhacail-fhaire"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Cuir a-steach am facal-faire ùr agad dà thuras ach an dearbhaich sinn nach "
+"do rinn thu mearachd sgrìobhaidh."
+
+msgid "New password:"
+msgstr "Am facal-faire ùr:"
+
+msgid "Confirm password:"
+msgstr "Dearbhaich am facal-faire:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Bha an ceangal gus am facal-faire ath-suidheachadh mì-dhligheach; ’s dòcha "
+"gun deach a chleachdadh mar-thà. Iarr ath-shuidheachadh an fhacail-fhaire às "
+"ùr."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Chuir sinn stiùireadh thugad air mar a dh’ath-shuidhicheas tu am facal-faire "
+"agad air a’ phost-d dhan chunntas puist-d a chuir thu a-steach. Bu chòir "
+"dhut fhaighinn a dh’aithghearr."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Mura faigh thu post-d, dèan cinnteach gun do chuir thu an-steach an seòladh "
+"puist-d leis an do chlàraich thu agus thoir sùil air pasgan an spama agad."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Fhuair thu am post-d seo air sgàth ’s gun do dh’iarr thu ath-shuidheachadh "
+"an fhacail-fhaire agad airson a’ chunntais cleachdaiche agad air "
+"%(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Tadhail air an duilleag seo is tagh facal-faire ùr:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+"Seo an t-ainm-cleachdaiche agad air eagal ’s gun do dhìochuimhnich thu e:"
+
+msgid "Thanks for using our site!"
+msgstr "Mòran taing airson an làrach againn a chleachdadh!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Sgioba %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Na dhìochuimhnich thu am facal-faire agad? Cuir a-steach an seòladh puist-d "
+"agad gu h-ìosal agus cuiridh sinn stiùireadh thugad gus fear ùr a "
+"shuidheachadh air a’ phost-d."
+
+msgid "Email address:"
+msgstr "Seòladh puist-d:"
+
+msgid "Reset my password"
+msgstr "Ath-shuidhich am facal-faire agam"
+
+msgid "All dates"
+msgstr "A h-uile ceann-là"
+
+#, python-format
+msgid "Select %s"
+msgstr "Tagh %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Tagh %s gus atharrachadh"
+
+msgid "Date:"
+msgstr "Ceann-là:"
+
+msgid "Time:"
+msgstr "Àm:"
+
+msgid "Lookup"
+msgstr "Lorg"
+
+msgid "Currently:"
+msgstr "An-dràsta:"
+
+msgid "Change:"
+msgstr "Atharrachadh:"
diff --git a/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..188d500
--- /dev/null
+++ b/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..ff8b746
--- /dev/null
+++ b/tbc/static/admin/locale/gd/LC_MESSAGES/djangojs.po
@@ -0,0 +1,183 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# GunChleoc, 2015
+# GunChleoc, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-26 20:06+0000\n"
+"Last-Translator: GunChleoc\n"
+"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/"
+"language/gd/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gd\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s ri am faighinn"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Seo liosta de %s a tha ri am faighinn. Gus feadhainn a thaghadh, tagh iad sa "
+"bhogsa gu h-ìosal agus briog air an t-saighead “Tagh” eadar an dà bhogsa an "
+"uair sin."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Sgrìobh sa bhogsa seo gus an liosta de %s ri am faighinn a chriathradh."
+
+msgid "Filter"
+msgstr "Criathraich"
+
+msgid "Choose all"
+msgstr "Tagh na h-uile"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Briog gus a h-uile %s a thaghadh aig an aon àm."
+
+msgid "Choose"
+msgstr "Tagh"
+
+msgid "Remove"
+msgstr "Thoir air falbh"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s a chaidh a thaghadh"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Seo liosta de %s a chaidh a thaghadh. Gus feadhainn a thoirt air falbh, tagh "
+"iad sa bhogsa gu h-ìosal agus briog air an t-saighead “Thoir air falbh” "
+"eadar an dà bhogsa an uair sin."
+
+msgid "Remove all"
+msgstr "Thoir air falbh na h-uile"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Briog gus a h-uile %s a chaidh a thaghadh a thoirt air falbh."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Chaidh %(sel)s à %(cnt)s a thaghadh"
+msgstr[1] "Chaidh %(sel)s à %(cnt)s a thaghadh"
+msgstr[2] "Chaidh %(sel)s à %(cnt)s a thaghadh"
+msgstr[3] "Chaidh %(sel)s à %(cnt)s a thaghadh"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tha atharraichean gun sàbhaladh agad ann an raon no dhà fa leth a ghabhas "
+"deasachadh. Ma ruitheas tu gnìomh, thèid na dh’atharraich thu gun a "
+"shàbhaladh air chall."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Thagh thu gnìomh ach cha do shàbhail thu na dh’atharraich thu ann an "
+"raointean fa leth. Briog air “Ceart ma-thà” gus seo a shàbhaladh. Feumaidh "
+"tu an gnìomh a ruith a-rithist."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Thagh thu gnìomh agus cha do rinn thu atharrachadh air ran fa leth sam bith. "
+"’S dòcha gu bheil thu airson am putan “Siuthad” a chleachdadh seach am putan "
+"“Sàbhail”."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche."
+msgstr[1] ""
+"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche."
+msgstr[2] ""
+"An aire: Tha thu %s uairean a thìde air thoiseach àm an fhrithealaiche."
+msgstr[3] ""
+"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche."
+msgstr[1] ""
+"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche."
+msgstr[2] ""
+"An aire: Tha thu %s uairean a thìde air dheireadh àm an fhrithealaiche."
+msgstr[3] ""
+"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche."
+
+msgid "Now"
+msgstr "An-dràsta"
+
+msgid "Choose a Time"
+msgstr "Tagh àm"
+
+msgid "Choose a time"
+msgstr "Tagh àm"
+
+msgid "Midnight"
+msgstr "Meadhan-oidhche"
+
+msgid "6 a.m."
+msgstr "6m"
+
+msgid "Noon"
+msgstr "Meadhan-latha"
+
+msgid "6 p.m."
+msgstr "6f"
+
+msgid "Cancel"
+msgstr "Sguir dheth"
+
+msgid "Today"
+msgstr "An-diugh"
+
+msgid "Choose a Date"
+msgstr "Tagh ceann-là"
+
+msgid "Yesterday"
+msgstr "An-dè"
+
+msgid "Tomorrow"
+msgstr "A-màireach"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Faoilleach Gearran Màirt Giblean Cèitean Ògmhios Iuchar Lùnastal Sultain "
+"Dàmhair Samhain Dùbhlachd"
+
+msgid "S M T W T F S"
+msgstr "D L M C D A S"
+
+msgid "Show"
+msgstr "Seall"
+
+msgid "Hide"
+msgstr "Falaich"
diff --git a/tbc/static/admin/locale/gl/LC_MESSAGES/django.mo b/tbc/static/admin/locale/gl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0b52a66
--- /dev/null
+++ b/tbc/static/admin/locale/gl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/gl/LC_MESSAGES/django.po b/tbc/static/admin/locale/gl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1764a7f
--- /dev/null
+++ b/tbc/static/admin/locale/gl/LC_MESSAGES/django.po
@@ -0,0 +1,677 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# fasouto <fsoutomoure@gmail.com>, 2011-2012
+# fonso <fonzzo@gmail.com>, 2011,2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Leandro Regueiro <leandro.regueiro@gmail.com>, 2013
+# Oscar Carballal <oscar.carballal@gmail.com>, 2011-2012
+# Pablo, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Galician (http://www.transifex.com/django/django/language/"
+"gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Borrado exitosamente %(count)d %(items)s"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Non foi posíbel eliminar %(name)s"
+
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Borrar %(verbose_name_plural)s seleccionados."
+
+msgid "Administration"
+msgstr "Administración"
+
+msgid "All"
+msgstr "Todo"
+
+msgid "Yes"
+msgstr "Si"
+
+msgid "No"
+msgstr "Non"
+
+msgid "Unknown"
+msgstr "Descoñecido"
+
+msgid "Any date"
+msgstr "Calquera data"
+
+msgid "Today"
+msgstr "Hoxe"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+msgid "This month"
+msgstr "Este mes"
+
+msgid "This year"
+msgstr "Este ano"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor, insira os %(username)s e contrasinal dunha conta de persoal. Teña "
+"en conta que ambos os dous campos distingues maiúsculas e minúsculas."
+
+msgid "Action:"
+msgstr "Acción:"
+
+msgid "action time"
+msgstr "hora da acción"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id do obxecto"
+
+msgid "object repr"
+msgstr "repr do obxecto"
+
+msgid "action flag"
+msgstr "código do tipo de acción"
+
+msgid "change message"
+msgstr "cambiar mensaxe"
+
+msgid "log entry"
+msgstr "entrada de rexistro"
+
+msgid "log entries"
+msgstr "entradas de rexistro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Engadido \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Modificados \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Borrados \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Obxecto LogEntry"
+
+msgid "None"
+msgstr "Ningún"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado(s) %s."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Engadido %(name)s \"%(object)s\""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificáronse %(list)s en %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Elimináronse %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Non se modificou ningún campo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\" Pode editalo embaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"O/a %(name)s \"%(obj)s\" foi engadido correctamente. Pode engadir outro/a "
+"%(name)s embaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"O/a %(name)s \"%(obj)s\" foi modificado correctamente. Pode editalo de novo "
+"embaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"O/a %(name)s \"%(obj)s\" for modificalo correctamente. Pode engadir outro/a "
+"%(name)s embaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Modificouse correctamente o/a %(name)s \"%(obj)s\"."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Deb seleccionar ítems para poder facer accións con eles. Ningún ítem foi "
+"cambiado."
+
+msgid "No action selected."
+msgstr "Non se elixiu ningunha acción."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Eliminouse correctamente o/a %(name)s \"%(obj)s\"."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "O obxecto %(name)s con primary key %(key)r non existe."
+
+#, python-format
+msgid "Add %s"
+msgstr "Engadir %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Erro da base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s foi cambiado satisfactoriamente."
+msgstr[1] "%(count)s %(name)s foron cambiados satisfactoriamente."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seleccionado."
+msgstr[1] "Tódolos %(total_count)s seleccionados."
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s seleccionados."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de cambios: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Administración de sitio Django"
+
+msgid "Django administration"
+msgstr "Administración de Django"
+
+msgid "Site administration"
+msgstr "Administración do sitio"
+
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Páxina non atopada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sentímolo, pero non se atopou a páxina solicitada."
+
+msgid "Home"
+msgstr "Inicio"
+
+msgid "Server error"
+msgstr "Erro no servidor"
+
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro no servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ocorreu un erro. Os administradores do sitio foron informados por email e "
+"debería ser arranxado pronto. Grazas pola súa paciencia."
+
+msgid "Run the selected action"
+msgstr "Executar a acción seleccionada"
+
+msgid "Go"
+msgstr "Ir"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Fai clic aquí para seleccionar os obxectos en tódalas páxinas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleccionar todos os %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Limpar selección"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primeiro insira un nome de usuario e un contrasinal. Despois poderá editar "
+"máis opcións de usuario."
+
+msgid "Enter a username and password."
+msgstr "Introduza un nome de usuario e contrasinal."
+
+msgid "Change password"
+msgstr "Cambiar contrasinal"
+
+msgid "Please correct the error below."
+msgstr "Corrixa os erros de embaixo."
+
+msgid "Please correct the errors below."
+msgstr "Por favor, corrixa os erros de embaixo"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Insira un novo contrasinal para o usuario <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Benvido,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Documentación"
+
+msgid "Log out"
+msgstr "Rematar sesión"
+
+msgid "Add"
+msgstr "Engadir"
+
+msgid "History"
+msgstr "Historial"
+
+msgid "View on site"
+msgstr "Ver no sitio"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Engadir %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Eliminar da clasificación"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridade de clasificación: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Activar clasificación"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Borrar o %(object_name)s '%(escaped_object)s' resultaría na eliminación de "
+"elementos relacionados, pero a súa conta non ten permiso para borrar os "
+"seguintes tipos de elementos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Para borrar o obxecto %(object_name)s '%(escaped_object)s' requiriríase "
+"borrar os seguintes obxectos protexidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Seguro que quere borrar o %(object_name)s \"%(escaped_object)s\"? "
+"Eliminaranse os seguintes obxectos relacionados:"
+
+msgid "Objects"
+msgstr "Obxectos"
+
+msgid "Yes, I'm sure"
+msgstr "Si, estou seguro"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Eliminar múltiples obxectos"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Borrar os obxectos %(objects_name)s seleccionados resultaría na eliminación "
+"de obxectos relacionados, pero a súa conta non ten permiso para borrar os "
+"seguintes tipos de obxecto:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Para borrar os obxectos %(objects_name)s relacionados requiriríase eliminar "
+"os seguintes obxectos protexidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Está seguro de que quere borrar os obxectos %(objects_name)s seleccionados? "
+"Serán eliminados todos os seguintes obxectos e elementos relacionados on "
+"eles:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Retirar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Engadir outro %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "¿Eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos na aplicación %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Non ten permiso para editar nada."
+
+msgid "Recent Actions"
+msgstr "Accións recentes"
+
+msgid "My Actions"
+msgstr "As miñas accións"
+
+msgid "None available"
+msgstr "Ningunha dispoñíbel"
+
+msgid "Unknown content"
+msgstr "Contido descoñecido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hai un problema coa súa instalación de base de datos. Asegúrese de que se "
+"creasen as táboas axeitadas na base de datos, e de que o usuario apropiado "
+"teña permisos para lela."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "¿Olvidou o usuario ou contrasinal?"
+
+msgid "Date/time"
+msgstr "Data/hora"
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Action"
+msgstr "Acción"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este obxecto non ten histórico de cambios. Posibelmente non se creou usando "
+"este sitio de administración."
+
+msgid "Show all"
+msgstr "Amosar todo"
+
+msgid "Save"
+msgstr "Gardar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Engadir outro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Busca"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado. "
+msgstr[1] "%(counter)s resultados."
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s en total"
+
+msgid "Save as new"
+msgstr "Gardar como novo"
+
+msgid "Save and add another"
+msgstr "Gardar e engadir outro"
+
+msgid "Save and continue editing"
+msgstr "Gardar e seguir modificando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazas polo tempo que dedicou ao sitio web."
+
+msgid "Log in again"
+msgstr "Entrar de novo"
+
+msgid "Password change"
+msgstr "Cambiar o contrasinal"
+
+msgid "Your password was changed."
+msgstr "Cambiouse o seu contrasinal."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por razóns de seguridade, introduza o contrasinal actual. Despois introduza "
+"dúas veces o contrasinal para verificarmos que o escribiu correctamente."
+
+msgid "Change my password"
+msgstr "Cambiar o contrasinal"
+
+msgid "Password reset"
+msgstr "Recuperar o contrasinal"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"A túa clave foi gardada.\n"
+"Xa podes entrar."
+
+msgid "Password reset confirmation"
+msgstr "Confirmación de reseteo da contrasinal"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor insira a súa contrasinal dúas veces para que podamos verificar se "
+"a escribiu correctamente."
+
+msgid "New password:"
+msgstr "Contrasinal novo:"
+
+msgid "Confirm password:"
+msgstr "Confirmar contrasinal:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"A ligazón de reseteo da contrasinal non é válida, posiblemente porque xa foi "
+"usada. Por favor pida un novo reseteo da contrasinal."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Recibe este email porque solicitou restablecer o contrasinal para a súa "
+"conta de usuario en %(site_name)s"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Por favor vaia á seguinte páxina e elixa una nova contrasinal:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "No caso de que o esquecese, o seu nome de usuario é:"
+
+msgid "Thanks for using our site!"
+msgstr "Grazas por usar o noso sitio web!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "O equipo de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Esqueceu o contrasinal? Insira o seu enderezo de email embaixo e "
+"enviarémoslle as instrucións para configurar un novo."
+
+msgid "Email address:"
+msgstr "Enderezo de correo electrónico:"
+
+msgid "Reset my password"
+msgstr "Recuperar o meu contrasinal"
+
+msgid "All dates"
+msgstr "Todas as datas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione un/unha %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s que modificar"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Procurar"
+
+msgid "Currently:"
+msgstr "Actualmente:"
+
+msgid "Change:"
+msgstr "Modificar:"
diff --git a/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b6548eb
--- /dev/null
+++ b/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..7b7f050
--- /dev/null
+++ b/tbc/static/admin/locale/gl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,167 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# fasouto <fsoutomoure@gmail.com>, 2011
+# fonso <fonzzo@gmail.com>, 2011,2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Leandro Regueiro <leandro.regueiro@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Galician (http://www.transifex.com/django/django/language/"
+"gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s dispoñíbeis"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta é unha lista de %s dispoñíbeis. Pode escoller algúns seleccionándoos na "
+"caixa inferior e a continuación facendo clic na frecha \"Escoller\" situada "
+"entre as dúas caixas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Escriba nesta caixa para filtrar a lista de %s dispoñíbeis."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Escoller todo"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Prema para escoller todos/as os/as '%s' dunha vez."
+
+msgid "Choose"
+msgstr "Escoller"
+
+msgid "Remove"
+msgstr "Retirar"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s escollido/a(s)"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta é a lista de %s escollidos/as. Pode eliminar algúns seleccionándoos na "
+"caixa inferior e a continuación facendo clic na frecha \"Eliminar\" situada "
+"entre as dúas caixas."
+
+msgid "Remove all"
+msgstr "Retirar todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Faga clic para eliminar da lista todos/as os/as '%s' escollidos/as."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s escollido"
+msgstr[1] "%(sel)s de %(cnt)s escollidos"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tes cambios sen guardar en campos editables individuales. Se executas unha "
+"acción, os cambios non gardados perderanse."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Escolleu unha acción, pero aínda non gardou os cambios nos campos "
+"individuais. Prema OK para gardar. Despois terá que volver executar a acción."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Escolleu unha acción, pero aínda non gardou os cambios nos campos "
+"individuais. Probabelmente estea buscando o botón Ir no canto do botón "
+"Gardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Agora"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Escolla unha hora"
+
+msgid "Midnight"
+msgstr "Medianoite"
+
+msgid "6 a.m."
+msgstr "6 da mañá"
+
+msgid "Noon"
+msgstr "Mediodía"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoxe"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Onte"
+
+msgid "Tomorrow"
+msgstr "Mañá"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"xaneiro febreiro marzo abril maio xuño xullo agosto setembro outubro "
+"novembro decembro"
+
+msgid "S M T W T F S"
+msgstr "D L M M X V S"
+
+msgid "Show"
+msgstr "Amosar"
+
+msgid "Hide"
+msgstr "Esconder"
diff --git a/tbc/static/admin/locale/he/LC_MESSAGES/django.mo b/tbc/static/admin/locale/he/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..cc09db9
--- /dev/null
+++ b/tbc/static/admin/locale/he/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/he/LC_MESSAGES/django.po b/tbc/static/admin/locale/he/LC_MESSAGES/django.po
new file mode 100644
index 0000000..33d1b91
--- /dev/null
+++ b/tbc/static/admin/locale/he/LC_MESSAGES/django.po
@@ -0,0 +1,664 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Alex Gaynor <alex.gaynor@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Meir Kriheli <mkriheli@gmail.com>, 2011-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-28 16:13+0000\n"
+"Last-Translator: Meir Kriheli <mkriheli@gmail.com>\n"
+"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s נמחקו בהצלחה."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "לא ניתן למחוק %(name)s"
+
+msgid "Are you sure?"
+msgstr "האם את/ה בטוח/ה ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "מחק %(verbose_name_plural)s שנבחרו"
+
+msgid "Administration"
+msgstr "ניהול"
+
+msgid "All"
+msgstr "הכל"
+
+msgid "Yes"
+msgstr "כן"
+
+msgid "No"
+msgstr "לא"
+
+msgid "Unknown"
+msgstr "לא ידוע"
+
+msgid "Any date"
+msgstr "כל תאריך"
+
+msgid "Today"
+msgstr "היום"
+
+msgid "Past 7 days"
+msgstr "בשבוע האחרון"
+
+msgid "This month"
+msgstr "החודש"
+
+msgid "This year"
+msgstr "השנה"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"נא להזין את %(username)s והסיסמה הנכונים לחשבון איש צוות. נא לשים לב כי שני "
+"השדות רגישים לאותיות גדולות/קטנות."
+
+msgid "Action:"
+msgstr "פעולה"
+
+msgid "action time"
+msgstr "זמן פעולה"
+
+msgid "user"
+msgstr "משתמש"
+
+msgid "content type"
+msgstr "סוג תוכן"
+
+msgid "object id"
+msgstr "מזהה אובייקט"
+
+msgid "object repr"
+msgstr "ייצוג אובייקט"
+
+msgid "action flag"
+msgstr "דגל פעולה"
+
+msgid "change message"
+msgstr "הערה לשינוי"
+
+msgid "log entry"
+msgstr "רישום יומן"
+
+msgid "log entries"
+msgstr "רישומי יומן"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "בוצעה הוספת \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "בוצע שינוי \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "בוצעה מחיקת \"%(object)s\"."
+
+msgid "LogEntry Object"
+msgstr "אובייקט LogEntry"
+
+msgid "None"
+msgstr "ללא"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"יש להחזיק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד."
+
+msgid "Added."
+msgstr "נוסף."
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s שונה."
+
+msgid "and"
+msgstr "ו"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "בוצעה הוספת %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "בוצע שינוי %(list)s עבור %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "בוצעה מחיקת %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "אף שדה לא השתנה."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן לערוך אותו שוב מתחת."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן להוסיף עוד %(name)s מתחת."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "עדכון %(name)s \"%(obj)s\" בוצע בהצלחה. ניתן לערוך שוב מתחת."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "עדכון %(name)s \"%(obj)s\" בוצע בהצלחה. ניתן להוסיף עוד %(name)s מתחת."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "יש לסמן פריטים כדי לבצע עליהם פעולות. לא שונו פריטים."
+
+msgid "No action selected."
+msgstr "לא נבחרה פעולה."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "הפריט %(name)s עם המפתח הראשי %(key)r אינו קיים."
+
+#, python-format
+msgid "Add %s"
+msgstr "הוספת %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "שינוי %s"
+
+msgid "Database error"
+msgstr "שגיאת בסיס נתונים"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "שינוי %(count)s %(name)s בוצע בהצלחה."
+msgstr[1] "שינוי %(count)s %(name)s בוצע בהצלחה."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s נבחר"
+msgstr[1] "כל ה־%(total_count)s נבחרו"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 מ %(cnt)s נבחרים"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "היסטוריית שינוי: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"מחיקת %(class_name)s %(instance)s תדרוש מחיקת האובייקטים הקשורים והמוגנים "
+"הבאים: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "ניהול אתר Django"
+
+msgid "Django administration"
+msgstr "ניהול Django"
+
+msgid "Site administration"
+msgstr "ניהול אתר"
+
+msgid "Log in"
+msgstr "כניסה"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "ניהול %(app)s"
+
+msgid "Page not found"
+msgstr "דף לא קיים"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש."
+
+msgid "Home"
+msgstr "דף הבית"
+
+msgid "Server error"
+msgstr "שגיאת שרת"
+
+msgid "Server error (500)"
+msgstr "שגיאת שרת (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "שגיאת שרת <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך."
+
+msgid "Run the selected action"
+msgstr "הפעל את הפעולה שבחרת בה."
+
+msgid "Go"
+msgstr "בצע"
+
+msgid "Click here to select the objects across all pages"
+msgstr "לחיצה כאן תבחר את האובייקטים בכל העמודים"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "בחירת כל %(total_count)s ה־%(module_name)s"
+
+msgid "Clear selection"
+msgstr "איפוס בחירה"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ראשית יש להזין שם משתמש וסיסמה. לאחר מכן יהיה ביכולתך לערוך אפשרויות נוספות "
+"עבור המשתמש."
+
+msgid "Enter a username and password."
+msgstr "נא לשים שם משתמש וסיסמה."
+
+msgid "Change password"
+msgstr "שינוי סיסמה"
+
+msgid "Please correct the error below."
+msgstr "נא לתקן את השגיאות המופיעות מתחת."
+
+msgid "Please correct the errors below."
+msgstr "נא לתקן את השגיאות מתחת."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "יש להזין סיסמה חדשה עבור המשתמש <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "שלום,"
+
+msgid "View site"
+msgstr "צפיה באתר"
+
+msgid "Documentation"
+msgstr "תיעוד"
+
+msgid "Log out"
+msgstr "יציאה"
+
+msgid "Add"
+msgstr "הוספה"
+
+msgid "History"
+msgstr "היסטוריה"
+
+msgid "View on site"
+msgstr "צפיה באתר"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "הוספת %(name)s"
+
+msgid "Filter"
+msgstr "סינון"
+
+msgid "Remove from sorting"
+msgstr "הסרה ממיון"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "עדיפות מיון: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "החלף כיוון מיון"
+
+msgid "Delete"
+msgstr "מחיקה"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"מחיקת %(object_name)s '%(escaped_object)s' מצריכה מחיקת אובייקטים מקושרים, "
+"אך לחשבון שלך אין הרשאות למחיקת סוגי האובייקטים הבאים:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"מחיקת ה%(object_name)s '%(escaped_object)s' תדרוש מחיקת האובייקטים הקשורים "
+"והמוגנים הבאים:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"האם ברצונך למחוק את %(object_name)s \"%(escaped_object)s\"? כל הפריטים "
+"הקשורים הבאים יימחקו:"
+
+msgid "Objects"
+msgstr "אובייקטים"
+
+msgid "Yes, I'm sure"
+msgstr "כן, אני בטוח/ה"
+
+msgid "No, take me back"
+msgstr "לא, קח אותי חזרה."
+
+msgid "Delete multiple objects"
+msgstr "מחק כמה פריטים"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"מחיקת ב%(objects_name)s הנבחרת תביא במחיקת אובייקטים קשורים, אבל החשבון שלך "
+"אינו הרשאה למחוק את הסוגים הבאים של אובייקטים:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"מחיקת ה%(objects_name)s אשר סימנת תדרוש מחיקת האובייקטים הקשורים והמוגנים "
+"הבאים:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"האם אתה בטוח שאתה רוצה למחוק את ה%(objects_name)s הנבחר? כל האובייקטים הבאים "
+"ופריטים הקשורים להם יימחקו:"
+
+msgid "Change"
+msgstr "שינוי"
+
+msgid "Remove"
+msgstr "להסיר"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "הוספת %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "מחיקה ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " לפי %(filter_title)s "
+
+msgid "Summary"
+msgstr "סיכום"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "מודלים ביישום %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "אין לך הרשאות לעריכה."
+
+msgid "Recent Actions"
+msgstr "פעולות אחרונות"
+
+msgid "My Actions"
+msgstr "הפעולות שלי"
+
+msgid "None available"
+msgstr "לא נמצאו"
+
+msgid "Unknown content"
+msgstr "תוכן לא ידוע"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים "
+"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"התחברת בתור %(username)s, אך אין לך הרשאות גישה לעמוד זה. האם ברצונך להתחבר "
+"בתור משתמש אחר?"
+
+msgid "Forgotten your password or username?"
+msgstr "שכחת את שם המשתמש והסיסמה שלך ?"
+
+msgid "Date/time"
+msgstr "תאריך/שעה"
+
+msgid "User"
+msgstr "משתמש"
+
+msgid "Action"
+msgstr "פעולה"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו."
+
+msgid "Show all"
+msgstr "הצג הכל"
+
+msgid "Save"
+msgstr "שמירה"
+
+msgid "Popup closing..."
+msgstr "חלון צץ נסגר..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "שינוי %(model)s הנבחר."
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "הוספת %(model)s נוסף."
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "מחיקת %(model)s הנבחר."
+
+msgid "Search"
+msgstr "חיפוש"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "תוצאה %(counter)s"
+msgstr[1] "%(counter)s תוצאות"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s סה\"כ"
+
+msgid "Save as new"
+msgstr "שמירה כחדש"
+
+msgid "Save and add another"
+msgstr "שמירה והוספת אחר"
+
+msgid "Save and continue editing"
+msgstr "שמירה והמשך עריכה"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "תודה על בילוי זמן איכות עם האתר."
+
+msgid "Log in again"
+msgstr "התחבר/י שוב"
+
+msgid "Password change"
+msgstr "שינוי סיסמה"
+
+msgid "Your password was changed."
+msgstr "סיסמתך שונתה."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"נא להזין את סיסמתך הישנה, לצרכי אבטחה, ולאחר מכן את סיסמתך החדשה פעמיים כדי "
+"שנוכל לוודא שהקלדת אותה כראוי."
+
+msgid "Change my password"
+msgstr "שנה את סיסמתי"
+
+msgid "Password reset"
+msgstr "איפוס סיסמה"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "ססמתך נשמרה. כעת ניתן להתחבר."
+
+msgid "Password reset confirmation"
+msgstr "אימות איפוס סיסמה"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "נא להזין את סיסמתך החדשה פעמיים כדי שנוכל לוודא שהקלדת אותה כראוי."
+
+msgid "New password:"
+msgstr "סיסמה חדשה:"
+
+msgid "Confirm password:"
+msgstr "אימות סיסמה:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"הקישור לאיפוס הסיסמה אינו חוקי. ייתכן והשתמשו בו כבר. נא לבקש איפוס סיסמה "
+"חדש."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"שלחנו אליך דואר אלקטרוני עם הוראות לקביעת הסיסמה, אם קיים חשבון עם כתובת "
+"הדואר שהזנת. ההודעה אמור להגיע בקרוב."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"אם הדוא\"ל לא הגיע, נא לוודא שהזנת כתובת נכונה בעת הרישום ולבדוק את תיקיית "
+"דואר הזבל."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"הודעה זו נשלחה אליך עקב בקשתך לאיפוס הסיסמה עבור המשתמש שלך באתר "
+"%(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "שם המשתמש שלך, במקרה ששכחת:"
+
+msgid "Thanks for using our site!"
+msgstr "תודה על השימוש באתר שלנו!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "צוות %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"שכחת את סיסמתך ? נא להזין את כתובת הדוא\"ל מתחת, ואנו נשלח הוראות לקביעת "
+"סיסמה חדשה."
+
+msgid "Email address:"
+msgstr "כתובת דוא\"ל:"
+
+msgid "Reset my password"
+msgstr "אפס את סיסמתי"
+
+msgid "All dates"
+msgstr "כל התאריכים"
+
+#, python-format
+msgid "Select %s"
+msgstr "בחירת %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "בחירת %s לשינוי"
+
+msgid "Date:"
+msgstr "תאריך:"
+
+msgid "Time:"
+msgstr "שעה:"
+
+msgid "Lookup"
+msgstr "חפש"
+
+msgid "Currently:"
+msgstr "נוכחי:"
+
+msgid "Change:"
+msgstr "שינוי:"
diff --git a/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..168794c
--- /dev/null
+++ b/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..1113582
--- /dev/null
+++ b/tbc/static/admin/locale/he/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Alex Gaynor <alex.gaynor@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Meir Kriheli <mkriheli@gmail.com>, 2011-2012,2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-28 16:18+0000\n"
+"Last-Translator: Meir Kriheli <mkriheli@gmail.com>\n"
+"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s זמינות"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"זו רשימת %s הזמינים לבחירה. ניתן לבחור חלק ע\"י סימון בתיבה מתחת ולחיצה על "
+"חץ \"בחר\" בין שתי התיבות."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "ניתן להקליד בתיבה זו כדי לסנן %s."
+
+msgid "Filter"
+msgstr "סינון"
+
+msgid "Choose all"
+msgstr "בחירת הכל"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "בחירת כל ה%s בבת אחת."
+
+msgid "Choose"
+msgstr "בחר"
+
+msgid "Remove"
+msgstr "הסרה"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s אשר נבחרו"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"זו רשימת %s אשר נבחרו. ניתן להסיר חלק ע\"י בחירה בתיבה מתחת ולחיצה על חץ "
+"\"הסרה\" בין שתי התיבות."
+
+msgid "Remove all"
+msgstr "הסרת הכל"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "הסרת כל %s אשר נבחרו בבת אחת."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s מ %(cnt)s נבחרות"
+msgstr[1] "%(sel)s מ %(cnt)s נבחרות"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"יש לך שינויים שלא נשמרו על שדות יחידות. אם אתה מפעיל פעולה, שינויים שלא "
+"נשמרו יאבדו."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"בחרת פעולה, אבל עוד לא שמרת את השינויים לשדות בודדים. אנא לחץ על אישור כדי "
+"לשמור. יהיה עליך להפעיל את הפעולה עוד פעם."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"בחרת פעולה, ולא עשיתה שינויימ על שדות. אתה כנראה מחפש את הכפתור ללכת במקום "
+"הכפתור לשמור."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "הערה: את/ה %s שעה לפני זמן השרת."
+msgstr[1] "הערה: את/ה %s שעות לפני זמן השרת."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "הערה: את/ה %s שעה אחרי זמן השרת."
+msgstr[1] "הערה: את/ה %s שעות אחרי זמן השרת."
+
+msgid "Now"
+msgstr "כעת"
+
+msgid "Choose a Time"
+msgstr "בחירת שעה"
+
+msgid "Choose a time"
+msgstr "בחירת שעה"
+
+msgid "Midnight"
+msgstr "חצות"
+
+msgid "6 a.m."
+msgstr "6 בבוקר"
+
+msgid "Noon"
+msgstr "12 בצהריים"
+
+msgid "6 p.m."
+msgstr "6 אחר הצהריים"
+
+msgid "Cancel"
+msgstr "ביטול"
+
+msgid "Today"
+msgstr "היום"
+
+msgid "Choose a Date"
+msgstr "בחירת תאריך"
+
+msgid "Yesterday"
+msgstr "אתמול"
+
+msgid "Tomorrow"
+msgstr "מחר"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"ינואר פברואר מרץ אפריל מאי יוני יולי אוגוסט ספטמבר אוקטובר נובמבר דצמבר"
+
+msgid "S M T W T F S"
+msgstr "א ב ג ד ה ו ש"
+
+msgid "Show"
+msgstr "הצג"
+
+msgid "Hide"
+msgstr "הסתר"
diff --git a/tbc/static/admin/locale/hi/LC_MESSAGES/django.mo b/tbc/static/admin/locale/hi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c40f833
--- /dev/null
+++ b/tbc/static/admin/locale/hi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hi/LC_MESSAGES/django.po b/tbc/static/admin/locale/hi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c1bbc5a
--- /dev/null
+++ b/tbc/static/admin/locale/hi/LC_MESSAGES/django.po
@@ -0,0 +1,665 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# alkuma <alok.kumar@gmail.com>, 2013
+# Chandan kumar <chandankumar.093047@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Pratik <kpratik217@gmail.com>, 2013
+# Sandeep Satavlekar <sandysat@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है| |"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s नहीं हटा सकते"
+
+msgid "Are you sure?"
+msgstr "क्या आप निश्चित हैं?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये "
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "सभी"
+
+msgid "Yes"
+msgstr "हाँ"
+
+msgid "No"
+msgstr "नहीं"
+
+msgid "Unknown"
+msgstr "अनजान"
+
+msgid "Any date"
+msgstr "कोई भी तारीख"
+
+msgid "Today"
+msgstr "आज"
+
+msgid "Past 7 days"
+msgstr "पिछले 7 दिन"
+
+msgid "This month"
+msgstr "इस महीने"
+
+msgid "This year"
+msgstr "इस साल"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"कृपया कर्मचारी खाते का सही %(username)s व कूटशब्द भरें। भरते समय दीर्घाक्षर और लघु अक्षर "
+"का खयाल रखें।"
+
+msgid "Action:"
+msgstr " क्रिया:"
+
+msgid "action time"
+msgstr "कार्य समय"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "वस्तु आई डी "
+
+msgid "object repr"
+msgstr "वस्तु प्रतिनिधित्व"
+
+msgid "action flag"
+msgstr "कार्य ध्वज"
+
+msgid "change message"
+msgstr "परिवर्तन सन्देश"
+
+msgid "log entry"
+msgstr "लॉग प्रविष्टि"
+
+msgid "log entries"
+msgstr "लॉग प्रविष्टियाँ"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" को जोड़ा गया."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "परिवर्तित \"%(object)s\" - %(changes)s "
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" को नष्ट कर दिया है."
+
+msgid "LogEntry Object"
+msgstr "LogEntry ऑब्जेक्ट"
+
+msgid "None"
+msgstr "कोई नहीं"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s को बदला गया हैं"
+
+msgid "and"
+msgstr "और"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" को जोडा गया हैं"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" की %(list)s बदला गया है"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" निकाला गया है"
+
+msgid "No fields changed."
+msgstr "कोई क्षेत्र नहीं बदला"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" कामयाबी से जोडा गया हैं । आप इसे फिर से संपादित कर सकते हैं"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" सफलतापूर्वक जोड़ दिया गया। आप चाहें तो नीचे एक और %(name)s "
+"जोड़ सकते हैं।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" को कामयाबी से जोडा गया है"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+" %(name)s \"%(obj)s\" सफलतापूर्वक जोड़ दिया गया। आप चाहें तो नीचे इसे बदल भी सकते हैं।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" सफलतापूर्वक बदल दिया गया। आप चाहें तो नीचे एक और %(name)s "
+"जोड़ सकते हैं।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" को कामयाबी से बदला गया हैं"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "कार्रवाई हेतु आयटम सही अनुक्रम में चुने जाने चाहिए | कोई आइटम नहीं बदले गये हैं."
+
+msgid "No action selected."
+msgstr "कोई कार्रवाई नहीं चुनी है |"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" को कामयाबी से निकाला गया है"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s नामक कोई वस्तू जिस की प्राथमिक कुंजी %(key)r हो, अस्तित्व में नहीं हैं |"
+
+#, python-format
+msgid "Add %s"
+msgstr "%s बढाएं"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s बदलो"
+
+msgid "Database error"
+msgstr "डेटाबेस त्रुटि"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |"
+msgstr[1] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s चुने"
+msgstr[1] "सभी %(total_count)s चुने "
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s में से 0 चुने"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "इतिहास बदलो: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "ज्याँगो साइट प्रशासन"
+
+msgid "Django administration"
+msgstr "ज्याँगो प्रशासन"
+
+msgid "Site administration"
+msgstr "साइट प्रशासन"
+
+msgid "Log in"
+msgstr "लॉगिन"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "पृष्ठ लापता"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "क्षमा कीजिए पर निवेदित पृष्ठ लापता है ।"
+
+msgid "Home"
+msgstr "गृह"
+
+msgid "Server error"
+msgstr "सर्वर त्रुटि"
+
+msgid "Server error (500)"
+msgstr "सर्वर त्रुटि (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "सर्वर त्रुटि <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"एक त्रुटि मिली है। इसकी जानकारी स्थल के संचालकों को डाक द्वारा दे दी गई है, और यह जल्द "
+"ठीक हो जानी चाहिए। धीरज रखने के लिए शुक्रिया।"
+
+msgid "Run the selected action"
+msgstr "चयनित कार्रवाई चलाइये"
+
+msgid "Go"
+msgstr "आगे बढ़े"
+
+msgid "Click here to select the objects across all pages"
+msgstr "सभी पृष्ठों पर मौजूद वस्तुओं को चुनने के लिए यहाँ क्लिक करें "
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "तमाम %(total_count)s %(module_name)s चुनें"
+
+msgid "Clear selection"
+msgstr "चयन खालिज किया जाये "
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"पहले प्रदवोक्ता नाम और कूटशब्द दर्ज करें । उसके पश्चात ही आप अधिक प्रवोक्ता विकल्प बदल "
+"सकते हैं ।"
+
+msgid "Enter a username and password."
+msgstr "उपयोगकर्ता का नाम और कूटशब्द दर्ज करें."
+
+msgid "Change password"
+msgstr "कूटशब्द बदलें"
+
+msgid "Please correct the error below."
+msgstr "कृपया नीचे पायी गयी गलतियाँ ठीक करें ।"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> प्रवोक्ता के लिए नयी कूटशब्द दर्ज करें ।"
+
+msgid "Welcome,"
+msgstr "आपका स्वागत है,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "दस्तावेज़ीकरण"
+
+msgid "Log out"
+msgstr "लॉग आउट"
+
+msgid "Add"
+msgstr "बढाएं"
+
+msgid "History"
+msgstr "इतिहास"
+
+msgid "View on site"
+msgstr "साइट पे देखें"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s बढाएं"
+
+msgid "Filter"
+msgstr "छन्नी"
+
+msgid "Remove from sorting"
+msgstr "श्रेणीकरण से हटाये "
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "श्रेणीकरण प्राथमिकता : %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "टॉगल श्रेणीकरण"
+
+msgid "Delete"
+msgstr "मिटाएँ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' को मिटाने पर सम्बंधित वस्तुएँ भी मिटा दी "
+"जाएगी, परन्तु आप के खाते में निम्नलिखित प्रकार की वस्तुओं को मिटाने की अनुमति नहीं हैं |"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' को हटाने के लिए उनसे संबंधित निम्नलिखित "
+"संरक्षित वस्तुओं को हटाने की आवश्यकता होगी:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"क्या आप %(object_name)s \"%(escaped_object)s\" हटाना चाहते हैं? निम्नलिखित सभी "
+"संबंधित वस्तुएँ नष्ट की जाएगी"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "हाँ, मैंने पक्का तय किया हैं "
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "अनेक वस्तुएं हटाएँ"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"चयनित %(objects_name)s हटाने पर उस से सम्बंधित वस्तुएं भी हट जाएगी, परन्तु आपके खाते में "
+"वस्तुओं के निम्नलिखित प्रकार हटाने की अनुमति नहीं है:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"चयनित %(objects_name)s को हटाने के पश्चात् निम्नलिखित संरक्षित संबंधित वस्तुओं को हटाने "
+"की आवश्यकता होगी |"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"क्या आप ने पक्का तय किया हैं की चयनित %(objects_name)s को नष्ट किया जाये ? "
+"निम्नलिखित सभी वस्तुएं और उनसे सम्बंधित वस्तुए भी नष्ट की जाएगी:"
+
+msgid "Change"
+msgstr "बदलें"
+
+msgid "Remove"
+msgstr "निकालें"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "एक और %(verbose_name)s जोड़ें "
+
+msgid "Delete?"
+msgstr "मिटाएँ ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s द्वारा"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s अनुप्रयोग के प्रतिरूप"
+
+msgid "You don't have permission to edit anything."
+msgstr "आपके पास कुछ भी संपादन करने के लिये अनुमति नहीं है ।"
+
+msgid "Recent Actions"
+msgstr "हाल क्रियाएँ"
+
+msgid "My Actions"
+msgstr "मेरे कार्य"
+
+msgid "None available"
+msgstr " कोई भी उपलब्ध नहीं"
+
+msgid "Unknown content"
+msgstr "अज्ञात सामग्री"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"अपने डेटाबेस स्थापना के साथ कुछ गलत तो है | सुनिश्चित करें कि उचित डेटाबेस तालिका बनायीं "
+"गयी है, और सुनिश्चित करें कि डेटाबेस उपयुक्त उपयोक्ता के द्वारा पठनीय है |"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "अपना पासवर्ड या उपयोगकर्ता नाम भूल गये हैं?"
+
+msgid "Date/time"
+msgstr "तिथि / समय"
+
+msgid "User"
+msgstr "उपभोक्ता"
+
+msgid "Action"
+msgstr "कार्य"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"इस वस्तु का बदलाव इतिहास नहीं है. शायद वह इस साइट व्यवस्थापक के माध्यम से नहीं जोड़ा "
+"गया है."
+
+msgid "Show all"
+msgstr "सभी दिखाएँ"
+
+msgid "Save"
+msgstr "सुरक्षित कीजिये"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "खोज"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s परिणाम"
+msgstr[1] "%(counter)s परिणाम"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s कुल परिणाम"
+
+msgid "Save as new"
+msgstr "नये सा सहेजें"
+
+msgid "Save and add another"
+msgstr "सहेजें और एक और जोडें"
+
+msgid "Save and continue editing"
+msgstr "सहेजें और संपादन करें"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "आज हमारे वेब साइट पर आने के लिए धन्यवाद ।"
+
+msgid "Log in again"
+msgstr "फिर से लॉगिन कीजिए"
+
+msgid "Password change"
+msgstr "कूटशब्द बदलें"
+
+msgid "Your password was changed."
+msgstr "आपके कूटशब्द को बदला गया है"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"सुरक्षा कारणों के लिए कृपया पुराना कूटशब्द दर्ज करें । उसके पश्चात नए कूटशब्द को दो बार दर्ज "
+"करें ताकि हम उसे सत्यापित कर सकें ।"
+
+msgid "Change my password"
+msgstr "कूटशब्द बदलें"
+
+msgid "Password reset"
+msgstr "कूटशब्द पुनस्थाप"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "आपके कूटशब्द को स्थापित किया गया है । अब आप लॉगिन कर सकते है ।"
+
+msgid "Password reset confirmation"
+msgstr "कूटशब्द पुष्टि"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "कृपया आपके नये कूटशब्द को दो बार दर्ज करें ताकि हम उसकी सत्याप्ती कर सकते है ।"
+
+msgid "New password:"
+msgstr "नया कूटशब्द "
+
+msgid "Confirm password:"
+msgstr "कूटशब्द पुष्टि कीजिए"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"कूटशब्द पुनस्थाप संपर्क अमान्य है, संभावना है कि उसे उपयोग किया गया है। कृपया फिर से कूटशब्द "
+"पुनस्थाप की आवेदन करें ।"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"अगर आपको कोई ईमेल प्राप्त नई होता है,यह ध्यान रखे की आपने सही पता रजिस्ट्रीकृत किया है "
+"और आपने स्पॅम फोल्डर को जाचे|"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"आपको यह डाक इसलिए आई है क्योंकि आप ने %(site_name)s पर अपने खाते का कूटशब्द बदलने का "
+"अनुरोध किया था |"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "कृपया निम्नलिखित पृष्ठ पर नया कूटशब्द चुनिये :"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "आपका प्रवोक्ता नाम, यदि भूल गये हों :"
+
+msgid "Thanks for using our site!"
+msgstr "हमारे साइट को उपयोग करने के लिए धन्यवाद ।"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s दल"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"कूटशब्द भूल गए? नीचे अपना डाक पता भरें, वहाँ पर हम आपको नया कूटशब्द रखने के निर्देश भेजेंगे।"
+
+msgid "Email address:"
+msgstr "डाक पता -"
+
+msgid "Reset my password"
+msgstr " मेरे कूटशब्द की पुनःस्थापना"
+
+msgid "All dates"
+msgstr "सभी तिथियों"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s चुनें"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s के बदली के लिए चयन करें"
+
+msgid "Date:"
+msgstr "तिथि:"
+
+msgid "Time:"
+msgstr "समय:"
+
+msgid "Lookup"
+msgstr "लुक अप"
+
+msgid "Currently:"
+msgstr "फ़िलहाल - "
+
+msgid "Change:"
+msgstr "बदलाव -"
diff --git a/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..723f352
--- /dev/null
+++ b/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..455b450
--- /dev/null
+++ b/tbc/static/admin/locale/hi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Chandan kumar <chandankumar.093047@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Sandeep Satavlekar <sandysat@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "उपलब्ध %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को चुन सकते हैं और "
+"उसके बाद दो बॉक्स के बीच \"चुनें\" तीर पर क्लिक करें."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "इस बॉक्स में टाइप करने के लिए नीचे उपलब्ध %s की सूची को फ़िल्टर करें."
+
+msgid "Filter"
+msgstr "छानना"
+
+msgid "Choose all"
+msgstr "सभी चुनें"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "एक ही बार में सभी %s को चुनने के लिए क्लिक करें."
+
+msgid "Choose"
+msgstr "चुनें"
+
+msgid "Remove"
+msgstr "हटाना"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "चुनें %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को हटा सकते हैं और "
+"उसके बाद दो बॉक्स के बीच \"हटायें\" तीर पर क्लिक करें."
+
+msgid "Remove all"
+msgstr "सभी को हटाएँ"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "एक ही बार में सभी %s को हटाने के लिए क्लिक करें."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s में से %(sel)s चुना गया हैं"
+msgstr[1] "%(cnt)s में से %(sel)s चुने गए हैं"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी रक्षित नहीं हैं | अगर आप कुछ कार्रवाई "
+"करते हो तो वे खो जायेंगे |"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"आप ने कार्रवाई तो चुनी हैं, पर स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी सुरक्षित "
+"नहीं किये हैं| उन्हें सुरक्षित करने के लिए कृपया 'ओके' क्लिक करे | आप को चुनी हुई कार्रवाई "
+"दोबारा चलानी होगी |"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"आप ने कार्रवाई चुनी हैं, और आप ने स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में बदल नहीं किये हैं| "
+"संभवतः 'सेव' बटन के बजाय आप 'गो' बटन ढून्ढ रहे हो |"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "अब"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "एक समय चुनें"
+
+msgid "Midnight"
+msgstr "मध्यरात्री"
+
+msgid "6 a.m."
+msgstr "सुबह 6 बजे"
+
+msgid "Noon"
+msgstr "दोपहर"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "रद्द करें"
+
+msgid "Today"
+msgstr "आज"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "कल (बीता)"
+
+msgid "Tomorrow"
+msgstr "कल"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "जनवरी फ़रवरी मार्च अप्रैल मई जून जुलाई अगस्त सेप्टम्बर अक्टूबर नवंबर दिसम्‍बर"
+
+msgid "S M T W T F S"
+msgstr "आ सो म बु गु शु श"
+
+msgid "Show"
+msgstr "दिखाओ"
+
+msgid "Hide"
+msgstr " छिपाओ"
diff --git a/tbc/static/admin/locale/hr/LC_MESSAGES/django.mo b/tbc/static/admin/locale/hr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..7d53064
--- /dev/null
+++ b/tbc/static/admin/locale/hr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hr/LC_MESSAGES/django.po b/tbc/static/admin/locale/hr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ecdf670
--- /dev/null
+++ b/tbc/static/admin/locale/hr/LC_MESSAGES/django.po
@@ -0,0 +1,684 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# aljosa <aljosa.mohorovic@gmail.com>, 2011,2013
+# Bojan Mihelač <bmihelac@mihelac.org>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Mislav Cimperšak <mislav.cimpersak@gmail.com>, 2013
+# Ylodi <stjepan@gmail.com>, 2015
+# Ylodi <stjepan@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Croatian (http://www.transifex.com/django/django/language/"
+"hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hr\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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Uspješno izbrisano %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nije moguće izbrisati %(name)s"
+
+msgid "Are you sure?"
+msgstr "Jeste li sigurni?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Izbrišite odabrane %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administracija"
+
+msgid "All"
+msgstr "Svi"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Nepoznat pojam"
+
+msgid "Any date"
+msgstr "Bilo koji datum"
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Past 7 days"
+msgstr "Prošlih 7 dana"
+
+msgid "This month"
+msgstr "Ovaj mjesec"
+
+msgid "This year"
+msgstr "Ova godina"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Molimo unesite ispravno %(username)s i lozinku za pristup. Imajte na umu da "
+"oba polja mogu biti velika i mala slova."
+
+msgid "Action:"
+msgstr "Akcija:"
+
+msgid "action time"
+msgstr "vrijeme akcije"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id objekta"
+
+msgid "object repr"
+msgstr "repr objekta"
+
+msgid "action flag"
+msgstr "oznaka akcije"
+
+msgid "change message"
+msgstr "promijeni poruku"
+
+msgid "log entry"
+msgstr "zapis"
+
+msgid "log entries"
+msgstr "zapisi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Dodano \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Promijenjeno \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Obrisano \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Log zapis"
+
+msgid "None"
+msgstr "Nijedan"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Držite \"Control\" ili \"Command\" na Mac-u kako bi odabrali više od jednog "
+"objekta. "
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Promijenjeno %s."
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodano %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Promijeni %(list)s za %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Izbrisani %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nije bilo promjena polja."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" uspješno dodan. Možete ponovo urediti unos dolje."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Unos %(name)s \"%(obj)s\" je uspješno dodan. Možete dodati još jedan unos "
+"(%(name)s) u nastavku."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno je dodano."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Unos %(name)s \"%(obj)s\" je uspješno promijenjen. Možete ga urediti ponovno "
+"ispod."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Unos %(name)s \"%(obj)s\" je uspješno promijenjen. Možete dodati još jedan "
+"(%(name)s) u nastavku."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno promijenjeno."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Unosi moraju biti odabrani da bi se nad njima mogle izvršiti akcije. Nijedan "
+"unos nije promijenjen."
+
+msgid "No action selected."
+msgstr "Nije odabrana akcija."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno izbrisan."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Unos %(name)s sa primarnim ključem %(key)r ne postoji."
+
+#, python-format
+msgid "Add %s"
+msgstr "Novi unos (%s)"
+
+#, python-format
+msgid "Change %s"
+msgstr "Promijeni %s"
+
+msgid "Database error"
+msgstr "Pogreška u bazi"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s uspješno promijenjen."
+msgstr[1] "%(count)s %(name)s uspješno promijenjeno."
+msgstr[2] "%(count)s %(name)s uspješno promijenjeno."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s odabrano"
+msgstr[1] "Svih %(total_count)s odabrano"
+msgstr[2] "Svih %(total_count)s odabrano"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 od %(cnt)s odabrano"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Promijeni povijest: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Brisanje %(class_name)s %(instance)s bi zahtjevalo i brisanje sljedećih "
+"zaštićenih povezanih objekata: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django administracija stranica"
+
+msgid "Django administration"
+msgstr "Django administracija"
+
+msgid "Site administration"
+msgstr "Administracija stranica"
+
+msgid "Log in"
+msgstr "Prijavi se"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administracija"
+
+msgid "Page not found"
+msgstr "Stranica nije pronađena"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ispričavamo se, ali tražena stranica nije pronađena."
+
+msgid "Home"
+msgstr "Početna"
+
+msgid "Server error"
+msgstr "Greška na serveru"
+
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Dogodila se greška. Administratori su obaviješteni putem elektroničke pošte "
+"te bi greška uskoro trebala biti ispravljena. Hvala na strpljenju."
+
+msgid "Run the selected action"
+msgstr "Izvrši odabranu akciju"
+
+msgid "Go"
+msgstr "Idi"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klikni ovdje da bi odabrao unose kroz sve stranice"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Odaberi svih %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Očisti odabir"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Prvo, unesite korisničko ime i lozinku. Onda možete promijeniti više "
+"postavki korisnika."
+
+msgid "Enter a username and password."
+msgstr "Unesite korisničko ime i lozinku."
+
+msgid "Change password"
+msgstr "Promijeni lozinku"
+
+msgid "Please correct the error below."
+msgstr "Molimo ispravite navedene greške."
+
+msgid "Please correct the errors below."
+msgstr "Molimo ispravite navedene greške."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Unesite novu lozinku za korisnika <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+msgid "View site"
+msgstr "Pogledaj stranicu"
+
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+msgid "Log out"
+msgstr "Odjava"
+
+msgid "Add"
+msgstr "Novi unos"
+
+msgid "History"
+msgstr "Povijest"
+
+msgid "View on site"
+msgstr "Pogledaj na stranicama"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Novi unos - %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Odstrani iz sortiranja"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritet sortiranja: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Preklopi sortiranje"
+
+msgid "Delete"
+msgstr "Izbriši"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Brisanje %(object_name)s '%(escaped_object)s' rezultiralo bi brisanjem "
+"povezanih objekta, ali vi nemate privilegije za brisanje navedenih objekta: "
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Brisanje %(object_name)s '%(escaped_object)s' bi zahtijevalo i brisanje "
+"sljedećih zaštićenih povezanih objekata:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Jeste li sigurni da želite izbrisati %(object_name)s \"%(escaped_object)s\"? "
+"Svi navedeni objekti biti će izbrisani:"
+
+msgid "Objects"
+msgstr "Objekti"
+
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+msgid "No, take me back"
+msgstr "Ne, vrati me natrag"
+
+msgid "Delete multiple objects"
+msgstr "Izbriši više unosa."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Brisanje odabranog %(objects_name)s rezultiralo bi brisanjem povezanih "
+"objekta, ali vaš korisnički račun nema dozvolu za brisanje sljedeće vrste "
+"objekata:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Brisanje odabranog %(objects_name)s će zahtijevati brisanje sljedećih "
+"zaštićenih povezanih objekata:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Jeste li sigurni da želite izbrisati odabrane %(objects_name)s ? Svi "
+"sljedeći objekti i povezane stavke će biti izbrisani:"
+
+msgid "Change"
+msgstr "Promijeni"
+
+msgid "Remove"
+msgstr "Ukloni"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Dodaj još jedan %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Izbriši?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Po %(filter_title)s "
+
+msgid "Summary"
+msgstr "Sažetak"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeli u aplikaciji %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nemate privilegije za promjenu podataka."
+
+msgid "Recent Actions"
+msgstr "Nedavne promjene"
+
+msgid "My Actions"
+msgstr "Moje promjene"
+
+msgid "None available"
+msgstr "Nije dostupno"
+
+msgid "Unknown content"
+msgstr "Sadržaj nepoznat"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Nešto nije uredu sa instalacijom/postavkama baze. Provjerite jesu li "
+"potrebne tablice u bazi kreirane i provjerite je li baza dostupna korisniku."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Zaboravili ste lozinku ili korisničko ime?"
+
+msgid "Date/time"
+msgstr "Datum/vrijeme"
+
+msgid "User"
+msgstr "Korisnik"
+
+msgid "Action"
+msgstr "Akcija"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ovaj objekt nema povijest promjena. Moguće je da nije dodan korištenjem ove "
+"administracije."
+
+msgid "Show all"
+msgstr "Prikaži sve"
+
+msgid "Save"
+msgstr "Spremi"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Promijeni označene %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Dodaj još jedan %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Obriši odabrane %(model)s"
+
+msgid "Search"
+msgstr "Traži"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s rezultat"
+msgstr[1] "%(counter)s rezultata"
+msgstr[2] "%(counter)s rezultata"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s ukupno"
+
+msgid "Save as new"
+msgstr "Spremi kao novi unos"
+
+msgid "Save and add another"
+msgstr "Spremi i unesi novi unos"
+
+msgid "Save and continue editing"
+msgstr "Spremi i nastavi uređivati"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala što ste proveli malo kvalitetnog vremena na stranicama danas."
+
+msgid "Log in again"
+msgstr "Prijavite se ponovo"
+
+msgid "Password change"
+msgstr "Promjena lozinke"
+
+msgid "Your password was changed."
+msgstr "Vaša lozinka je promijenjena."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Molim unesite staru lozinku, zbog sigurnosti, i onda unesite novu lozinku "
+"dvaput da bi mogli provjeriti jeste li je ispravno unijeli."
+
+msgid "Change my password"
+msgstr "Promijeni moju lozinku"
+
+msgid "Password reset"
+msgstr "Resetiranje lozinke"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaša lozinka je postavljena. Sada se možete prijaviti."
+
+msgid "Password reset confirmation"
+msgstr "Potvrda promjene lozinke"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Molimo vas da unesete novu lozinku dvaput da bi mogli provjeriti jeste li je "
+"ispravno unijeli."
+
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+msgid "Confirm password:"
+msgstr "Potvrdi lozinku:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Link za resetiranje lozinke je neispravan, vjerojatno jer je već korišten. "
+"Molimo zatražite novo resetiranje lozinke."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Elektroničkom poštom smo vam poslali upute za postavljanje Vaše zaporke, ako "
+"postoji korisnički račun s e-mail adresom koju ste unijeli. Uskoro bi ih "
+"trebali primiti. "
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ako niste primili e-mail provjerite da li ste ispravno unijeli adresu s "
+"kojom ste se registrirali i provjerite spam sandučić."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Primili ste ovu poruku jer ste zatražili postavljanje nove lozinke za svoj "
+"korisnički račun na %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Molimo otiđite do sljedeće stranice i odaberite novu lozinku:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:"
+
+msgid "Thanks for using our site!"
+msgstr "Hvala šta koristite naše stranice!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s tim"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Zaboravili ste lozinku? Unesite vašu e-mail adresu ispod i poslati ćemo vam "
+"upute kako postaviti novu."
+
+msgid "Email address:"
+msgstr "E-mail adresa:"
+
+msgid "Reset my password"
+msgstr "Resetiraj moju lozinku"
+
+msgid "All dates"
+msgstr "Svi datumi"
+
+#, python-format
+msgid "Select %s"
+msgstr "Odaberi %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Odaberi za promjenu - %s"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Vrijeme:"
+
+msgid "Lookup"
+msgstr "Potraži"
+
+msgid "Currently:"
+msgstr "Trenutno:"
+
+msgid "Change:"
+msgstr "Promijeni:"
diff --git a/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..36f7174
--- /dev/null
+++ b/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..0ce7c01
--- /dev/null
+++ b/tbc/static/admin/locale/hr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,168 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# aljosa <aljosa.mohorovic@gmail.com>, 2011
+# Bojan Mihelač <bmihelac@mihelac.org>, 2012
+# Davor Lučić <r.dav.lc@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Croatian (http://www.transifex.com/django/django/language/"
+"hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hr\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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostupno %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ovo je popis dostupnih %s. Možete dodati pojedine na način da ih izaberete u "
+"polju ispod i kliknete \"Izaberi\" strelicu između dva polja. "
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Tipkajte u ovo polje da filtrirate listu dostupnih %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Odaberi sve"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kliknite da odabrete sve %s odjednom."
+
+msgid "Choose"
+msgstr "Izaberi"
+
+msgid "Remove"
+msgstr "Ukloni"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Odabrano %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ovo je popis odabranih %s. Možete ukloniti pojedine na način da ih izaberete "
+"u polju ispod i kliknete \"Ukloni\" strelicu između dva polja. "
+
+msgid "Remove all"
+msgstr "Ukloni sve"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kliknite da uklonite sve izabrane %s odjednom."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "odabrano %(sel)s od %(cnt)s"
+msgstr[1] "odabrano %(sel)s od %(cnt)s"
+msgstr[2] "odabrano %(sel)s od %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Neke promjene nisu spremljene na pojedinim polja za uređivanje. Ako "
+"pokrenete akciju, nespremljene promjene će biti izgubljene."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Odabrali ste akciju, ali niste još spremili promjene na pojedinim polja. "
+"Molimo kliknite OK za spremanje. Morat ćete ponovno pokrenuti akciju."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Odabrali ste akciju, a niste napravili nikakve izmjene na pojedinim poljima. "
+"Vjerojatno tražite gumb Idi umjesto gumb Spremi."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr "Sada"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Izaberite vrijeme"
+
+msgid "Midnight"
+msgstr "Ponoć"
+
+msgid "6 a.m."
+msgstr "6 ujutro"
+
+msgid "Noon"
+msgstr "Podne"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Odustani"
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Jučer"
+
+msgid "Tomorrow"
+msgstr "Sutra"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Siječanj Veljača Ožujak Travanj Svibanj Lipanj Srpanj Kolovoz Rujan Listopad "
+"Studeni Prosinac"
+
+msgid "S M T W T F S"
+msgstr "N P U S Č P S"
+
+msgid "Show"
+msgstr "Prikaži"
+
+msgid "Hide"
+msgstr "Sakri"
diff --git a/tbc/static/admin/locale/hu/LC_MESSAGES/django.mo b/tbc/static/admin/locale/hu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..237e68b
--- /dev/null
+++ b/tbc/static/admin/locale/hu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hu/LC_MESSAGES/django.po b/tbc/static/admin/locale/hu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..518fd76
--- /dev/null
+++ b/tbc/static/admin/locale/hu/LC_MESSAGES/django.po
@@ -0,0 +1,670 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# János Péter Ronkay <transifex2@hangya.net>, 2014
+# Kristóf Gruber <>, 2012
+# slink <gabor@20y.hu>, 2011
+# Szilveszter Farkas <szilveszter.farkas@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Hungarian (http://www.transifex.com/django/django/language/"
+"hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s sikeresen törölve lett."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s törlése nem sikerült"
+
+msgid "Are you sure?"
+msgstr "Biztos benne?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Kiválasztott %(verbose_name_plural)s törlése"
+
+msgid "Administration"
+msgstr "Adminisztráció"
+
+msgid "All"
+msgstr "Mind"
+
+msgid "Yes"
+msgstr "Igen"
+
+msgid "No"
+msgstr "Nem"
+
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+msgid "Any date"
+msgstr "Bármely dátum"
+
+msgid "Today"
+msgstr "Ma"
+
+msgid "Past 7 days"
+msgstr "Utolsó 7 nap"
+
+msgid "This month"
+msgstr "Ez a hónap"
+
+msgid "This year"
+msgstr "Ez az év"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Adja meg egy adminisztrációra jogosult %(username)s és jelszavát. Vegye "
+"figyelembe, hogy mindkét mező megkülönböztetheti a kis- és nagybetűket."
+
+msgid "Action:"
+msgstr "Művelet:"
+
+msgid "action time"
+msgstr "művelet időpontja"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "objektum id"
+
+msgid "object repr"
+msgstr "objektum repr"
+
+msgid "action flag"
+msgstr "művelet jelölés"
+
+msgid "change message"
+msgstr "üzenet módosítása"
+
+msgid "log entry"
+msgstr "naplóbejegyzés"
+
+msgid "log entries"
+msgstr "naplóbejegyzések"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" hozzáadva."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" megváltoztatva: %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" törölve."
+
+msgid "LogEntry Object"
+msgstr "Naplóbejegyzés objektum"
+
+msgid "None"
+msgstr "Egyik sem"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s módosítva."
+
+msgid "and"
+msgstr "és"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "\"%(object)s\" %(name)s létrehozva."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "\"%(object)s\" %(name)s tulajdonságai (%(list)s) megváltoztak."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "\"%(object)s\" %(name)s törlésre került."
+
+msgid "No fields changed."
+msgstr "Egy mező sem változott."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "\"%(obj)s\" %(name)s sikeresen létrehozva. Alább ismét szerkesztheti."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"\"%(obj)s\" %(name)s sikeresen létrehozva. Alább újabb %(name)s hozható "
+"létre."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen létrehozva."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "\"%(obj)s\" %(name)s sikeresen létrehozva. Alább ismét szerkeszthető."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"\"%(obj)s\" %(name)s sikeresen módosítva. Alább újabb %(name)s hozható létre."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen módosítva."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"A műveletek végrehajtásához ki kell választani legalább egy elemet. Semmi "
+"sem lett módosítva."
+
+msgid "No action selected."
+msgstr "Nem választott ki műveletet."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen törölve."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s objektum %(key)r elsődleges kulccsal nem létezik."
+
+#, python-format
+msgid "Add %s"
+msgstr "Új %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s módosítása"
+
+msgid "Database error"
+msgstr "Adatbázishiba"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s sikeresen módosítva lett."
+msgstr[1] "%(count)s %(name)s sikeresen módosítva lett."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s kiválasztva"
+msgstr[1] "%(total_count)s kiválasztva"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 kiválasztva ennyiből: %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Változások története: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django honlapadminisztráció"
+
+msgid "Django administration"
+msgstr "Django adminisztráció"
+
+msgid "Site administration"
+msgstr "Honlap karbantartása"
+
+msgid "Log in"
+msgstr "Bejelentkezés"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Nincs ilyen oldal"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sajnáljuk, de a kért oldal nem található."
+
+msgid "Home"
+msgstr "Kezdőlap"
+
+msgid "Server error"
+msgstr "Szerverhiba"
+
+msgid "Server error (500)"
+msgstr "Szerverhiba (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Szerverhiba <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hiba történt, melyet e-mailben jelentettünk az oldal karbantartójának. A "
+"rendszer remélhetően hamar megjavul. Köszönjük a türelmét."
+
+msgid "Run the selected action"
+msgstr "Kiválasztott művelet futtatása"
+
+msgid "Go"
+msgstr "Mehet"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kattintson ide több oldalnyi objektum kiválasztásához"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Az összes %(module_name)s kiválasztása, összesen %(total_count)s db"
+
+msgid "Clear selection"
+msgstr "Kiválasztás törlése"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Először adjon meg egy felhasználói nevet és egy jelszót. Ezek után további "
+"módosításokat is végezhet a felhasználó adatain."
+
+msgid "Enter a username and password."
+msgstr "Írjon be egy felhasználónevet és jelszót."
+
+msgid "Change password"
+msgstr "Jelszó megváltoztatása"
+
+msgid "Please correct the error below."
+msgstr "Kérem, javítsa az alábbi hibákat."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Adjon meg egy új jelszót <strong>%(username)s</strong> nevű felhasználónak."
+
+msgid "Welcome,"
+msgstr "Üdvözlöm,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentáció"
+
+msgid "Log out"
+msgstr "Kijelentkezés"
+
+msgid "Add"
+msgstr "Új"
+
+msgid "History"
+msgstr "Történet"
+
+msgid "View on site"
+msgstr "Megtekintés a honlapon"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Új %(name)s"
+
+msgid "Filter"
+msgstr "Szűrő"
+
+msgid "Remove from sorting"
+msgstr "Eltávolítás a rendezésből"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritás rendezésnél: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Rendezés megfordítása"
+
+msgid "Delete"
+msgstr "Törlés"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"\"%(escaped_object)s\" %(object_name)s törlése a kapcsolódó objektumok "
+"törlését is eredményezi, de a hozzáférése nem engedi a következő típusú "
+"objektumok törlését:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"\"%(escaped_object)s\" %(object_name)s törlése az alábbi kapcsolódó "
+"objektumok törlését is maga után vonja:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Biztos hogy törli a következőt: \"%(escaped_object)s\" (típus: "
+"%(object_name)s)? A összes további kapcsolódó elem is törlődik:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Igen, biztos vagyok benne"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Több elem törlése"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"A kiválasztott %(objects_name)s törlése kapcsolódó objektumok törlését vonja "
+"maga után, de az alábbi objektumtípusok törléséhez nincs megfelelő "
+"jogosultsága:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"A kiválasztott %(objects_name)s törlése az alábbi védett kapcsolódó "
+"objektumok törlését is maga után vonja:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Biztosan törölni akarja a kiválasztott %(objects_name)s objektumokat? Minden "
+"alábbi objektum, és a hozzájuk kapcsolódóak is törlésre kerülnek:"
+
+msgid "Change"
+msgstr "Módosítás"
+
+msgid "Remove"
+msgstr "Törlés"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Újabb %(verbose_name)s hozzáadása"
+
+msgid "Delete?"
+msgstr "Törli?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s szerint "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s alkalmazásban elérhető modellek."
+
+msgid "You don't have permission to edit anything."
+msgstr "Nincs joga szerkeszteni."
+
+msgid "Recent Actions"
+msgstr "Utolsó műveletek"
+
+msgid "My Actions"
+msgstr "Az én műveleteim"
+
+msgid "None available"
+msgstr "Nincs elérhető"
+
+msgid "Unknown content"
+msgstr "Ismeretlen tartalom"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Valami nem stimmel a telepített adatbázissal. Bizonyosodjon meg arról, hogy "
+"a megfelelő táblák létre lettek-e hozva, és hogy a megfelelő felhasználó "
+"tudja-e őket olvasni."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Elfelejtette jelszavát vagy felhasználónevét?"
+
+msgid "Date/time"
+msgstr "Dátum/idő"
+
+msgid "User"
+msgstr "Felhasználó"
+
+msgid "Action"
+msgstr "Művelet"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Honlap karbantartása"
+
+msgid "Show all"
+msgstr "Mutassa mindet"
+
+msgid "Save"
+msgstr "Mentés"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Keresés"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s találat"
+msgstr[1] "%(counter)s találat"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s összesen"
+
+msgid "Save as new"
+msgstr "Mentés újként"
+
+msgid "Save and add another"
+msgstr "Mentés és másik hozzáadása"
+
+msgid "Save and continue editing"
+msgstr "Mentés és a szerkesztés folytatása"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Köszönjük hogy egy kis időt eltöltött ma a honlapunkon."
+
+msgid "Log in again"
+msgstr "Jelentkezzen be újra"
+
+msgid "Password change"
+msgstr "Jelszó megváltoztatása"
+
+msgid "Your password was changed."
+msgstr "Megváltozott a jelszava."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Írja be a régi jelszavát biztonsági okokból, majd az újat kétszer, hogy "
+"biztosan ne gépelje el."
+
+msgid "Change my password"
+msgstr "Jelszavam megváltoztatása"
+
+msgid "Password reset"
+msgstr "Jelszó beállítása"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Jelszava beállításra került. Most már bejelentkezhet."
+
+msgid "Password reset confirmation"
+msgstr "Jelszó beállítás megerősítése"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Írja be az új jelszavát kétszer, hogy megbizonyosodhassunk annak "
+"helyességéről."
+
+msgid "New password:"
+msgstr "Új jelszó:"
+
+msgid "Confirm password:"
+msgstr "Jelszó megerősítése:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"A jelszóbeállító link érvénytelen. Ennek egyik oka az lehet, hogy már "
+"felhasználták. Kérem indítson új jelszóbeállítást."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Amennyiben nem kapta meg az e-mailt, ellenőrizze, hogy ezzel a címmel "
+"regisztrált-e, valamint hogy nem került-e a levélszemét mappába."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Azért kapja ezt az e-mailt, mert jelszavának visszaállítását kérte ezen a "
+"weboldalon: %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Kérjük látogassa meg a következő oldalt, és válasszon egy új jelszót:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Felhasználóneve, ha elfelejtette volna:"
+
+msgid "Thanks for using our site!"
+msgstr "Köszönjük, hogy használta honlapunkat!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s csapat"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Elfelejtette a jelszavát? Írja be az e-mail címét, és küldünk egy levelet a "
+"teendőkről."
+
+msgid "Email address:"
+msgstr "E-mail cím:"
+
+msgid "Reset my password"
+msgstr "Jelszavam törlése"
+
+msgid "All dates"
+msgstr "Minden dátum"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s kiválasztása"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Válasszon ki egyet a módosításhoz (%s)"
+
+msgid "Date:"
+msgstr "Dátum:"
+
+msgid "Time:"
+msgstr "Idő:"
+
+msgid "Lookup"
+msgstr "Keresés"
+
+msgid "Currently:"
+msgstr "Jelenleg:"
+
+msgid "Change:"
+msgstr "Módosítás:"
diff --git a/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..e5f603e
--- /dev/null
+++ b/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..42a5e6c
--- /dev/null
+++ b/tbc/static/admin/locale/hu/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Attila Nagy <>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# János Péter Ronkay <transifex2@hangya.net>, 2011
+# Máté Őry <orymate@iit.bme.hu>, 2012
+# Szilveszter Farkas <szilveszter.farkas@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Hungarian (http://www.transifex.com/django/django/language/"
+"hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Elérhető %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ez az elérhető %s listája. Úgy választhat közülük, hogy rákattint az alábbi "
+"dobozban, és megnyomja a dobozok közti \"Választás\" nyilat."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Írjon a mezőbe az elérhető %s szűréséhez."
+
+msgid "Filter"
+msgstr "Szűrő"
+
+msgid "Choose all"
+msgstr "Mindet kijelölni"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kattintson az összes %s kiválasztásához."
+
+msgid "Choose"
+msgstr "Választás"
+
+msgid "Remove"
+msgstr "Eltávolítás"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s kiválasztva"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ez a kiválasztott %s listája. Eltávolíthat közülük, ha rákattint, majd a két "
+"doboz közti \"Eltávolítás\" nyílra kattint."
+
+msgid "Remove all"
+msgstr "Összes törlése"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kattintson az összes %s eltávolításához."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s/%(cnt)s kijelölve"
+msgstr[1] "%(sel)s/%(cnt)s kijelölve"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Még el nem mentett módosításai vannak egyes szerkeszthető mezőkön. Ha most "
+"futtat egy műveletet, akkor a módosítások elvesznek."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Kiválasztott egy műveletet, de nem mentette az egyes mezőkhöz kapcsolódó "
+"módosításait. Kattintson az OK gombra a mentéshez. Újra kell futtatnia az "
+"műveletet."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Kiválasztott egy műveletet, és nem módosított egyetlen mezőt sem. "
+"Feltehetően a Mehet gombot keresi a Mentés helyett."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Most"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Válassza ki az időt"
+
+msgid "Midnight"
+msgstr "Éjfél"
+
+msgid "6 a.m."
+msgstr "Reggel 6 óra"
+
+msgid "Noon"
+msgstr "Dél"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Mégsem"
+
+msgid "Today"
+msgstr "Ma"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Tegnap"
+
+msgid "Tomorrow"
+msgstr "Holnap"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"január február március április május június július augusztus szeptember "
+"október november december"
+
+msgid "S M T W T F S"
+msgstr "V H K Sz Cs P Szo"
+
+msgid "Show"
+msgstr "Mutat"
+
+msgid "Hide"
+msgstr "Elrejt"
diff --git a/tbc/static/admin/locale/ia/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ia/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d8edd31
--- /dev/null
+++ b/tbc/static/admin/locale/ia/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ia/LC_MESSAGES/django.po b/tbc/static/admin/locale/ia/LC_MESSAGES/django.po
new file mode 100644
index 0000000..828017c
--- /dev/null
+++ b/tbc/static/admin/locale/ia/LC_MESSAGES/django.po
@@ -0,0 +1,659 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Martijn Dekker <mcdutchie@hotmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Interlingua (http://www.transifex.com/django/django/language/"
+"ia/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ia\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s delite con successo."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Non pote deler %(name)s"
+
+msgid "Are you sure?"
+msgstr "Es tu secur?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Deler le %(verbose_name_plural)s seligite"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Totes"
+
+msgid "Yes"
+msgstr "Si"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Incognite"
+
+msgid "Any date"
+msgstr "Omne data"
+
+msgid "Today"
+msgstr "Hodie"
+
+msgid "Past 7 days"
+msgstr "Ultime 7 dies"
+
+msgid "This month"
+msgstr "Iste mense"
+
+msgid "This year"
+msgstr "Iste anno"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Action:"
+
+msgid "action time"
+msgstr "hora de action"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id de objecto"
+
+msgid "object repr"
+msgstr "repr de objecto"
+
+msgid "action flag"
+msgstr "marca de action"
+
+msgid "change message"
+msgstr "message de cambio"
+
+msgid "log entry"
+msgstr "entrata de registro"
+
+msgid "log entries"
+msgstr "entratas de registro"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" addite."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" cambiate - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" delite."
+
+msgid "LogEntry Object"
+msgstr "Objecto LogEntry"
+
+msgid "None"
+msgstr "Nulle"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s cambiate."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" addite."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s cambiate pro %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" delite."
+
+msgid "No fields changed."
+msgstr "Nulle campo cambiate."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Le %(name)s \"%(obj)s\" ha essite addite con successo. Tu pote modificar lo "
+"de novo hic infra."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Le %(name)s \"%(obj)s\" ha essite addite con successo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Le %(name)s \"%(obj)s\" ha essite cambiate con successo."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Es necessari seliger elementos pro poter exequer actiones. Nulle elemento ha "
+"essite cambiate."
+
+msgid "No action selected."
+msgstr "Nulle action seligite."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Le %(name)s \"%(obj)s\" ha essite delite con successo."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Le objecto %(name)s con le clave primari %(key)r non existe."
+
+#, python-format
+msgid "Add %s"
+msgstr "Adder %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Cambiar %s"
+
+msgid "Database error"
+msgstr "Error in le base de datos"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s cambiate con successo."
+msgstr[1] "%(count)s %(name)s cambiate con successo."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s seligite"
+msgstr[1] "Tote le %(total_count)s seligite"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s seligite"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de cambiamentos: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Administration del sito Django"
+
+msgid "Django administration"
+msgstr "Administration de Django"
+
+msgid "Site administration"
+msgstr "Administration del sito"
+
+msgid "Log in"
+msgstr "Aperir session"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Pagina non trovate"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Regrettabilemente, le pagina requestate non poteva esser trovate."
+
+msgid "Home"
+msgstr "Initio"
+
+msgid "Server error"
+msgstr "Error del servitor"
+
+msgid "Server error (500)"
+msgstr "Error del servitor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Error del servitor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Exequer le action seligite"
+
+msgid "Go"
+msgstr "Va"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Clicca hic pro seliger le objectos in tote le paginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seliger tote le %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Rader selection"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primo, specifica un nomine de usator e un contrasigno. Postea, tu potera "
+"modificar plus optiones de usator."
+
+msgid "Enter a username and password."
+msgstr "Specifica un nomine de usator e un contrasigno."
+
+msgid "Change password"
+msgstr "Cambiar contrasigno"
+
+msgid "Please correct the error below."
+msgstr "Per favor corrige le errores sequente."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Specifica un nove contrasigno pro le usator <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Benvenite,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Documentation"
+
+msgid "Log out"
+msgstr "Clauder session"
+
+msgid "Add"
+msgstr "Adder"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Vider in sito"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adder %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Remover del ordination"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritate de ordination: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Alternar le ordination"
+
+msgid "Delete"
+msgstr "Deler"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Deler le %(object_name)s '%(escaped_object)s' resultarea in le deletion de "
+"objectos associate, me tu conto non ha le permission de deler objectos del "
+"sequente typos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Deler le %(object_name)s '%(escaped_object)s' necessitarea le deletion del "
+"sequente objectos associate protegite:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Es tu secur de voler deler le %(object_name)s \"%(escaped_object)s\"? Tote "
+"le sequente objectos associate essera delite:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Si, io es secur"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Deler plure objectos"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Deler le %(objects_name)s seligite resultarea in le deletion de objectos "
+"associate, ma tu conto non ha le permission de deler objectos del sequente "
+"typos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Deler le %(objects_name)s seligite necessitarea le deletion del sequente "
+"objectos associate protegite:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Es tu secur de voler deler le %(objects_name)s seligite? Tote le sequente "
+"objectos e le objectos associate a illo essera delite:"
+
+msgid "Change"
+msgstr "Cambiar"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Adder un altere %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Deler?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Per %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Tu non ha le permission de modificar alcun cosa."
+
+msgid "Recent Actions"
+msgstr "Actiones recente"
+
+msgid "My Actions"
+msgstr "Mi actiones"
+
+msgid "None available"
+msgstr "Nihil disponibile"
+
+msgid "Unknown content"
+msgstr "Contento incognite"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Il ha un problema con le installation del base de datos. Assecura te que le "
+"tabellas correcte ha essite create, e que le base de datos es legibile pro "
+"le usator appropriate."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Contrasigno o nomine de usator oblidate?"
+
+msgid "Date/time"
+msgstr "Data/hora"
+
+msgid "User"
+msgstr "Usator"
+
+msgid "Action"
+msgstr "Action"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Iste objecto non ha un historia de cambiamentos. Illo probabilemente non "
+"esseva addite per medio de iste sito administrative."
+
+msgid "Show all"
+msgstr "Monstrar toto"
+
+msgid "Save"
+msgstr "Salveguardar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Cercar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultato"
+msgstr[1] "%(counter)s resultatos"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s in total"
+
+msgid "Save as new"
+msgstr "Salveguardar como nove"
+
+msgid "Save and add another"
+msgstr "Salveguardar e adder un altere"
+
+msgid "Save and continue editing"
+msgstr "Salveguardar e continuar le modification"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gratias pro haber passate un tempore agradabile con iste sito web."
+
+msgid "Log in again"
+msgstr "Aperir session de novo"
+
+msgid "Password change"
+msgstr "Cambio de contrasigno"
+
+msgid "Your password was changed."
+msgstr "Tu contrasigno ha essite cambiate."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Per favor specifica tu ancian contrasigno, pro securitate, e postea "
+"specifica tu nove contrasigno duo vices pro verificar que illo es scribite "
+"correctemente."
+
+msgid "Change my password"
+msgstr "Cambiar mi contrasigno"
+
+msgid "Password reset"
+msgstr "Reinitialisar contrasigno"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Tu contrasigno ha essite reinitialisate. Ora tu pote aperir session."
+
+msgid "Password reset confirmation"
+msgstr "Confirmation de reinitialisation de contrasigno"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Per favor scribe le nove contrasigno duo vices pro verificar que illo es "
+"scribite correctemente."
+
+msgid "New password:"
+msgstr "Nove contrasigno:"
+
+msgid "Confirm password:"
+msgstr "Confirma contrasigno:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Le ligamine pro le reinitialisation del contrasigno esseva invalide, forsan "
+"perque illo ha jam essite usate. Per favor submitte un nove demanda de "
+"reinitialisation del contrasigno."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Per favor va al sequente pagina pro eliger un nove contrasigno:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Tu nomine de usator, in caso que tu lo ha oblidate:"
+
+msgid "Thanks for using our site!"
+msgstr "Gratias pro usar nostre sito!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Le equipa de %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Reinitialisar mi contrasigno"
+
+msgid "All dates"
+msgstr "Tote le datas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selige %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selige %s a modificar"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Recerca"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3fe3943
--- /dev/null
+++ b/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..81a565f
--- /dev/null
+++ b/tbc/static/admin/locale/ia/LC_MESSAGES/djangojs.po
@@ -0,0 +1,162 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Martijn Dekker <mcdutchie@hotmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Interlingua (http://www.transifex.com/django/django/language/"
+"ia/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ia\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponibile"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ecce le lista de %s disponibile. Tu pote seliger alcunes in le quadro "
+"sequente; postea clicca le flecha \"Seliger\" inter le duo quadros."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Scribe in iste quadro pro filtrar le lista de %s disponibile."
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Choose all"
+msgstr "Seliger totes"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Clicca pro seliger tote le %s immediatemente."
+
+msgid "Choose"
+msgstr "Seliger"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Le %s seligite"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ecce le lista de %s seligite. Tu pote remover alcunes per seliger los in le "
+"quadro sequente e cliccar le flecha \"Remover\" inter le duo quadros."
+
+msgid "Remove all"
+msgstr "Remover totes"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Clicca pro remover tote le %s seligite immediatemente."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s seligite"
+msgstr[1] "%(sel)s de %(cnt)s seligite"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Il ha cambiamentos non salveguardate in certe campos modificabile. Si tu "
+"exeque un action, iste cambiamentos essera perdite."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Tu ha seligite un action, ma tu non ha salveguardate le cambiamentos in "
+"certe campos. Per favor clicca OK pro salveguardar los. Tu debera re-exequer "
+"le action."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Tu ha seligite un action, e tu non ha facite cambiamentos in alcun campo. Tu "
+"probabilemente cerca le button Va e non le button Salveguardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Ora"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Selige un hora"
+
+msgid "Midnight"
+msgstr "Medienocte"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Mediedie"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Cancellar"
+
+msgid "Today"
+msgstr "Hodie"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Heri"
+
+msgid "Tomorrow"
+msgstr "Deman"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januario Februario Martio April Maio Junio Julio Augusto Septembre Octobre "
+"Novembre Decembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Monstrar"
+
+msgid "Hide"
+msgstr "Celar"
diff --git a/tbc/static/admin/locale/id/LC_MESSAGES/django.mo b/tbc/static/admin/locale/id/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a2e9088
--- /dev/null
+++ b/tbc/static/admin/locale/id/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/id/LC_MESSAGES/django.po b/tbc/static/admin/locale/id/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2de383e
--- /dev/null
+++ b/tbc/static/admin/locale/id/LC_MESSAGES/django.po
@@ -0,0 +1,676 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Claude Paroz <claude@2xlibre.net>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# M Asep Indrayana <me@drayanaindra.com>, 2015
+# rodin <romihardiyanto@gmail.com>, 2011-2013
+# rodin <romihardiyanto@gmail.com>, 2013-2015
+# Sutrisno Efendi <kangfend@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Indonesian (http://www.transifex.com/django/django/language/"
+"id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Sukes menghapus %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Tidak dapat menghapus %(name)s"
+
+msgid "Are you sure?"
+msgstr "Yakin?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Hapus %(verbose_name_plural)s yang dipilih"
+
+msgid "Administration"
+msgstr "Administrasi"
+
+msgid "All"
+msgstr "Semua"
+
+msgid "Yes"
+msgstr "Ya"
+
+msgid "No"
+msgstr "Tidak"
+
+msgid "Unknown"
+msgstr "Tidak diketahui"
+
+msgid "Any date"
+msgstr "Kapanpun"
+
+msgid "Today"
+msgstr "Hari ini"
+
+msgid "Past 7 days"
+msgstr "Tujuh hari terakhir"
+
+msgid "This month"
+msgstr "Bulan ini"
+
+msgid "This year"
+msgstr "Tahun ini"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Masukkan nama pengguna %(username)s dan sandi yang benar untuk akun staf. "
+"Huruf besar/kecil pada bidang ini berpengaruh."
+
+msgid "Action:"
+msgstr "Aksi:"
+
+msgid "action time"
+msgstr "waktu aksi"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id objek"
+
+msgid "object repr"
+msgstr "representasi objek"
+
+msgid "action flag"
+msgstr "jenis aksi"
+
+msgid "change message"
+msgstr "ganti pesan"
+
+msgid "log entry"
+msgstr "entri pencatatan"
+
+msgid "log entries"
+msgstr "entri pencatatan"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" ditambahkan."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" diubah - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" dihapus."
+
+msgid "LogEntry Object"
+msgstr "Objek LogEntry"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Tekan \"Control\", atau \"Command\" pada Mac, untuk memilih lebih dari satu."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s diubah"
+
+msgid "and"
+msgstr "dan"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ditambahkan."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s untuk %(name)s \"%(object)s\" diubah."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" dihapus."
+
+msgid "No fields changed."
+msgstr "Tidak ada bidang yang berubah."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" berhasil ditambahkan. Anda dapat mengeditnya lagi di "
+"bawah ini."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" berhasil ditambahkan. Anda dapat menambahkan %(name)s "
+"yang lain di bawah ini."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" berhasil ditambahkan."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" berhasil diubah. Anda dapat mengeditnya lagi di bawah "
+"ini."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" berhasil diubah. Anda dapat menambahkan %(name)s yang "
+"lain di bawah ini."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" berhasil diubah."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Objek harus dipilih sebelum dimanipulasi. Tidak ada objek yang berubah."
+
+msgid "No action selected."
+msgstr "Tidak ada aksi yang dipilih."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" berhasil dihapus."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objek %(name)s dengan kunci utama %(key)r tidak ada."
+
+#, python-format
+msgid "Add %s"
+msgstr "Tambahkan %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Ubah %s"
+
+msgid "Database error"
+msgstr "Galat basis data"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s berhasil diubah."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s dipilih"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 dari %(cnt)s dipilih"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ubah riwayat: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Menghapus %(class_name)s %(instance)s memerlukan penghapusanobjek "
+"terlindungi yang terkait sebagai berikut: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Admin situs Django"
+
+msgid "Django administration"
+msgstr "Administrasi Django"
+
+msgid "Site administration"
+msgstr "Administrasi situs"
+
+msgid "Log in"
+msgstr "Masuk"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administrasi %(app)s"
+
+msgid "Page not found"
+msgstr "Laman tidak ditemukan"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Maaf, laman yang Anda minta tidak ditemukan."
+
+msgid "Home"
+msgstr "Beranda"
+
+msgid "Server error"
+msgstr "Galat server"
+
+msgid "Server error (500)"
+msgstr "Galat server (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Galat Server <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Galat terjadi dan telah dilaporkan ke administrator situs lewat email untuk "
+"diperbaiki. Terima kasih atas pengertiannya."
+
+msgid "Run the selected action"
+msgstr "Jalankan aksi terpilih"
+
+msgid "Go"
+msgstr "Buka"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klik di sini untuk memilih semua objek pada semua laman"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Pilih seluruh %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Bersihkan pilihan"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Pertama-tama, masukkan nama pengguna dan sandi. Anda akan dapat mengubah "
+"opsi pengguna lain setelah itu."
+
+msgid "Enter a username and password."
+msgstr "Masukkan nama pengguna dan sandi."
+
+msgid "Change password"
+msgstr "Ganti sandi"
+
+msgid "Please correct the error below."
+msgstr "Perbaiki galat di bawah ini."
+
+msgid "Please correct the errors below."
+msgstr "Perbaiki galat di bawah ini."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Masukkan sandi baru untuk pengguna <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Selamat datang,"
+
+msgid "View site"
+msgstr "Lihat situs"
+
+msgid "Documentation"
+msgstr "Dokumentasi"
+
+msgid "Log out"
+msgstr "Keluar"
+
+msgid "Add"
+msgstr "Tambah"
+
+msgid "History"
+msgstr "Riwayat"
+
+msgid "View on site"
+msgstr "Lihat di situs"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Tambahkan %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Dihapus dari pengurutan"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritas pengurutan: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Ubah pengurutan"
+
+msgid "Delete"
+msgstr "Hapus"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Menghapus %(object_name)s '%(escaped_object)s' akan menghapus objek lain "
+"yang terkait, tetapi akun Anda tidak memiliki izin untuk menghapus objek "
+"dengan tipe berikut:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Menghapus %(object_name)s '%(escaped_object)s' memerlukan penghapusan objek "
+"terlindungi yang terkait sebagai berikut:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Yakin ingin menghapus %(object_name)s \"%(escaped_object)s\"? Semua objek "
+"lain yang terkait juga akan dihapus:"
+
+msgid "Objects"
+msgstr "Objek"
+
+msgid "Yes, I'm sure"
+msgstr "Ya, tentu saja"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Hapus beberapa objek sekaligus"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Menghapus %(objects_name)s terpilih akan menghapus objek yang terkait, "
+"tetapi akun Anda tidak memiliki izin untuk menghapus objek dengan tipe "
+"berikut:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Menghapus %(objects_name)s terpilih memerlukan penghapusan objek terlindungi "
+"yang terkait sebagai berikut:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Yakin akan menghapus %(objects_name)s terpilih? Semua objek berikut beserta "
+"objek terkait juga akan dihapus:"
+
+msgid "Change"
+msgstr "Ubah"
+
+msgid "Remove"
+msgstr "Hapus"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Tambahkan %(verbose_name)s lagi"
+
+msgid "Delete?"
+msgstr "Hapus?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Berdasarkan %(filter_title)s "
+
+msgid "Summary"
+msgstr "Ringkasan"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Model pada aplikasi %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Anda tidak memiliki izin untuk mengubah apapun."
+
+msgid "Recent Actions"
+msgstr "Aktivitas Terbaru"
+
+msgid "My Actions"
+msgstr "Aktivitas Saya"
+
+msgid "None available"
+msgstr "Tidak ada yang tersedia"
+
+msgid "Unknown content"
+msgstr "Konten tidak diketahui"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Ada masalah dengan instalasi basis data Anda. Pastikan tabel yang sesuai "
+"pada basis data telah dibuat dan dapat dibaca oleh pengguna yang benar."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Lupa nama pengguna atau sandi?"
+
+msgid "Date/time"
+msgstr "Tanggal/waktu"
+
+msgid "User"
+msgstr "Pengguna"
+
+msgid "Action"
+msgstr "Aksi"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Objek ini tidak memiliki riwayat perubahan. Kemungkinan objek ini tidak "
+"ditambahkan melalui situs administrasi ini."
+
+msgid "Show all"
+msgstr "Tampilkan semua"
+
+msgid "Save"
+msgstr "Simpan"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Ubah %(model)s yang dipilih"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Tambahkan %(model)s yang lain"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Hapus %(model)s yang dipilih"
+
+msgid "Search"
+msgstr "Cari"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s buah"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+msgid "Save as new"
+msgstr "Simpan sebagai baru"
+
+msgid "Save and add another"
+msgstr "Simpan dan tambahkan lagi"
+
+msgid "Save and continue editing"
+msgstr "Simpan dan terus mengedit"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Terima kasih telah menggunakan situs ini hari ini."
+
+msgid "Log in again"
+msgstr "Masuk kembali"
+
+msgid "Password change"
+msgstr "Ubah sandi"
+
+msgid "Your password was changed."
+msgstr "Sandi Anda telah diubah."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Dengan alasan keamanan, masukkan sandi lama Anda dua kali untuk memastikan "
+"Anda tidak salah mengetikkannya."
+
+msgid "Change my password"
+msgstr "Ubah sandi saya"
+
+msgid "Password reset"
+msgstr "Setel ulang sandi"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Sandi Anda telah diperbarui. Silakan masuk."
+
+msgid "Password reset confirmation"
+msgstr "Konfirmasi penyetelan ulang sandi"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Masukkan sandi baru dua kali untuk memastikan Anda tidak salah "
+"mengetikkannya."
+
+msgid "New password:"
+msgstr "Sandi baru:"
+
+msgid "Confirm password:"
+msgstr "Konfirmasi sandi:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Tautan penyetelan ulang sandi tidak valid. Kemungkinan karena tautan "
+"tersebut telah dipakai sebelumnya. Ajukan permintaan penyetelan sandi sekali "
+"lagi."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Jika Anda tidak menerima email, pastikan Anda telah memasukkan alamat yang "
+"digunakan saat pendaftaran serta periksa folder spam Anda."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Anda menerima email ini karena Anda meminta penyetelan ulang sandi untuk "
+"akun pengguna di %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Kunjungi laman di bawah ini dan ketikkan sandi baru:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Nama pengguna Anda, jika lupa:"
+
+msgid "Thanks for using our site!"
+msgstr "Terima kasih telah menggunakan situs kami!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tim %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Lupa sandinya? Masukkan alamat email Anda di bawah ini agar kami dapat "
+"mengirimkan petunjuk untuk menyetel ulang sandinya."
+
+msgid "Email address:"
+msgstr "Alamat email:"
+
+msgid "Reset my password"
+msgstr "Setel ulang sandi saya"
+
+msgid "All dates"
+msgstr "Semua tanggal"
+
+#, python-format
+msgid "Select %s"
+msgstr "Pilih %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Pilih %s untuk diubah"
+
+msgid "Date:"
+msgstr "Tanggal:"
+
+msgid "Time:"
+msgstr "Waktu:"
+
+msgid "Lookup"
+msgstr "Cari"
+
+msgid "Currently:"
+msgstr "Saat ini:"
+
+msgid "Change:"
+msgstr "Ubah:"
diff --git a/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3683a6d
--- /dev/null
+++ b/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..10e8c63
--- /dev/null
+++ b/tbc/static/admin/locale/id/LC_MESSAGES/djangojs.po
@@ -0,0 +1,163 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# rodin <romihardiyanto@gmail.com>, 2011-2012
+# rodin <romihardiyanto@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Indonesian (http://www.transifex.com/django/django/language/"
+"id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s yang tersedia"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Berikut adalah daftar %s yang tersedia. Anda dapat memilih satu atau lebih "
+"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Pilih\" "
+"di antara kedua kotak."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Ketik pada kotak ini untuk menyaring daftar %s yang tersedia."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Pilih semua"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Pilih untuk memilih seluruh %s sekaligus."
+
+msgid "Choose"
+msgstr "Pilih"
+
+msgid "Remove"
+msgstr "Hapus"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s terpilih"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Berikut adalah daftar %s yang terpilih. Anda dapat menghapus satu atau lebih "
+"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Hapus\" "
+"di antara kedua kotak."
+
+msgid "Remove all"
+msgstr "Hapus semua"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klik untuk menghapus semua pilihan %s sekaligus."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s dari %(cnt)s terpilih"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Beberapa perubahan bidang yang Anda lakukan belum tersimpan. Perubahan yang "
+"telah dilakukan akan hilang."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Anda telah memilih sebuah aksi, tetapi belum menyimpan perubahan ke bidang "
+"yang ada. Klik OK untuk menyimpan perubahan ini. Anda akan perlu mengulangi "
+"aksi tersebut kembali."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Anda telah memilih sebuah aksi, tetapi belum mengubah bidang apapun. "
+"Kemungkinan Anda mencari tombol Buka dan bukan tombol Simpan."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Catatan: Waktu Anda lebih cepat %s jam dibandingkan waktu server."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Catatan: Waktu Anda lebih lambat %s jam dibandingkan waktu server."
+
+msgid "Now"
+msgstr "Sekarang"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Pilih waktu"
+
+msgid "Midnight"
+msgstr "Tengah malam"
+
+msgid "6 a.m."
+msgstr "6 pagi"
+
+msgid "Noon"
+msgstr "Siang"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Batal"
+
+msgid "Today"
+msgstr "Hari ini"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Kemarin"
+
+msgid "Tomorrow"
+msgstr "Besok"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januari Februari Maret April Mei Juni Juli Agustus September Oktober "
+"November Desember"
+
+msgid "S M T W T F S"
+msgstr "M S S R K J S"
+
+msgid "Show"
+msgstr "Bentangkan"
+
+msgid "Hide"
+msgstr "Ciutkan"
diff --git a/tbc/static/admin/locale/io/LC_MESSAGES/django.mo b/tbc/static/admin/locale/io/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c8f106d
--- /dev/null
+++ b/tbc/static/admin/locale/io/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/io/LC_MESSAGES/django.po b/tbc/static/admin/locale/io/LC_MESSAGES/django.po
new file mode 100644
index 0000000..59ed217
--- /dev/null
+++ b/tbc/static/admin/locale/io/LC_MESSAGES/django.po
@@ -0,0 +1,669 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Viko Bartero <inactive+tergrundo@transifex.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: io\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s eliminesis sucesoze."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Onu ne povas eliminar %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ka vu esas certa?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eliminar selektita %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Omni"
+
+msgid "Yes"
+msgstr "Yes"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Nekonocato"
+
+msgid "Any date"
+msgstr "Irga dato"
+
+msgid "Today"
+msgstr "Hodie"
+
+msgid "Past 7 days"
+msgstr "7 antea dii"
+
+msgid "This month"
+msgstr "Ca monato"
+
+msgid "This year"
+msgstr "Ca yaro"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Skribez la korekta %(username)s e pasvorto di kelka staff account. Remarkez "
+"ke both feldi darfas rikonocar miniskulo e mayuskulo."
+
+msgid "Action:"
+msgstr "Ago:"
+
+msgid "action time"
+msgstr "horo dil ago"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id dil objekto"
+
+msgid "object repr"
+msgstr "repr dil objekto"
+
+msgid "action flag"
+msgstr "flago dil ago"
+
+msgid "change message"
+msgstr "chanjar mesajo"
+
+msgid "log entry"
+msgstr "logo informo"
+
+msgid "log entries"
+msgstr "logo informi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" agregesis."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" chanjesis - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" eliminesis."
+
+msgid "LogEntry Object"
+msgstr "LogEntry Objekto"
+
+msgid "None"
+msgstr "Nula"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s chanjesis."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" agregesis."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s chanjesis por la %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" eliminesis."
+
+msgid "No fields changed."
+msgstr "Nula feldo chanjesis."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"La %(name)s \"%(obj)s\" agregesis sucesoze. Vu povas modifikar ol altrafoye "
+"infre."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"La %(name)s \"%(obj)s\" agregesis sucesoze. Vu povas agregar altra %(name)s "
+"infre."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "La %(name)s \"%(obj)s\" agregesis sucesoze."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"La %(name)s \"%(obj)s\" chanjesis sucesoze. Vu povas modifikar ol altrafoye "
+"infre."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"La %(name)s \"%(obj)s\" chanjesis sucesoze. Vu povas agregar altra %(name)s "
+"infre."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "La %(name)s \"%(obj)s\" chanjesis sucesoze."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Onu devas selektar la objekti por aplikar oli irga ago. Nula objekto "
+"chanjesis."
+
+msgid "No action selected."
+msgstr "Nula ago selektesis."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "La %(name)s \"%(obj)s\" eliminesis sucesoze."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "La %(name)s objekto kun precipua klefo %(key)r ne existas."
+
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Chanjar %s"
+
+msgid "Database error"
+msgstr "Eroro del datumaro"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s chanjesis sucesoze."
+msgstr[1] "%(count)s %(name)s chanjesis sucesoze."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selektita"
+msgstr[1] "La %(total_count)s selektita"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Selektita 0 di %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Modifikuro historio: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Por eliminar %(class_name)s %(instance)s on mustas eliminar la sequanta "
+"protektita objekti relatita: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django situo admin"
+
+msgid "Django administration"
+msgstr "Django administreyo"
+
+msgid "Site administration"
+msgstr "Administrayo dil ret-situo"
+
+msgid "Log in"
+msgstr "Startar sesiono"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "La pagino ne renkontresis"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pardonez, ma la demandita pagino ne renkontresis."
+
+msgid "Home"
+msgstr "Hemo"
+
+msgid "Server error"
+msgstr "Eroro del servilo"
+
+msgid "Server error (500)"
+msgstr "Eroro del servilo (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Eroro del servilo <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Eroro eventis. Ico informesis per e-posto a la administranti dil ret-situo e "
+"la eroro esos korektigata balde. Danko pro vua pacienteso."
+
+msgid "Run the selected action"
+msgstr "Exekutar la selektita ago"
+
+msgid "Go"
+msgstr "Irar"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliktez hike por selektar la objekti di omna pagini"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Selektar omna %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Desfacar selekto"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Unesme, skribez uzer-nomo ed pasvorto. Pos, vu povos modifikar altra uzer-"
+"selekto."
+
+msgid "Enter a username and password."
+msgstr "Skribez uzer-nomo ed pasvorto."
+
+msgid "Change password"
+msgstr "Chanjar pasvorto"
+
+msgid "Please correct the error below."
+msgstr "Korektigez la eroro infre."
+
+msgid "Please correct the errors below."
+msgstr "Korektigez la erori infre."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Skribez nova pasvorto por la uzero <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Bonvenez,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumento"
+
+msgid "Log out"
+msgstr "Klozar sesiono"
+
+msgid "Add"
+msgstr "Agregar"
+
+msgid "History"
+msgstr "Historio"
+
+msgid "View on site"
+msgstr "Vidar en la ret-situo"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Remove from sorting"
+msgstr "Eskartar de klasifiko"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Precedo dil klasifiko: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Aktivar/desaktivar klasifiko"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar la %(object_name)s '%(escaped_object)s' eliminos relatita objekti, "
+"ma vua account ne havas permiso por eliminar la sequanta objekti:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Eliminar la %(object_name)s '%(escaped_object)s' eliminus la sequanta "
+"protektita objekti relatita:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ka vu volas eliminar la %(object_name)s \"%(escaped_object)s\"? Omna "
+"sequanta objekti relatita eliminesos:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Yes, me esas certa"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Eliminar multopla objekti"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Eliminar la selektita %(objects_name)s eliminos relatita objekti, ma vua "
+"account ne havas permiso por eliminar la sequanta objekti:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Eliminar la selektita %(objects_name)s eliminos la sequanta protektita "
+"objekti relatita:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ka vu volas eliminar la selektita %(objects_name)s? Omna sequanta objekti ed "
+"olia relatita objekti eliminesos:"
+
+msgid "Change"
+msgstr "Modifikar"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Agregar altra %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Ka eliminar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Per %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeli en la %(name)s apliko"
+
+msgid "You don't have permission to edit anything."
+msgstr "Vu ne havas permiso por facar modifiki."
+
+msgid "Recent Actions"
+msgstr "Recenta agi"
+
+msgid "My Actions"
+msgstr "Mea agi"
+
+msgid "None available"
+msgstr "Nulo disponebla"
+
+msgid "Unknown content"
+msgstr "Nekonocata kontenajo"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Vua datumaro instaluro esas defektiva. Verifikez ke la datumaro tabeli "
+"kreadesis e ke la uzero havas permiso por lektar la datumaro."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Ka vu obliviis vua pasvorto od uzer-nomo?"
+
+msgid "Date/time"
+msgstr "Dato/horo"
+
+msgid "User"
+msgstr "Uzero"
+
+msgid "Action"
+msgstr "Ago"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ica objekto ne havas chanjo-historio. Olu forsan ne agregesis per ica "
+"administrala ret-situo."
+
+msgid "Show all"
+msgstr "Montrar omni"
+
+msgid "Save"
+msgstr "Salvar"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Serchar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resulto"
+msgstr[1] "%(counter)s resulti"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totala"
+
+msgid "Save as new"
+msgstr "Salvar kom nova"
+
+msgid "Save and add another"
+msgstr "Salvar ed agregar altra"
+
+msgid "Save and continue editing"
+msgstr "Salvar e durar la modifiko"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Danko pro vua spensita tempo en la ret-situo hodie."
+
+msgid "Log in again"
+msgstr "Ristartar sesiono"
+
+msgid "Password change"
+msgstr "Pasvorto chanjo"
+
+msgid "Your password was changed."
+msgstr "Vua pasvorto chanjesis."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por kauciono, skribez vua anta pasvorto e pos skribez vua nova pasvorto "
+"dufoye por verifikar ke olu skribesis korekte."
+
+msgid "Change my password"
+msgstr "Modifikar mea pasvorto"
+
+msgid "Password reset"
+msgstr "Pasvorto chanjo"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vua pasvorto chanjesis. Vu darfas startar sesiono nun."
+
+msgid "Password reset confirmation"
+msgstr "Pasvorto chanjo konfirmo"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Skribez vua nova pasvorto dufoye por verifikar ke olu skribesis korekte."
+
+msgid "New password:"
+msgstr "Nova pasvorto:"
+
+msgid "Confirm password:"
+msgstr "Konfirmez pasvorto:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"La link por chanjar pasvorto ne esis valida, forsan pro ke olu ja uzesis. "
+"Demandez nova pasvorto chanjo."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Se vu ne recevas mesajo, verifikez ke vu skribis la sama e-posto adreso "
+"uzita por vua registro e lektez vua spam mesaji."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Vu esas recevanta ica mesajo pro ke vu demandis pasvorto chanjo por vua "
+"uzero account che %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Irez al sequanta pagino e selektez nova pasvorto:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Vua uzernomo, se vu obliviis olu:"
+
+msgid "Thanks for using our site!"
+msgstr "Danko pro uzar nia ret-situo!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "La equipo di %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Ka vu obliviis vua pasvorto? Skribez vua e-posto adreso infre e ni sendos "
+"instrucioni por kreadar nova pasvorto."
+
+msgid "Email address:"
+msgstr "E-postala adreso:"
+
+msgid "Reset my password"
+msgstr "Chanjar mea pasvorto"
+
+msgid "All dates"
+msgstr "Omna dati"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selektar %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selektar %s por chanjar"
+
+msgid "Date:"
+msgstr "Dato:"
+
+msgid "Time:"
+msgstr "Horo:"
+
+msgid "Lookup"
+msgstr "Serchado"
+
+msgid "Currently:"
+msgstr "Aktuale"
+
+msgid "Change:"
+msgstr "Chanjo:"
diff --git a/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..fba64da
--- /dev/null
+++ b/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..d7be82e
--- /dev/null
+++ b/tbc/static/admin/locale/io/LC_MESSAGES/djangojs.po
@@ -0,0 +1,145 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:11+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/"
+"io/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: io\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/is/LC_MESSAGES/django.mo b/tbc/static/admin/locale/is/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..462d890
--- /dev/null
+++ b/tbc/static/admin/locale/is/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/is/LC_MESSAGES/django.po b/tbc/static/admin/locale/is/LC_MESSAGES/django.po
new file mode 100644
index 0000000..104219c
--- /dev/null
+++ b/tbc/static/admin/locale/is/LC_MESSAGES/django.po
@@ -0,0 +1,660 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Hafsteinn Einarsson <haffi67@gmail.com>, 2011-2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kári Tristan Helgason <inactive+einherji@transifex.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Icelandic (http://www.transifex.com/django/django/language/"
+"is/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: is\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Eyddi %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Get ekki eytt %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ertu viss?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Eyða völdum %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Allt"
+
+msgid "Yes"
+msgstr "Já"
+
+msgid "No"
+msgstr "Nei"
+
+msgid "Unknown"
+msgstr "Óþekkt"
+
+msgid "Any date"
+msgstr "Allar dagsetningar"
+
+msgid "Today"
+msgstr "Dagurinn í dag"
+
+msgid "Past 7 days"
+msgstr "Síðustu 7 dagar"
+
+msgid "This month"
+msgstr "Þessi mánuður"
+
+msgid "This year"
+msgstr "Þetta ár"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Vinsamlegast sláðu inn rétt %(username)s og lykilorð fyrir starfsmanna "
+"aðgang. Takið eftir að í báðum reitum skipta há- og lágstafir máli."
+
+msgid "Action:"
+msgstr "Aðgerð:"
+
+msgid "action time"
+msgstr "tími aðgerðar"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "kenni hlutar"
+
+msgid "object repr"
+msgstr "framsetning hlutar"
+
+msgid "action flag"
+msgstr "aðgerðarveifa"
+
+msgid "change message"
+msgstr "breyta skilaboði"
+
+msgid "log entry"
+msgstr "kladdafærsla"
+
+msgid "log entries"
+msgstr "kladdafærslur"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" bætt við."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Breytti \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Eyddi \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry hlutur"
+
+msgid "None"
+msgstr "Ekkert"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Breytti %s."
+
+msgid "and"
+msgstr "og"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Bætti við %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Breytti %(list)s fyrir %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Eyddi %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Engum reitum breytt."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s „%(obj)s“ hefur verið bætt við. Þú getur breytt því aftur að neðan."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s „%(obj)s“ var bætt við."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" hefur verið breytt. Þú getur breytt því aftur að neðan."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" hefur verið breytt. Þú getur bætt við öðru %(name)s að "
+"neðan."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s „%(obj)s“ hefur verið breytt."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Hlutir verða að vera valdir til að framkvæma aðgerðir á þeim. Engu hefur "
+"verið breytt."
+
+msgid "No action selected."
+msgstr "Engin aðgerð valin."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s „%(obj)s“ var eytt."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s hlutur með lykilinn %(key)r er ekki til."
+
+#, python-format
+msgid "Add %s"
+msgstr "Bæta við %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Breyta %s"
+
+msgid "Database error"
+msgstr "Gagnagrunnsvilla"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s var breytt."
+msgstr[1] "%(count)s %(name)s var breytt."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Allir %(total_count)s valdir"
+msgstr[1] "Allir %(total_count)s valdir"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 af %(cnt)s valin"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Breytingarsaga: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django vefstjóri"
+
+msgid "Django administration"
+msgstr "Django vefstjórn"
+
+msgid "Site administration"
+msgstr "Vefstjóri"
+
+msgid "Log in"
+msgstr "Skrá inn"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Síða fannst ekki"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Því miður fannst umbeðin síða ekki."
+
+msgid "Home"
+msgstr "Heim"
+
+msgid "Server error"
+msgstr "Kerfisvilla"
+
+msgid "Server error (500)"
+msgstr "Kerfisvilla (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Kerfisvilla <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Keyra valda aðgerð"
+
+msgid "Go"
+msgstr "Áfram"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Smelltu hér til að velja alla hluti"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Velja alla %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Hreinsa val"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Fyrst, settu inn notendanafn og lykilorð. Svo geturðu breytt öðrum "
+"notendamöguleikum."
+
+msgid "Enter a username and password."
+msgstr "Sláðu inn notandanafn og lykilorð."
+
+msgid "Change password"
+msgstr "Breyta lykilorði"
+
+msgid "Please correct the error below."
+msgstr "Vinsamlegast leiðréttu villurnar hér að neðan:"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Settu inn nýtt lykilorð fyrir notandann <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Velkomin(n),"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Skjölun"
+
+msgid "Log out"
+msgstr "Skrá út"
+
+msgid "Add"
+msgstr "Bæta við"
+
+msgid "History"
+msgstr "Saga"
+
+msgid "View on site"
+msgstr "Skoða á vef"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Bæta við %(name)s"
+
+msgid "Filter"
+msgstr "Sía"
+
+msgid "Remove from sorting"
+msgstr "Taka úr röðun"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Forgangur röðunar: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Röðun af/á"
+
+msgid "Delete"
+msgstr "Eyða"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eyðing á %(object_name)s „%(escaped_object)s“ hefði í för með sér eyðingu á "
+"tengdum hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Að eyða %(object_name)s ' %(escaped_object)s ' þyrfti að eyða eftirfarandi "
+"tengdum hlutum:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ertu viss um að þú viljir eyða %(object_name)s „%(escaped_object)s“? Öllu "
+"eftirfarandi verður eytt:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Já ég er viss."
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Eyða mörgum hlutum."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Að eyða völdu %(objects_name)s leiðir til þess að skyldum hlutum er eytt, en "
+"þinn aðgangur hefur ekki réttindi til að eyða eftirtöldum hlutum:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Að eyða völdum %(objects_name)s myndi leiða til þess að eftirtöldum skyldum "
+"hlutum yrði eytt:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ertu viss um að þú viljir eyða völdum %(objects_name)s? Öllum eftirtöldum "
+"hlutum og skyldum hlutum verður eytt:"
+
+msgid "Change"
+msgstr "Breyta"
+
+msgid "Remove"
+msgstr "Fjarlægja"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Bæta við öðrum %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Eyða?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Eftir %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Þú hefur ekki réttindi til að breyta neinu"
+
+msgid "Recent Actions"
+msgstr "Nýlegar aðgerðir"
+
+msgid "My Actions"
+msgstr "Mínar aðgerðir"
+
+msgid "None available"
+msgstr "Engin fáanleg"
+
+msgid "Unknown content"
+msgstr "Óþekkt innihald"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Eitthvað er að gagnagrunnsuppsetningu. Gakktu úr skuggum um að allar töflur "
+"séu til staðar og að notandinn hafi aðgang að grunninum."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Gleymt notandanafn eða lykilorð?"
+
+msgid "Date/time"
+msgstr "Dagsetning/tími"
+
+msgid "User"
+msgstr "Notandi"
+
+msgid "Action"
+msgstr "Aðgerð"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á "
+"þessu stjórnunarsvæði."
+
+msgid "Show all"
+msgstr "Sýna allt"
+
+msgid "Save"
+msgstr "Vista"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Leita"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s niðurstaða"
+msgstr[1] "%(counter)s niðurstöður"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s í heildina"
+
+msgid "Save as new"
+msgstr "Vista sem nýtt"
+
+msgid "Save and add another"
+msgstr "Vista og búa til nýtt"
+
+msgid "Save and continue editing"
+msgstr "Vista og halda áfram að breyta"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk fyrir að verja tíma í vefsíðuna í dag."
+
+msgid "Log in again"
+msgstr "Skráðu þig inn aftur"
+
+msgid "Password change"
+msgstr "Breyta lykilorði"
+
+msgid "Your password was changed."
+msgstr "Lykilorði þínu var breytt"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja "
+"lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki "
+"gert innsláttarvillu."
+
+msgid "Change my password"
+msgstr "Breyta lykilorðinu mínu"
+
+msgid "Password reset"
+msgstr "Endurstilla lykilorð"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Lykilorðið var endurstillt. Þú getur núna skráð þig inn á vefsvæðið."
+
+msgid "Password reset confirmation"
+msgstr "Staðfesting endurstillingar lykilorðs"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Vinsamlegast settu inn nýja lykilorðið tvisvar til að forðast "
+"innsláttarvillur."
+
+msgid "New password:"
+msgstr "Nýtt lykilorð:"
+
+msgid "Confirm password:"
+msgstr "Staðfestu lykilorð:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Endurstilling lykilorðs tókst ekki. Slóðin var ógild. Hugsanlega hefur hún "
+"nú þegar verið notuð. Vinsamlegast biddu um nýja endurstillingu."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Vinsamlegast farðu á eftirfarandi síðu og veldu nýtt lykilorð:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:"
+
+msgid "Thanks for using our site!"
+msgstr "Takk fyrir að nota vefinn okkar!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s hópurinn"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Endursstilla lykilorðið mitt"
+
+msgid "All dates"
+msgstr "Allar dagsetningar"
+
+#, python-format
+msgid "Select %s"
+msgstr "Veldu %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Veldu %s til að breyta"
+
+msgid "Date:"
+msgstr "Dagsetning:"
+
+msgid "Time:"
+msgstr "Tími:"
+
+msgid "Lookup"
+msgstr "Fletta upp"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ba6c034
--- /dev/null
+++ b/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..88da0c9
--- /dev/null
+++ b/tbc/static/admin/locale/is/LC_MESSAGES/djangojs.po
@@ -0,0 +1,163 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# gudbergur <gudbergur@gmail.com>, 2012
+# Hafsteinn Einarsson <haffi67@gmail.com>, 2011-2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Icelandic (http://www.transifex.com/django/django/language/"
+"is/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: is\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Fáanleg %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Þetta er listi af því %s sem er í boði. Þú getur ákveðið hluti með því að "
+"velja þá í boxinu að neðan og ýta svo á \"Velja\" örina milli boxana tveggja."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Skrifaðu í boxið til að sía listann af því %s sem er í boði."
+
+msgid "Filter"
+msgstr "Sía"
+
+msgid "Choose all"
+msgstr "Velja öll"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Smelltu til að velja allt %s í einu."
+
+msgid "Choose"
+msgstr "Veldu"
+
+msgid "Remove"
+msgstr "Fjarlægja"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valin %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Þetta er listinn af völdu %s. Þú getur fjarlægt hluti með því að velja þá í "
+"boxinu að neðan og ýta svo á \"Eyða\" örina á milli boxana tveggja."
+
+msgid "Remove all"
+msgstr "Eyða öllum"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Smelltu til að fjarlægja allt valið %s í einu."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] " %(sel)s í %(cnt)s valin"
+msgstr[1] " %(sel)s í %(cnt)s valin"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Enn eru óvistaðar breytingar í reitum. Ef þú keyrir aðgerð munu breytingar "
+"ekki verða vistaðar."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Þú hefur valið aðgerð en hefur ekki vistað breytingar á reitum. Vinsamlegast "
+"veldu 'Í lagi' til að vista. Þú þarft að endurkeyra aðgerðina."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Þú hefur valið aðgerð en hefur ekki gert breytingar á reitum. Þú ert líklega "
+"að leita að 'Fara' hnappnum frekar en 'Vista' hnappnum."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Núna"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Veldu tíma"
+
+msgid "Midnight"
+msgstr "Miðnætti"
+
+msgid "6 a.m."
+msgstr "6 f.h."
+
+msgid "Noon"
+msgstr "Hádegi"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Hætta við"
+
+msgid "Today"
+msgstr "Í dag"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Í gær"
+
+msgid "Tomorrow"
+msgstr "Á morgun"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"janúar febrúar mars apríl maí júní júlí ágúst september október nóvember "
+"desember"
+
+msgid "S M T W T F S"
+msgstr "S M Þ M F F L"
+
+msgid "Show"
+msgstr "Sýna"
+
+msgid "Hide"
+msgstr "Fela"
diff --git a/tbc/static/admin/locale/it/LC_MESSAGES/django.mo b/tbc/static/admin/locale/it/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1dbded2
--- /dev/null
+++ b/tbc/static/admin/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/it/LC_MESSAGES/django.po b/tbc/static/admin/locale/it/LC_MESSAGES/django.po
new file mode 100644
index 0000000..db0bf76
--- /dev/null
+++ b/tbc/static/admin/locale/it/LC_MESSAGES/django.po
@@ -0,0 +1,689 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Denis Darii <denis.darii@gmail.com>, 2011
+# Flavio Curella <flavio.curella@gmail.com>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Marco Bonetti, 2014
+# Nicola Larosa <transifex@teknico.net>, 2013
+# palmux <palmux@gmail.com>, 2014-2015
+# Mattia Procopio <promat85@gmail.com>, 2015
+# Stefano Brentegani <sbrentegani@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-27 20:29+0000\n"
+"Last-Translator: palmux <palmux@gmail.com>\n"
+"Language-Team: Italian (http://www.transifex.com/django/django/language/"
+"it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Cancellati/e con successo %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Impossibile cancellare %(name)s "
+
+msgid "Are you sure?"
+msgstr "Confermi?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Cancella %(verbose_name_plural)s selezionati"
+
+msgid "Administration"
+msgstr "Amministrazione"
+
+msgid "All"
+msgstr "Tutti"
+
+msgid "Yes"
+msgstr "Sì"
+
+msgid "No"
+msgstr "No"
+
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+msgid "Any date"
+msgstr "Qualsiasi data"
+
+msgid "Today"
+msgstr "Oggi"
+
+msgid "Past 7 days"
+msgstr "Ultimi 7 giorni"
+
+msgid "This month"
+msgstr "Questo mese"
+
+msgid "This year"
+msgstr "Quest'anno"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Inserisci %(username)s e password corretti per un account di staff. Nota che "
+"entrambi i campi distinguono maiuscole e minuscole."
+
+msgid "Action:"
+msgstr "Azione:"
+
+msgid "action time"
+msgstr "momento dell'azione"
+
+msgid "user"
+msgstr "utente"
+
+msgid "content type"
+msgstr "content type"
+
+msgid "object id"
+msgstr "id dell'oggetto"
+
+msgid "object repr"
+msgstr "rappr. dell'oggetto"
+
+msgid "action flag"
+msgstr "flag di azione"
+
+msgid "change message"
+msgstr "messaggio di modifica"
+
+msgid "log entry"
+msgstr "voce di log"
+
+msgid "log entries"
+msgstr "voci di log"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Aggiunto \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Cambiato \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Cancellato \"%(object)s .\""
+
+msgid "LogEntry Object"
+msgstr "Oggetto LogEntry"
+
+msgid "None"
+msgstr "Nessuno"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Tieni premuto \"Control\", o \"Command\" su Mac, per selezionarne più di uno."
+
+msgid "Added."
+msgstr "Aggiunto."
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s modificato."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Aggiunto %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Cambiato %(list)s per %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Cancellato %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nessun campo modificato."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" aggiunto correttamente. Puoi modificarlo ancora qui "
+"sotto."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" è stato inserito correttamente. Puoi aggiungere un "
+"altro %(name)s qui di seguito."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" aggiunto correttamente."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" è stato modificato correttamente. Puoi modificarlo di "
+"nuovo qui di seguito."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" è stato modificato correttamente. Puoi aggiungere un "
+"altro %(name)s qui di seguito."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" modificato correttamente."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Occorre selezionare degli oggetti per potervi eseguire azioni. Nessun "
+"oggetto è stato cambiato."
+
+msgid "No action selected."
+msgstr "Nessuna azione selezionata."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" cancellato correttamente."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "L'oggetto %(name)s con chiave primaria %(key)r non esiste."
+
+#, python-format
+msgid "Add %s"
+msgstr "Aggiungi %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modifica %s"
+
+msgid "Database error"
+msgstr "Errore del database"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s modificato correttamente."
+msgstr[1] "%(count)s %(name)s modificati correttamente."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selezionato"
+msgstr[1] "Tutti i %(total_count)s selezionati"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 di %(cnt)s selezionati"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Tracciato delle modifiche: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"La cancellazione di %(class_name)s %(instance)s richiederebbe l'eliminazione "
+"dei seguenti oggetti protetti correlati: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Amministrazione sito Django"
+
+msgid "Django administration"
+msgstr "Amministrazione Django"
+
+msgid "Site administration"
+msgstr "Amministrazione sito"
+
+msgid "Log in"
+msgstr "Accedi"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Amministrazione %(app)s"
+
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Spiacenti, ma la pagina richiesta non è stata trovata."
+
+msgid "Home"
+msgstr "Pagina iniziale"
+
+msgid "Server error"
+msgstr "Errore del server"
+
+msgid "Server error (500)"
+msgstr "Errore del server (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Errore del server <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Si è verificato un errore. Gli amministratori del sito ne sono stati "
+"informati per email, e vi porranno rimedio a breve. Grazie per la vostra "
+"pazienza."
+
+msgid "Run the selected action"
+msgstr "Esegui l'azione selezionata"
+
+msgid "Go"
+msgstr "Vai"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Clicca qui per selezionare gli oggetti da tutte le pagine."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Seleziona tutti %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Annulla la selezione"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Prima di tutto inserisci nome utente e password. Poi potrai modificare le "
+"altre impostazioni utente."
+
+msgid "Enter a username and password."
+msgstr "Inserisci nome utente e password."
+
+msgid "Change password"
+msgstr "Modifica password"
+
+msgid "Please correct the error below."
+msgstr "Correggi l'errore qui sotto."
+
+msgid "Please correct the errors below."
+msgstr "Correggi gli errori qui sotto."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Inserisci una nuova password per l'utente <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Benvenuto,"
+
+msgid "View site"
+msgstr "Visualizza il sito"
+
+msgid "Documentation"
+msgstr "Documentazione"
+
+msgid "Log out"
+msgstr "Annulla l'accesso"
+
+msgid "Add"
+msgstr "Aggiungi"
+
+msgid "History"
+msgstr "Storia"
+
+msgid "View on site"
+msgstr "Vedi sul sito"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Aggiungi %(name)s"
+
+msgid "Filter"
+msgstr "Filtra"
+
+msgid "Remove from sorting"
+msgstr "Elimina dall'ordinamento"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Priorità d'ordinamento: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Abilita/disabilita ordinamento"
+
+msgid "Delete"
+msgstr "Cancella"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"La cancellazione di %(object_name)s '%(escaped_object)s' causerebbe la "
+"cancellazione di oggetti collegati, ma questo account non ha i permessi per "
+"cancellare i seguenti tipi di oggetti:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"La cancellazione di %(object_name)s '%(escaped_object)s' richiederebbe "
+"l'eliminazione dei seguenti oggetti protetti correlati:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sicuro di voler cancellare %(object_name)s \"%(escaped_object)s\"? Tutti i "
+"seguenti oggetti collegati verranno cancellati:"
+
+msgid "Objects"
+msgstr "Oggetti"
+
+msgid "Yes, I'm sure"
+msgstr "Sì, sono sicuro"
+
+msgid "No, take me back"
+msgstr "No, torna indietro"
+
+msgid "Delete multiple objects"
+msgstr "Cancella più oggetti"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Per eliminare l'elemento %(objects_name)s selezionato è necessario rimuovere "
+"anche gli oggetti correlati, ma il tuo account non dispone "
+"dell'autorizzazione a eliminare i seguenti tipi di oggetti:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"L'eliminazione dell'elemento %(objects_name)s selezionato richiederebbe la "
+"rimozione dei seguenti oggetti protetti correlati:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Confermi la cancellazione dell'elemento %(objects_name)s selezionato? "
+"Saranno rimossi tutti i seguenti oggetti e le loro voci correlate:"
+
+msgid "Change"
+msgstr "Modifica"
+
+msgid "Remove"
+msgstr "Elimina"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Aggiungi un altro %(verbose_name)s."
+
+msgid "Delete?"
+msgstr "Cancellare?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Per %(filter_title)s "
+
+msgid "Summary"
+msgstr "Riepilogo"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelli nell'applicazione %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Non hai i privilegi per modificare nulla."
+
+msgid "Recent Actions"
+msgstr "Azioni Recenti"
+
+msgid "My Actions"
+msgstr "Le Mie Azioni"
+
+msgid "None available"
+msgstr "Nulla disponibile"
+
+msgid "Unknown content"
+msgstr "Contenuto sconosciuto"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Ci sono problemi nell'installazione del database. Assicurarsi che le tabelle "
+"appropriate del database siano state create, e che il database sia leggibile "
+"dall'utente appropriato."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Ti sei autenticato come %(username)s, ma non sei autorizzato ad accedere a "
+"questa pagina. Vorresti autenticarti con un altro account?"
+
+msgid "Forgotten your password or username?"
+msgstr "Hai dimenticato la password o lo username?"
+
+msgid "Date/time"
+msgstr "Data/ora"
+
+msgid "User"
+msgstr "Utente"
+
+msgid "Action"
+msgstr "Azione"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato "
+"creato con questo sito di amministrazione."
+
+msgid "Show all"
+msgstr "Mostra tutto"
+
+msgid "Save"
+msgstr "Salva"
+
+msgid "Popup closing..."
+msgstr "Chiusura popup..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Modifica la selezione %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Aggiungi un altro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Elimina la selezione %(model)s"
+
+msgid "Search"
+msgstr "Cerca"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s risultato"
+msgstr[1] "%(counter)s risultati"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s in tutto"
+
+msgid "Save as new"
+msgstr "Salva come nuovo"
+
+msgid "Save and add another"
+msgstr "Salva e aggiungi un altro"
+
+msgid "Save and continue editing"
+msgstr "Salva e continua le modifiche"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazie per aver speso il tuo tempo prezioso su questo sito oggi."
+
+msgid "Log in again"
+msgstr "Accedi di nuovo"
+
+msgid "Password change"
+msgstr "Cambio password"
+
+msgid "Your password was changed."
+msgstr "La tua password è stata cambiata."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Inserisci la password attuale, per ragioni di sicurezza, e poi la nuova "
+"password due volte, per verificare di averla scritta correttamente."
+
+msgid "Change my password"
+msgstr "Modifica la mia password"
+
+msgid "Password reset"
+msgstr "Reimposta la password"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "La tua password è stata impostata. Ora puoi effettuare l'accesso."
+
+msgid "Password reset confirmation"
+msgstr "Conferma reimpostazione password"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Inserisci la nuova password due volte, per verificare di averla scritta "
+"correttamente."
+
+msgid "New password:"
+msgstr "Nuova password:"
+
+msgid "Confirm password:"
+msgstr "Conferma la password:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Il link per la reimpostazione della password non era valido, forse perché "
+"era già stato usato. Richiedi una nuova reimpostazione della password."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Abbiamo inviato istruzioni per impostare la password all'indirizzo email che "
+"hai indicato. Dovresti riceverle a breve a patto che l'indirizzo che hai "
+"inserito sia valido."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Se non ricevi un messaggio email, accertati di aver inserito l'indirizzo con "
+"cui ti sei registrato, e controlla la cartella dello spam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Ricevi questa mail perché hai richiesto di reimpostare la password del tuo "
+"account utente presso %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Vai alla pagina seguente e scegli una nuova password:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:"
+
+msgid "Thanks for using our site!"
+msgstr "Grazie per aver usato il nostro sito!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Il team di %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Password dimenticata? Inserisci il tuo indirizzo email qui sotto, e ti "
+"invieremo istruzioni per impostarne una nuova."
+
+msgid "Email address:"
+msgstr "Indirizzo email:"
+
+msgid "Reset my password"
+msgstr "Reimposta la mia password"
+
+msgid "All dates"
+msgstr "Tutte le date"
+
+#, python-format
+msgid "Select %s"
+msgstr "Scegli %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Scegli %s da modificare"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Ora:"
+
+msgid "Lookup"
+msgstr "Consultazione"
+
+msgid "Currently:"
+msgstr "Attualmente:"
+
+msgid "Change:"
+msgstr "Modifica:"
diff --git a/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0e21708
--- /dev/null
+++ b/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f16ad3b
--- /dev/null
+++ b/tbc/static/admin/locale/it/LC_MESSAGES/djangojs.po
@@ -0,0 +1,168 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Denis Darii <denis.darii@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Marco Bonetti, 2014
+# Nicola Larosa <transifex@teknico.net>, 2011-2012
+# palmux <palmux@gmail.com>, 2015
+# Stefano Brentegani <sbrentegani@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-18 18:22+0000\n"
+"Last-Translator: palmux <palmux@gmail.com>\n"
+"Language-Team: Italian (http://www.transifex.com/django/django/language/"
+"it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponibili"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Questa è la lista dei %s disponibili. Puoi sceglierne alcuni selezionandoli "
+"nella casella qui sotto e poi facendo clic sulla freccia \"Scegli\" tra le "
+"due caselle."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Scrivi in questa casella per filtrare l'elenco dei %s disponibili."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Scegli tutto"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Fai clic per scegliere tutti i %s in una volta."
+
+msgid "Choose"
+msgstr "Scegli"
+
+msgid "Remove"
+msgstr "Elimina"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s scelti"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Questa è la lista dei %s scelti. Puoi eliminarne alcuni selezionandoli nella "
+"casella qui sotto e poi facendo clic sulla freccia \"Elimina\" tra le due "
+"caselle."
+
+msgid "Remove all"
+msgstr "Elimina tutti"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Fai clic per eliminare tutti i %s in una volta."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s di %(cnt)s selezionato"
+msgstr[1] "%(sel)s di %(cnt)s selezionati"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Ci sono aggiornamenti non salvati su singoli campi modificabili. Se esegui "
+"un'azione, le modifiche non salvate andranno perse."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Hai selezionato un'azione, ma non hai ancora salvato le modifiche apportate "
+"a campi singoli. Fai clic su OK per salvare. Poi dovrai ri-eseguire l'azione."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Hai selezionato un'azione, e non hai ancora apportato alcuna modifica a "
+"campi singoli. Probabilmente stai cercando il pulsante Go, invece di Save."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Nota: Sei %s ora in anticipo rispetto al server."
+msgstr[1] "Nota: Sei %s ore in anticipo rispetto al server."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Nota: Sei %s ora in ritardo rispetto al server."
+msgstr[1] "Nota: Sei %s ore in ritardo rispetto al server."
+
+msgid "Now"
+msgstr "Adesso"
+
+msgid "Choose a Time"
+msgstr "Scegli un orario"
+
+msgid "Choose a time"
+msgstr "Scegli un orario"
+
+msgid "Midnight"
+msgstr "Mezzanotte"
+
+msgid "6 a.m."
+msgstr "6 del mattino"
+
+msgid "Noon"
+msgstr "Mezzogiorno"
+
+msgid "6 p.m."
+msgstr "6 del pomeriggio"
+
+msgid "Cancel"
+msgstr "Annulla"
+
+msgid "Today"
+msgstr "Oggi"
+
+msgid "Choose a Date"
+msgstr "Scegli una data"
+
+msgid "Yesterday"
+msgstr "Ieri"
+
+msgid "Tomorrow"
+msgstr "Domani"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre "
+"novembre dicembre"
+
+msgid "S M T W T F S"
+msgstr "D L M M G V S"
+
+msgid "Show"
+msgstr "Mostra"
+
+msgid "Hide"
+msgstr "Nascondi"
diff --git a/tbc/static/admin/locale/ja/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ja/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8ed4f4c
--- /dev/null
+++ b/tbc/static/admin/locale/ja/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ja/LC_MESSAGES/django.po b/tbc/static/admin/locale/ja/LC_MESSAGES/django.po
new file mode 100644
index 0000000..406d9d8
--- /dev/null
+++ b/tbc/static/admin/locale/ja/LC_MESSAGES/django.po
@@ -0,0 +1,670 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Shinya Okano <tokibito@gmail.com>, 2012-2015
+# Tetsuya Morimoto <tetsuya.morimoto@gmail.com>, 2011
+# 上田慶祐 <kei.mokusyun@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-28 03:04+0000\n"
+"Last-Translator: Shinya Okano <tokibito@gmail.com>\n"
+"Language-Team: Japanese (http://www.transifex.com/django/django/language/"
+"ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d 個の %(items)s を削除しました。"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s が削除できません"
+
+msgid "Are you sure?"
+msgstr "よろしいですか?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "選択された %(verbose_name_plural)s の削除"
+
+msgid "Administration"
+msgstr "管理"
+
+msgid "All"
+msgstr "全て"
+
+msgid "Yes"
+msgstr "はい"
+
+msgid "No"
+msgstr "いいえ"
+
+msgid "Unknown"
+msgstr "不明"
+
+msgid "Any date"
+msgstr "いつでも"
+
+msgid "Today"
+msgstr "今日"
+
+msgid "Past 7 days"
+msgstr "過去 7 日間"
+
+msgid "This month"
+msgstr "今月"
+
+msgid "This year"
+msgstr "今年"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"スタッフアカウントの正しい%(username)sとパスワードを入力してください。どちら"
+"のフィールドも大文字と小文字は区別されます。"
+
+msgid "Action:"
+msgstr "操作:"
+
+msgid "action time"
+msgstr "操作時刻"
+
+msgid "user"
+msgstr "ユーザー"
+
+msgid "content type"
+msgstr "コンテンツタイプ"
+
+msgid "object id"
+msgstr "オブジェクト ID"
+
+msgid "object repr"
+msgstr "オブジェクトの文字列表現"
+
+msgid "action flag"
+msgstr "操作種別"
+
+msgid "change message"
+msgstr "変更メッセージ"
+
+msgid "log entry"
+msgstr "ログエントリー"
+
+msgid "log entries"
+msgstr "ログエントリー"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" を追加しました。"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" を変更しました - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\"を削除しました。"
+
+msgid "LogEntry Object"
+msgstr "ログエントリー オブジェクト"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"複数選択するときには Control キーを押したまま選択してください。Mac では "
+"Command キーを使ってください"
+
+msgid "Added."
+msgstr "追加されました。"
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s を変更しました。"
+
+msgid "and"
+msgstr "と"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\"を追加しました。"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" の %(list)s を変更しました。"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" を削除しました。"
+
+msgid "No fields changed."
+msgstr "変更はありませんでした。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" を追加しました。続けて編集できます。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" を追加しました。 別の %(name)s を以下から追加できます。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" を追加しました。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" を変更しました。 以下から再度編集できます。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" を変更しました。 別の %(name)s を以下から追加できます。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" を変更しました。"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"操作を実行するには、対象を選択する必要があります。何も変更されませんでした。"
+
+msgid "No action selected."
+msgstr "操作が選択されていません。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" を削除しました。"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "主キーが %(key)r である %(name)s オブジェクトは存在しません。"
+
+#, python-format
+msgid "Add %s"
+msgstr "%s を追加"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s を変更"
+
+msgid "Database error"
+msgstr "データベースエラー"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s 個の %(name)s を変更しました。"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s 個選択されました"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s個の内ひとつも選択されていません"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "変更履歴: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s %(instance)s を削除するには以下の保護された関連オブジェクトを"
+"削除することになります: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django サイト管理"
+
+msgid "Django administration"
+msgstr "Django 管理サイト"
+
+msgid "Site administration"
+msgstr "サイト管理"
+
+msgid "Log in"
+msgstr "ログイン"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s 管理"
+
+msgid "Page not found"
+msgstr "ページが見つかりません"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。"
+
+msgid "Home"
+msgstr "ホーム"
+
+msgid "Server error"
+msgstr "サーバーエラー"
+
+msgid "Server error (500)"
+msgstr "サーバーエラー (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "サーバーエラー <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"エラーが発生しました。サイト管理者にメールで報告されたので、修正されるまでし"
+"ばらくお待ちください。"
+
+msgid "Run the selected action"
+msgstr "選択された操作を実行"
+
+msgid "Go"
+msgstr "実行"
+
+msgid "Click here to select the objects across all pages"
+msgstr "全ページの項目を選択するにはここをクリック"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "%(total_count)s個ある%(module_name)s を全て選択"
+
+msgid "Clear selection"
+msgstr "選択を解除"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"まずユーザー名とパスワードを登録してください。その後詳細情報が編集可能になり"
+"ます。"
+
+msgid "Enter a username and password."
+msgstr "ユーザー名とパスワードを入力してください。"
+
+msgid "Change password"
+msgstr "パスワードの変更"
+
+msgid "Please correct the error below."
+msgstr "下記のエラーを修正してください。"
+
+msgid "Please correct the errors below."
+msgstr "下記のエラーを修正してください。"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"<strong>%(username)s</strong>さんの新しいパスワードを入力してください。"
+
+msgid "Welcome,"
+msgstr "ようこそ"
+
+msgid "View site"
+msgstr "サイトを表示"
+
+msgid "Documentation"
+msgstr "ドキュメント"
+
+msgid "Log out"
+msgstr "ログアウト"
+
+msgid "Add"
+msgstr "追加"
+
+msgid "History"
+msgstr "履歴"
+
+msgid "View on site"
+msgstr "サイト上で表示"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s を追加"
+
+msgid "Filter"
+msgstr "フィルター"
+
+msgid "Remove from sorting"
+msgstr "ソート条件から外します"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "ソート優先順位: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "昇順降順を切り替えます"
+
+msgid "Delete"
+msgstr "削除"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' の削除時に関連づけられたオブジェクトも削"
+"除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除"
+"するパーミッションがありません:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' を削除するには以下の保護された関連オブ"
+"ジェクトを削除することになります:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\"を削除しますか? 関連づけられている以下"
+"のオブジェクトも全て削除されます:"
+
+msgid "Objects"
+msgstr "オブジェクト"
+
+msgid "Yes, I'm sure"
+msgstr "はい"
+
+msgid "No, take me back"
+msgstr "戻る"
+
+msgid "Delete multiple objects"
+msgstr "複数のオブジェクトを削除します"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"選択した %(objects_name)s を削除すると関連するオブジェクトも削除しますが、あ"
+"なたのアカウントは以下のオブジェクト型を削除する権限がありません:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"選択した %(objects_name)s を削除すると以下の保護された関連オブジェクトを削除"
+"することになります:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"本当に選択した %(objects_name)s を削除しますか? 以下の全てのオブジェクトと関"
+"連する要素が削除されます:"
+
+msgid "Change"
+msgstr "変更"
+
+msgid "Remove"
+msgstr "削除"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "%(verbose_name)s の追加"
+
+msgid "Delete?"
+msgstr "削除しますか?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s で絞り込む"
+
+msgid "Summary"
+msgstr "概要"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s アプリケーション内のモデル"
+
+msgid "You don't have permission to edit anything."
+msgstr "変更のためのパーミッションがありません。"
+
+msgid "Recent Actions"
+msgstr "最近行った操作"
+
+msgid "My Actions"
+msgstr "操作"
+
+msgid "None available"
+msgstr "利用不可"
+
+msgid "Unknown content"
+msgstr "不明なコンテント"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"データベースの設定に問題があるようです。適切なテーブルが作られていること、適"
+"切なユーザーでデータベースのデータを読み込めることを確認してください。"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"あなたは %(username)s として認証されましたが、このページへのアクセス許可があ"
+"りません。他のアカウントでログインしますか?"
+
+msgid "Forgotten your password or username?"
+msgstr "パスワードまたはユーザー名を忘れましたか?"
+
+msgid "Date/time"
+msgstr "日付/時刻"
+
+msgid "User"
+msgstr "ユーザー"
+
+msgid "Action"
+msgstr "操作"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも"
+"のではありません。"
+
+msgid "Show all"
+msgstr "全件表示"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Popup closing..."
+msgstr "ポップアップを閉じています..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "選択された %(model)s の変更"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "%(model)s の追加"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "選択された %(model)s を削除"
+
+msgid "Search"
+msgstr "検索"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "結果 %(counter)s"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "全 %(full_result_count)s 件"
+
+msgid "Save as new"
+msgstr "新規保存"
+
+msgid "Save and add another"
+msgstr "保存してもう一つ追加"
+
+msgid "Save and continue editing"
+msgstr "保存して編集を続ける"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ご利用ありがとうございました。"
+
+msgid "Log in again"
+msgstr "もう一度ログイン"
+
+msgid "Password change"
+msgstr "パスワードの変更"
+
+msgid "Your password was changed."
+msgstr "あなたのパスワードは変更されました"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正"
+"しく入力したか確認できるように二度入力してください。"
+
+msgid "Change my password"
+msgstr "パスワードの変更"
+
+msgid "Password reset"
+msgstr "パスワードをリセット"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "パスワードがセットされました。ログインしてください。"
+
+msgid "Password reset confirmation"
+msgstr "パスワードリセットの確認"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "確認のために、新しいパスワードを二回入力してください。"
+
+msgid "New password:"
+msgstr "新しいパスワード:"
+
+msgid "Confirm password:"
+msgstr "新しいパスワード (確認用) :"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"パスワードリセットのリンクが不正です。おそらくこのリンクは既に使われていま"
+"す。もう一度パスワードリセットしてください。"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"入力されたメールアドレスを持つアカウントが存在する場合、パスワードを設定する"
+"ためのメールを送信しました。すぐに受け取る必要があります。"
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"メールが届かない場合は、登録したメールアドレスを入力したか確認し、スパムフォ"
+"ルダに入っていないか確認してください。"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"このメールは %(site_name)s で、あなたのアカウントのパスワードリセットが要求さ"
+"れたため、送信されました。"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "次のページで新しいパスワードを選んでください:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "あなたのユーザー名 (念のため):"
+
+msgid "Thanks for using our site!"
+msgstr "ご利用ありがとうございました!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr " %(site_name)s チーム"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"パスワードを忘れましたか? メールアドレスを以下に入力すると、新しいパスワード"
+"の設定方法をお知らせします。"
+
+msgid "Email address:"
+msgstr "メールアドレス:"
+
+msgid "Reset my password"
+msgstr "パスワードをリセット"
+
+msgid "All dates"
+msgstr "いつでも"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s を選択"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "変更する %s を選択"
+
+msgid "Date:"
+msgstr "日付:"
+
+msgid "Time:"
+msgstr "時刻:"
+
+msgid "Lookup"
+msgstr "検索"
+
+msgid "Currently:"
+msgstr "現在の値:"
+
+msgid "Change:"
+msgstr "変更後:"
diff --git a/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..dc98eee
--- /dev/null
+++ b/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f53365f
--- /dev/null
+++ b/tbc/static/admin/locale/ja/LC_MESSAGES/djangojs.po
@@ -0,0 +1,157 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Shinya Okano <tokibito@gmail.com>, 2012,2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-31 12:08+0000\n"
+"Last-Translator: Shinya Okano <tokibito@gmail.com>\n"
+"Language-Team: Japanese (http://www.transifex.com/django/django/language/"
+"ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "利用可能 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"これが使用可能な %s のリストです。下のボックスで項目を選択し、2つのボックス間"
+"の \"選択\"の矢印をクリックして、いくつかを選択することができます。"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "使用可能な %s のリストを絞り込むには、このボックスに入力します。"
+
+msgid "Filter"
+msgstr "フィルター"
+
+msgid "Choose all"
+msgstr "全て選択"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "クリックするとすべての %s を選択します。"
+
+msgid "Choose"
+msgstr "選択"
+
+msgid "Remove"
+msgstr "削除"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "選択された %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"これが選択された %s のリストです。下のボックスで選択し、2つのボックス間の "
+"\"削除\"矢印をクリックして一部を削除することができます。"
+
+msgid "Remove all"
+msgstr "すべて削除"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "クリックするとすべての %s を選択から削除します。"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s個中%(sel)s個選択"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"フィールドに未保存の変更があります。操作を実行すると未保存の変更は失われま"
+"す。"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"操作を選択しましたが、フィールドに未保存の変更があります。OKをクリックして保"
+"存してください。その後、操作を再度実行する必要があります。"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"操作を選択しましたが、フィールドに変更はありませんでした。もしかして保存ボタ"
+"ンではなくて実行ボタンをお探しですか。"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間進んでいます。"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間遅れています。"
+
+msgid "Now"
+msgstr "現在"
+
+msgid "Choose a Time"
+msgstr "時間を選択"
+
+msgid "Choose a time"
+msgstr "時間を選択"
+
+msgid "Midnight"
+msgstr "0時"
+
+msgid "6 a.m."
+msgstr "午前 6 時"
+
+msgid "Noon"
+msgstr "12時"
+
+msgid "6 p.m."
+msgstr "午後 6 時"
+
+msgid "Cancel"
+msgstr "キャンセル"
+
+msgid "Today"
+msgstr "今日"
+
+msgid "Choose a Date"
+msgstr "日付を選択"
+
+msgid "Yesterday"
+msgstr "昨日"
+
+msgid "Tomorrow"
+msgstr "明日"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月"
+
+msgid "S M T W T F S"
+msgstr "日 月 火 水 木 金 土"
+
+msgid "Show"
+msgstr "表示"
+
+msgid "Hide"
+msgstr "非表示"
diff --git a/tbc/static/admin/locale/ka/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ka/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e43bb83
--- /dev/null
+++ b/tbc/static/admin/locale/ka/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ka/LC_MESSAGES/django.po b/tbc/static/admin/locale/ka/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7db8e71
--- /dev/null
+++ b/tbc/static/admin/locale/ka/LC_MESSAGES/django.po
@@ -0,0 +1,671 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# André Bouatchidzé <a@anbz.net>, 2013-2015
+# avsd05 <avsd05@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Georgian (http://www.transifex.com/django/django/language/"
+"ka/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ka\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s წარმატებით წაიშალა."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s ვერ იშლება"
+
+msgid "Are you sure?"
+msgstr "დარწმუნებული ხართ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "არჩეული %(verbose_name_plural)s-ის წაშლა"
+
+msgid "Administration"
+msgstr "ადმინისტრირება"
+
+msgid "All"
+msgstr "ყველა"
+
+msgid "Yes"
+msgstr "კი"
+
+msgid "No"
+msgstr "არა"
+
+msgid "Unknown"
+msgstr "გაურკვეველი"
+
+msgid "Any date"
+msgstr "ნებისმიერი თარიღი"
+
+msgid "Today"
+msgstr "დღეს"
+
+msgid "Past 7 days"
+msgstr "ბოლო 7 დღე"
+
+msgid "This month"
+msgstr "მიმდინარე თვე"
+
+msgid "This year"
+msgstr "მიმდინარე წელი"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"გთხოვთ, შეიყვანოთ სწორი %(username)s და პაროლი პერსონალის ანგარიშისთვის. "
+"იქონიეთ მხედველობაში, რომ ორივე ველი ითვალისწინებს მთავრულს."
+
+msgid "Action:"
+msgstr "მოქმედება:"
+
+msgid "action time"
+msgstr "მოქმედების დრო"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "ობიექტის id"
+
+msgid "object repr"
+msgstr "ობიექტის წარმ."
+
+msgid "action flag"
+msgstr "მოქმედების დროშა"
+
+msgid "change message"
+msgstr "შეცვლის შეტყობინება"
+
+msgid "log entry"
+msgstr "ლოგის ერთეული"
+
+msgid "log entries"
+msgstr "ლოგის ერთეულები"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "დამატებულია \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "შეცვლილია \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "წაშლილია \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "ჟურნალის ჩანაწერის ობიექტი"
+
+msgid "None"
+msgstr "არცერთი"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s შეცვლილია."
+
+msgid "and"
+msgstr "და"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "დამატებულია %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "შეცვლილია %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "წაშლილია %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "არცერთი ველი არ შეცვლილა."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" წარმატებით დაემატა. შეგიძლიათ განაგრძოთ მისი "
+"რედაქტირება."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" წარმატებით იქნა დამატებული. თქვენ შეგიძლიათ დაამატოთ "
+"სხვა %(name)s ქვემოთ."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით დაემატა."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" წარმატებით შეიცვალა. თქვენ შეგიძლიათ ისევ დაარედაქტიროთ "
+"ის ქვემოთ."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" წარმატებით შეიცვალა. თქვენ შეგიძლიათ დაამატოთ სხვა "
+"%(name)s ქვემოთ."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით შეიცვალა."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"ობიექტებზე მოქმედებების შესასრულებლად ისინი არჩეული უნდა იყოს. არცერთი "
+"ობიექტი არჩეული არ არის."
+
+msgid "No action selected."
+msgstr "მოქმედება არჩეული არ არის."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით წაიშალა."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s-ის ობიექტი პირველადი გასაღებით %(key)r არ არსებობს."
+
+#, python-format
+msgid "Add %s"
+msgstr "დავამატოთ %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "შევცვალოთ %s"
+
+msgid "Database error"
+msgstr "მონაცემთა ბაზის შეცდომა"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s წარმატებით შეიცვალა."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s-ია არჩეული"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s-დან არცერთი არჩეული არ არის"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "ცვლილებების ისტორია: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django-ს ადმინისტრირების საიტი"
+
+msgid "Django administration"
+msgstr "Django-ს ადმინისტრირება"
+
+msgid "Site administration"
+msgstr "საიტის ადმინისტრირება"
+
+msgid "Log in"
+msgstr "შესვლა"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s ადმინისტრირება"
+
+msgid "Page not found"
+msgstr "გვერდი ვერ მოიძებნა"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "უკაცრავად, მოთხოვნილი გვერდი ვერ მოიძებნა."
+
+msgid "Home"
+msgstr "საწყისი გვერდი"
+
+msgid "Server error"
+msgstr "სერვერის შეცდომა"
+
+msgid "Server error (500)"
+msgstr "სერვერის შეცდომა (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "სერვერის შეცდომა <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"მოხდა შეცდომა. ინფორმაცია მასზე გადაეცა საიტის ადმინისტრატორებს ელ. ფოსტით "
+"და ის უნდა შესწორდეს უმოკლეს ვადებში. გმადლობთ მოთმინებისთვის."
+
+msgid "Run the selected action"
+msgstr "არჩეული მოქმედების შესრულება"
+
+msgid "Go"
+msgstr "გადასვლა"
+
+msgid "Click here to select the objects across all pages"
+msgstr "ყველა გვერდზე არსებული ობიექტის მოსანიშნად დააწკაპეთ აქ"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "ყველა %(total_count)s %(module_name)s-ის მონიშვნა"
+
+msgid "Clear selection"
+msgstr "მონიშვნის გასუფთავება"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ჯერ შეიყვანეთ მომხმარებლის სახელი და პაროლი. ამის შემდეგ თქვენ გექნებათ "
+"მომხმარებლის სხვა ოპციების რედაქტირების შესაძლებლობა."
+
+msgid "Enter a username and password."
+msgstr "შეიყვანეთ მომხმარებლის სახელი და პაროლი"
+
+msgid "Change password"
+msgstr "პაროლის შეცვლა"
+
+msgid "Please correct the error below."
+msgstr "გთხოვთ, გაასწოროთ შეცდომები."
+
+msgid "Please correct the errors below."
+msgstr "გთხოვთ, შეასწოროთ ქვემოთმოყვანილი შეცდომები."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"შეიყვანეთ ახალი პაროლი მომხმარებლისათვის <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "კეთილი იყოს თქვენი მობრძანება,"
+
+msgid "View site"
+msgstr "საიტის ნახვა"
+
+msgid "Documentation"
+msgstr "დოკუმენტაცია"
+
+msgid "Log out"
+msgstr "გამოსვლა"
+
+msgid "Add"
+msgstr "დამატება"
+
+msgid "History"
+msgstr "ისტორია"
+
+msgid "View on site"
+msgstr "წარმოდგენა საიტზე"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "დავამატოთ %(name)s"
+
+msgid "Filter"
+msgstr "ფილტრი"
+
+msgid "Remove from sorting"
+msgstr "დალაგებიდან მოშორება"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "დალაგების პრიორიტეტი: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "დალაგების გადართვა"
+
+msgid "Delete"
+msgstr "წავშალოთ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"ობიექტების წაშლა: %(object_name)s '%(escaped_object)s' გამოიწვევს "
+"დაკავშირებული ობიექტების წაშლას, მაგრამ თქვენ არა გაქვთ შემდეგი ტიპების "
+"ობიექტების წაშლის უფლება:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s ტიპის '%(escaped_object)s' ობიექტის წაშლა მოითხოვს ასევე "
+"შემდეგი დაკავშირებული ობიექტების წაშლას:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"ნამდვილად გსურთ, წაშალოთ %(object_name)s \"%(escaped_object)s\"? ყველა "
+"ქვემოთ მოყვანილი დაკავშირებული ობიექტი წაშლილი იქნება:"
+
+msgid "Objects"
+msgstr "ობიექტები"
+
+msgid "Yes, I'm sure"
+msgstr "კი, ნამდვილად"
+
+msgid "No, take me back"
+msgstr "არა, დამაბრუნეთ უკან"
+
+msgid "Delete multiple objects"
+msgstr "რამდენიმე ობიექტის წაშლა"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(objects_name)s ტიპის ობიექტის წაშლა ითხოვს ასევე შემდეგი ობიექტების "
+"წაშლას, მაგრამ თქვენ არ გაქვთ ამის ნებართვა:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"არჩეული %(objects_name)s ობიექტის წაშლა მოითხოვს ასევე შემდეგი დაცული "
+"დაკავშირეული ობიექტების წაშლას:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"დარწმუნებული ხართ, რომ გსურთ %(objects_name)s ობიექტის წაშლა? ყველა შემდეგი "
+"ობიექტი, და მათზე დამოკიდებული ჩანაწერები წაშლილი იქნება:"
+
+msgid "Change"
+msgstr "შეცვლა"
+
+msgid "Remove"
+msgstr "წაშლა"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "კიდევ ერთი %(verbose_name)s-ის დამატება"
+
+msgid "Delete?"
+msgstr "წავშალოთ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s მიხედვით "
+
+msgid "Summary"
+msgstr "შეჯამება"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "მოდელები %(name)s აპლიკაციაში"
+
+msgid "You don't have permission to edit anything."
+msgstr "თქვენ არა გაქვთ რედაქტირების უფლება."
+
+msgid "Recent Actions"
+msgstr "ბოლო მოქმედებები"
+
+msgid "My Actions"
+msgstr "ჩემი მოქმედებები"
+
+msgid "None available"
+msgstr "არ არის მისაწვდომი"
+
+msgid "Unknown content"
+msgstr "უცნობი შიგთავსი"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"თქვენი მონაცემთა ბაზის ინსტალაცია არაკორექტულია. დარწმუნდით, რომ მონაცემთა "
+"ბაზის შესაბამისი ცხრილები შექმნილია, და მონაცემთა ბაზის წაკითხვა შეუძლია "
+"შესაბამის მომხმარებელს."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "დაგავიწყდათ თქვენი პაროლი ან მომხმარებლის სახელი?"
+
+msgid "Date/time"
+msgstr "თარიღი/დრო"
+
+msgid "User"
+msgstr "მომხმარებელი"
+
+msgid "Action"
+msgstr "მოქმედება"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ამ ობიექტს ცვლილებების ისტორია არა აქვს. როგორც ჩანს, იგი არ იყო დამატებული "
+"ადმინისტრირების საიტის მეშვეობით."
+
+msgid "Show all"
+msgstr "ვაჩვენოთ ყველა"
+
+msgid "Save"
+msgstr "შევინახოთ"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "მონიშნული %(model)s-ის შეცვლა"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "მონიშნული %(model)s-ის წაშლა"
+
+msgid "Search"
+msgstr "ძებნა"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s შედეგი"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "სულ %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "შევინახოთ, როგორც ახალი"
+
+msgid "Save and add another"
+msgstr "შევინახოთ და დავამატოთ ახალი"
+
+msgid "Save and continue editing"
+msgstr "შევინახოთ და გავაგრძელოთ რედაქტირება"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "გმადლობთ, რომ დღეს ამ საიტთან მუშაობას დაუთმეთ დრო."
+
+msgid "Log in again"
+msgstr "ხელახლა შესვლა"
+
+msgid "Password change"
+msgstr "პაროლის შეცვლა"
+
+msgid "Your password was changed."
+msgstr "თქვენი პაროლი შეიცვალა."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"გთხოვთ, უსაფრთხოების დაცვის მიზნით, შეიყვანოთ თქვენი ძველი პაროლი, შემდეგ კი "
+"ახალი პაროლი ორჯერ, რათა დარწმუნდეთ, რომ იგი შეყვანილია სწორად."
+
+msgid "Change my password"
+msgstr "შევცვალოთ ჩემი პაროლი"
+
+msgid "Password reset"
+msgstr "პაროლის აღდგენა"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"თქვენი პაროლი დაყენებულია. ახლა შეგიძლიათ გადახვიდეთ შემდეგ გვერდზე და "
+"შეხვიდეთ სისტემაში."
+
+msgid "Password reset confirmation"
+msgstr "პაროლი შეცვლის დამოწმება"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"გთხოვთ, შეიყვანეთ თქვენი ახალი პაროლი ორჯერ, რათა დავრწმუნდეთ, რომ იგი "
+"სწორად ჩაბეჭდეთ."
+
+msgid "New password:"
+msgstr "ახალი პაროლი:"
+
+msgid "Confirm password:"
+msgstr "პაროლის დამოწმება:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"პაროლის აღდგენის ბმული არასწორი იყო, შესაძლოა იმის გამო, რომ იგი უკვე ყოფილა "
+"გამოყენებული. გთხოვთ, კიდევ ერთხელ სცადოთ პაროლის აღდგენა."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"თქვენ მიიღეთ ეს წერილი იმიტომ, რომ გააკეთეთ პაროლის თავიდან დაყენების "
+"მოთხოვნა თქვენი მომხმარებლის ანგარიშისთვის %(site_name)s-ზე."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "გთხოვთ, გადახვიდეთ შემდეგ გვერდზე და აირჩიოთ ახალი პაროლი:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "თქვენი მომხმარებლის სახელი (თუ დაგავიწყდათ):"
+
+msgid "Thanks for using our site!"
+msgstr "გმადლობთ, რომ იყენებთ ჩვენს საიტს!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s საიტის გუნდი"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"დაგავიწყდათ თქვენი პაროლი? შეიყვანეთ თქვენი ელ. ფოსტის მისამართი ქვემოთ და "
+"ჩვენ გამოგიგზავნით მითითებებს ახალი პაროლის დასაყენებლად."
+
+msgid "Email address:"
+msgstr "ელ. ფოსტის მისამართი:"
+
+msgid "Reset my password"
+msgstr "აღვადგინოთ ჩემი პაროლი"
+
+msgid "All dates"
+msgstr "ყველა თარიღი"
+
+#, python-format
+msgid "Select %s"
+msgstr "ავირჩიოთ %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "აირჩიეთ %s შესაცვლელად"
+
+msgid "Date:"
+msgstr "თარიღი;"
+
+msgid "Time:"
+msgstr "დრო:"
+
+msgid "Lookup"
+msgstr "ძიება"
+
+msgid "Currently:"
+msgstr "ამჟამად:"
+
+msgid "Change:"
+msgstr "შეცვლა:"
diff --git a/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..412bd58
--- /dev/null
+++ b/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a64700b
--- /dev/null
+++ b/tbc/static/admin/locale/ka/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# André Bouatchidzé <a@anbz.net>, 2013,2015
+# avsd05 <avsd05@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Georgian (http://www.transifex.com/django/django/language/"
+"ka/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ka\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "მისაწვდომი %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"ეს არის მისაწვდომი %s-ის სია. ზოგიერთი მათგანის ასარჩევად, მონიშვნით ისინი "
+"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"არჩევა\" ."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "აკრიფეთ ამ სარკმელში მისაწვდომი %s-ის სიის გასაფილტრად."
+
+msgid "Filter"
+msgstr "ფილტრი"
+
+msgid "Choose all"
+msgstr "ავირჩიოთ ყველა"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "დააწკაპუნეთ ერთდროულად ყველა %s-ის ასარჩევად."
+
+msgid "Choose"
+msgstr "არჩევა"
+
+msgid "Remove"
+msgstr "წავშალოთ"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "არჩეული %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"ეს არის არჩეული %s-ის სია. ზოგიერთი მათგანის მოსაშორებლად, მონიშვნით ისინი "
+"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"მოშორება"
+"\" ."
+
+msgid "Remove all"
+msgstr "ყველას მოშორება"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "დააწკაპუნეთ ყველა არჩეული %s-ის ერთდროულად მოსაშორებლად."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s-დან არჩეულია %(sel)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"ცალკეულ ველებში შეუნახავი ცვლილებები გაქვთ! თუ მოქმედებას შეასრულებთ, "
+"შეუნახავი ცვლილებები დაიკარაგება."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"აგირჩევიათ მოქმედება, მაგრამ ცალკეული ველები ჯერ არ შეგინახიათ! გთხოვთ, "
+"შენახვისთვის დააჭიროთ OK. მოქმედების ხელახლა გაშვება მოგიწევთ."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"აგირჩევიათ მოქმედება, მაგრამ ცალკეულ ველებში ცვლილებები არ გაგიკეთებიათ! "
+"სავარაუდოდ, ეძებთ ღილაკს \"Go\", და არა \"შენახვა\""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე."
+
+msgid "Now"
+msgstr "ახლა"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ავირჩიოთ დრო"
+
+msgid "Midnight"
+msgstr "შუაღამე"
+
+msgid "6 a.m."
+msgstr "დილის 6 სთ"
+
+msgid "Noon"
+msgstr "შუადღე"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "უარი"
+
+msgid "Today"
+msgstr "დღეს"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "გუშინ"
+
+msgid "Tomorrow"
+msgstr "ხვალ"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"იანვარი თებერვალი მარტი აპრილი მაისი ივნისი ივლისი აგვისტო სექტემბერი "
+"ოქტომბერი ნოემბერი დეკემბერი"
+
+msgid "S M T W T F S"
+msgstr "კ ო ს ო ხ პ შ"
+
+msgid "Show"
+msgstr "ვაჩვენოთ"
+
+msgid "Hide"
+msgstr "დავმალოთ"
diff --git a/tbc/static/admin/locale/kk/LC_MESSAGES/django.mo b/tbc/static/admin/locale/kk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..f60a1d7
--- /dev/null
+++ b/tbc/static/admin/locale/kk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/kk/LC_MESSAGES/django.po b/tbc/static/admin/locale/kk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..39bc8a6
--- /dev/null
+++ b/tbc/static/admin/locale/kk/LC_MESSAGES/django.po
@@ -0,0 +1,654 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2015
+# Nurlan Rakhimzhanov <nurlan.rakhimzhanov@gmail.com>, 2011
+# yun_man_ger <germanilyin@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: kk\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Таңдалған %(count)d %(items)s элемент өшірілді."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s өшіру мүмкін емес"
+
+msgid "Are you sure?"
+msgstr "Осыған сенімдісіз бе?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Таңдалған %(verbose_name_plural)s өшірілді"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Барлығы"
+
+msgid "Yes"
+msgstr "Иә"
+
+msgid "No"
+msgstr "Жоқ"
+
+msgid "Unknown"
+msgstr "Белгісіз"
+
+msgid "Any date"
+msgstr "Кез келген күн"
+
+msgid "Today"
+msgstr "Бүгін"
+
+msgid "Past 7 days"
+msgstr "Өткен 7 күн"
+
+msgid "This month"
+msgstr "Осы ай"
+
+msgid "This year"
+msgstr "Осы жыл"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Әрекет:"
+
+msgid "action time"
+msgstr "әрекет уақыты"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "объекттің id-i"
+
+msgid "object repr"
+msgstr "объекттің repr-i"
+
+msgid "action flag"
+msgstr "әрекет белгісі"
+
+msgid "change message"
+msgstr "хабарламаны өзгерту"
+
+msgid "log entry"
+msgstr "Жорнал жазуы"
+
+msgid "log entries"
+msgstr "Жорнал жазулары"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "Ешнәрсе"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s өзгертілді."
+
+msgid "and"
+msgstr "және"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" қосылды."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "\"%(object)s\" %(name)s-нің %(list)s өзгертілді."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" өшірілді."
+
+msgid "No fields changed."
+msgstr "Ешқандай толтырма өзгермеді."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" сәтті қосылды. Оны төменде өзгерте аласыз."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" сәтті қосылды."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" сәтті өзгертілді."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Бірнәрсені өзгерту үшін бірінші оларды таңдау керек. Ешнәрсе өзгертілмеді."
+
+msgid "No action selected."
+msgstr "Ешқандай әрекет таңдалмады."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" сәтті өшірілді."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Бірінші кілті %(key)r бар %(name)s объекті жоқ."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s қосу"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s өзгету"
+
+msgid "Database error"
+msgstr "Мәліметтер базасының қатесі"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+"one: %(count)s %(name)s өзгертілді.\n"
+"\n"
+"other: %(count)s %(name)s таңдалғандарының барі өзгертілді."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+"one: %(total_count)s таңдалды\n"
+"\n"
+"other: Барлығы %(total_count)s таңдалды"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 of %(cnt)s-ден 0 таңдалды"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Өзгерес тарихы: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Даңғо сайтының әкімі"
+
+msgid "Django administration"
+msgstr "Даңғо әкімшілігі"
+
+msgid "Site administration"
+msgstr "Сайт әкімшілігі"
+
+msgid "Log in"
+msgstr "Кіру"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Бет табылмады"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Кешірім сұраймыз, сіздің сұраған бетіңіз табылмады."
+
+msgid "Home"
+msgstr "Негізгі"
+
+msgid "Server error"
+msgstr "Сервердің қатесі"
+
+msgid "Server error (500)"
+msgstr "Сервердің қатесі (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Сервердің қатесі <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Таңдалған әрәкетті іске қосу"
+
+msgid "Go"
+msgstr "Алға"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Осы беттегі барлық объекттерді таңдау үшін осы жерді шертіңіз"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Осылардың %(total_count)s %(module_name)s барлығын таңдау"
+
+msgid "Clear selection"
+msgstr "Белгілерді өшіру"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Алдымен, пайдаланушының атын және құпия сөзді енгізіңіз. Содан соң, тағы "
+"басқа пайдаланушы параметрлерін енгізе аласыз."
+
+msgid "Enter a username and password."
+msgstr "Пайдаланушының атын және құпия сөзді енгізіңіз."
+
+msgid "Change password"
+msgstr "Құпия сөзді өзгерту"
+
+msgid "Please correct the error below."
+msgstr ""
+"one: Астындағы қатені дұрыстаңыз.\n"
+"other: Астындағы қателерді дұрыстаңыз."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"<strong>%(username)s</strong> пайдаланушы үшін жаңа құпия сөзді енгізіңіз."
+
+msgid "Welcome,"
+msgstr "Қош келдіңіз,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Құжаттама"
+
+msgid "Log out"
+msgstr "Шығу"
+
+msgid "Add"
+msgstr "Қосу"
+
+msgid "History"
+msgstr "Тарих"
+
+msgid "View on site"
+msgstr "Сайтта көру"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s қосу"
+
+msgid "Filter"
+msgstr "Сүзгіз"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Өшіру"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' объектты өшіруы байланысты объекттерін "
+"өшіруді қажет етеді, бырақ сізде осындай объектерді өшіру рұқсаты жоқ:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' объектті өшіру осындай байлансты "
+"объекттерды өшіруді қажет етеді:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" объекттерді өшіруге сенімдісіз бе? "
+"Бұл байланысты элементтер де өшіріледі:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Иә, сенімдімін"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Бірнеше объекттерді өшіру"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(objects_name)s объектты өшіруы байланысты объекттерін өшіруді қажет етеді, "
+"бырақ сізде осындай объектерді өшіру рұқсаты жоқ:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Таңдалған %(objects_name)s-ді(ы) өшіру, онымен байланыстағы қорғалған "
+"объектілердің барлығын жояды:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Таңдаған %(objects_name)s объектіңізді өшіруге сенімдісіз бе? Себебі, "
+"таңдағын объектіліріңіз және онымен байланыстағы барлық элементтер жойылады:"
+
+msgid "Change"
+msgstr "Өзгетру"
+
+msgid "Remove"
+msgstr "Өшіру"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Тағы басқа %(verbose_name)s кос"
+
+msgid "Delete?"
+msgstr "Өшіру?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Бірденке түзетуге рұқсатыңыз жоқ."
+
+msgid "Recent Actions"
+msgstr "Соңғы әрекеттер"
+
+msgid "My Actions"
+msgstr "Менің әрекеттерім"
+
+msgid "None available"
+msgstr "Қол жетімдісі жоқ"
+
+msgid "Unknown content"
+msgstr "Белгісіз мазмұн"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Дерекқор орнатуыңызда бір қате бар. Дерекқор кестелері дұрыс құрылғаның және "
+"дерекқор көрсетілген дерекқор пайдаланушыда оқұ рұқсаты бар."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "Өшіру/Уақыт"
+
+msgid "User"
+msgstr "Қолданушы"
+
+msgid "Action"
+msgstr "Әрекет"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Бұл объекттың өзгерту тарихы жоқ. Мүмкін ол бұл сайт арқылы енгізілген жоқ."
+
+msgid "Show all"
+msgstr "Барлығын көрсету"
+
+msgid "Save"
+msgstr "Сақтау"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Іздеу"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s нәтиже"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Барлығы %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Жаңадан сақтау"
+
+msgid "Save and add another"
+msgstr "Сақта және жаңасын қос"
+
+msgid "Save and continue editing"
+msgstr "Сақта және өзгертуді жалғастыр"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Бүгін Веб-торапқа уақыт бөлгеніңіз үшін рахмет."
+
+msgid "Log in again"
+msgstr "Қайтадан кіріңіз"
+
+msgid "Password change"
+msgstr "Құпия сөзді өзгерту"
+
+msgid "Your password was changed."
+msgstr "Құпия сөзіңіз өзгертілді."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Ескі құпия сөзіңізді енгізіңіз, содан сон сенімді болу үшін жаңа құпия "
+"сөзіңізді екі рет енгізіңіз."
+
+msgid "Change my password"
+msgstr "Құпия сөзімді өзгерту"
+
+msgid "Password reset"
+msgstr "Құпия сөзді өзгерту"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Сіздің құпия сөзіңіз енгізілді. Жүйеге кіруіңізге болады."
+
+msgid "Password reset confirmation"
+msgstr "Құпия сөзді өзгерту растау"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Сенімді болу үшін жаңа құпия сөзіңізді екі рет енгізіңіз."
+
+msgid "New password:"
+msgstr "Жаңа құпия сөз:"
+
+msgid "Confirm password:"
+msgstr "Құпия сөз (растау):"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Құпия сөзді өзгерту байланыс дұрыс емес, мүмкін ол осыған дейін "
+"пайдаланылды. Жаңа құпия сөзді өзгерту сұрау жіберіңіз."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Жаңа құпия сөзді тандау үшін мынау бетке кіріңіз:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Егер ұмытып қалған болсаңыз, пайдалануш атыңыз:"
+
+msgid "Thanks for using our site!"
+msgstr "Біздің веб-торабын қолданғаныңыз үшін рахмет!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s тобы"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Құпия сөзді жаңала"
+
+msgid "All dates"
+msgstr "Барлық мерзімдер"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s таңда"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s өзгерту үщін таңда"
+
+msgid "Date:"
+msgstr "Күнтізбелік күн:"
+
+msgid "Time:"
+msgstr "Уақыт:"
+
+msgid "Lookup"
+msgstr "Іздеу"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..884d63a
--- /dev/null
+++ b/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..0bb135f
--- /dev/null
+++ b/tbc/static/admin/locale/kk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,153 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Nurlan Rakhimzhanov <nurlan.rakhimzhanov@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: kk\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s бар"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Сүзгіш"
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "Өшіру(жою)"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s-ң %(sel)s-ы(і) таңдалды"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Сіздің төмендегі өзгермелі алаңдарда(fields) өзгерістеріңіз бар. Егер артық "
+"әрекет жасасаңызб сіз өзгерістеріңізді жоғалтасыз."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Сіз өз өзгерістеріңізді сақтамай, әрекет жасадыңыз. Өтініш, сақтау үшін ОК "
+"батырмасын басыңыз және өз әрекетіңізді қайта жасап көріңіз. "
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Сіз Сақтау батырмасына қарағанда, Go(Алға) батырмасын іздеп отырған "
+"боларсыз, себебі ешқандай өзгеріс жасамай, әрекет жасадыңыз."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "Қазір"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Уақытты таңда"
+
+msgid "Midnight"
+msgstr "Түн жарым"
+
+msgid "6 a.m."
+msgstr "06"
+
+msgid "Noon"
+msgstr "Талтүс"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Болдырмау"
+
+msgid "Today"
+msgstr "Бүгін"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Кеше"
+
+msgid "Tomorrow"
+msgstr "Ертең"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Қаңтар Ақпан Наурыз Сәуір Мамыр Маусым Шілде Тамыз Қыркүйек Қазан Қараша "
+"Желтоқсан"
+
+msgid "S M T W T F S"
+msgstr "Ж Д С С Б Ж С"
+
+msgid "Show"
+msgstr "Көрсету"
+
+msgid "Hide"
+msgstr "Жасыру"
diff --git a/tbc/static/admin/locale/km/LC_MESSAGES/django.mo b/tbc/static/admin/locale/km/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8c0ac4e
--- /dev/null
+++ b/tbc/static/admin/locale/km/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/km/LC_MESSAGES/django.po b/tbc/static/admin/locale/km/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c742604
--- /dev/null
+++ b/tbc/static/admin/locale/km/LC_MESSAGES/django.po
@@ -0,0 +1,631 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: km\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "តើលោកអ្នកប្រាកដទេ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "ទាំងអស់"
+
+msgid "Yes"
+msgstr "យល់ព្រម"
+
+msgid "No"
+msgstr "មិនយល់ព្រម"
+
+msgid "Unknown"
+msgstr "មិន​ដឹង"
+
+msgid "Any date"
+msgstr "កាល​បរិច្ឆេទណាមួយ"
+
+msgid "Today"
+msgstr "ថ្ងៃនេះ"
+
+msgid "Past 7 days"
+msgstr "៧​ថ្ងៃ​កន្លង​មក"
+
+msgid "This month"
+msgstr "ខែ​នេះ"
+
+msgid "This year"
+msgstr "ឆ្នាំ​នេះ"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr "ពេលវេលាប្រតិបត្តិការ"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "លេខ​សំគាល់​កម្មវិធី (object id)"
+
+msgid "object repr"
+msgstr "object repr"
+
+msgid "action flag"
+msgstr "សកម្មភាព"
+
+msgid "change message"
+msgstr "ផ្លាស់ប្តូរ"
+
+msgid "log entry"
+msgstr "កំណត់ហេតុ"
+
+msgid "log entries"
+msgstr "កំណត់ហេតុ"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "បានផ្លាស់ប្តូរ %s"
+
+msgid "and"
+msgstr "និង"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr "ពុំមានទិន្នន័យត្រូវបានផ្លាស់ប្តូរ។"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"ឈ្មោះកម្មវីធី %(name)s \"%(obj)s\" ត្រូវបានបន្ថែមដោយជោគជ័យ។"
+" លោកអ្នកអាចផ្លាស់ប្តូរម្តងទៀតនៅខាងក្រោម។"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" បានបញ្ជូលដោយជោគជ័យ​។"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "កម្មវិធីឈ្មោះ %(name)s \"%(obj)s\" ត្រូវបានផ្លាស់ប្តូរដោយជោគជ័យ។"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" ត្រូវបានលប់ដោយជោគជ័យ។"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "បន្ថែម %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "ផ្លាស់ប្តូរ %s"
+
+msgid "Database error"
+msgstr "ទិន្នន័យមូលដ្ឋានមានបញ្ហា"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "សកម្មភាពផ្លាស់ប្តូរកន្លងមក : %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "ទំព័រគ្រប់គ្រងរបស់ Django"
+
+msgid "Django administration"
+msgstr "ការ​គ្រប់គ្រង​របស់ ​Django"
+
+msgid "Site administration"
+msgstr "ទំព័រគ្រប់គ្រង"
+
+msgid "Log in"
+msgstr "ពិនិត្យចូល"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នៅក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "សួមអភ័យទោស ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នឹងក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ"
+
+msgid "Home"
+msgstr "គេហទំព័រ"
+
+msgid "Server error"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា"
+
+msgid "Server error (500)"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា (៥០០)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា  <em>(៥០០)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr "ស្វែងរក"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"តំបូងសូមបំពេញ ឈ្មោះជាសមាជិក និង ពាក្យសំងាត់​។ បន្ទាប់មកលោកអ្នកអាចបំពេញបន្ថែមជំរើសផ្សេងៗទៀតបាន។ "
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "សូមស្វាគមន៏"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "ឯកសារ"
+
+msgid "Log out"
+msgstr "ចាកចេញ"
+
+msgid "Add"
+msgstr "បន្ថែម"
+
+msgid "History"
+msgstr "សកម្មភាព​កន្លង​មក"
+
+msgid "View on site"
+msgstr "មើលនៅលើគេហទំព័រដោយផ្ទាល់"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "បន្ថែម %(name)s"
+
+msgid "Filter"
+msgstr "ស្វែងរកជាមួយ"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "លប់"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់ ។"
+" ក៏ប៉ន្តែលោកអ្នក​ពុំមាន​សិទ្ធិលប់​កម្មវិធី​ប្រភេទនេះទេ។"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"តើលោកអ្នកប្រាកដជាចង់លប់ %(object_name)s \"%(escaped_object)s"
+"\"? ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់។"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ខ្ញុំច្បាស់​ជាចង់លប់"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "ផ្លាស់ប្តូរ"
+
+msgid "Remove"
+msgstr "លប់ចេញ"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "ដោយ​  %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "លោកអ្នកពុំមានសិទ្ធិ ផ្លាស់​ប្តូរ ទេ។"
+
+msgid "Recent Actions"
+msgstr "សកម្មភាពបច្ចុប្បន្ន"
+
+msgid "My Actions"
+msgstr "សកម្មភាពរបស់ខ្ញុំ"
+
+msgid "None available"
+msgstr "គ្មាន"
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"មូលដ្ឋាន​ទិន្នន័យ​​​ របស់លោកអ្នក មានបញ្ហា។ តើ លោកអ្នកបាន បង្កើត តារាង​ របស់មូលដ្ឋានទិន្នន័យ​"
+" ហើយឬនៅ? តើ​ លោកអ្នកប្រាកដថាសមាជិកអាចអានមូលដ្ឋានទិន្នន័យនេះ​​បានឬទេ? "
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "Date/time"
+
+msgid "User"
+msgstr "សមាជិក"
+
+msgid "Action"
+msgstr "សកម្មភាព"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"កម្មវិធីនេះមិនមានសកម្មភាព​កន្លងមកទេ។ ប្រហែលជាសកម្មភាពទាំងនេះមិនបានធ្វើនៅទំព័រគ្រប់គ្រងនេះ។"
+
+msgid "Show all"
+msgstr "បង្ហាញទាំងអស់"
+
+msgid "Save"
+msgstr "រក្សាទុក"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "សរុបទាំងអស់ %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "រក្សាទុក"
+
+msgid "Save and add another"
+msgstr "រក្សាទុក ហើយ បន្ថែម​ថ្មី"
+
+msgid "Save and continue editing"
+msgstr "រក្សាទុក ហើយ កែឯកសារដដែល"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "សូមថ្លែងអំណរគុណ ដែលបានចំណាយ ពេលវេលាដ៏មានតំលៃ របស់លោកអ្នកមកទស្សនាគេហទំព័ររបស់យើងខ្ញុំ"
+
+msgid "Log in again"
+msgstr "ពិនិត្យចូលម្តងទៀត"
+
+msgid "Password change"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+msgid "Your password was changed."
+msgstr "ពាក្យសំងាត់របស់លោកអ្នកបានផ្លាស់ប្តូរហើយ"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "សូមបំពេញពាក្យសំងាត់ចាស់របស់លោកអ្នក។ ដើម្បីសុវត្ថភាព សូមបំពេញពាក្យសំងាត់ថ្មីខាងក្រោមពីរដង។"
+
+msgid "Change my password"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+msgid "Password reset"
+msgstr "ពាក្យសំងាត់បានកំណត់សារជាថ្មី"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr "ពាក្យសំងាត់ថ្មី"
+
+msgid "Confirm password:"
+msgstr "បំពេញពាក្យសំងាត់ថ្មីម្តងទៀត"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr "ឈ្មោះជាសមាជិកក្នុងករណីភ្លេច:"
+
+msgid "Thanks for using our site!"
+msgstr "សូមអរគុណដែលបានប្រើប្រាស់សេវាកម្មរបស់យើងខ្ញុំ"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "ក្រុមរបស់គេហទំព័រ %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "កំណត់ពាក្យសំងាត់សារជាថ្មី"
+
+msgid "All dates"
+msgstr "កាលបរិច្ឆេទទាំងអស់"
+
+#, python-format
+msgid "Select %s"
+msgstr "ជ្រើសរើស %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "ជ្រើសរើស %s ដើម្បីផ្លាស់ប្តូរ"
+
+msgid "Date:"
+msgstr "កាលបរិច្ឆេទ"
+
+msgid "Time:"
+msgstr "ម៉ោង"
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..823ef22
--- /dev/null
+++ b/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f81c12a
--- /dev/null
+++ b/tbc/static/admin/locale/km/LC_MESSAGES/djangojs.po
@@ -0,0 +1,147 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: km\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s ដែលអាច​ជ្រើសរើសបាន"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "ស្វែងរកជាមួយ"
+
+msgid "Choose all"
+msgstr "ជ្រើសរើសទាំងអស់"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "លប់ចេញ"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s ដែលបានជ្រើសរើស"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "ឥឡូវនេះ"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ជ្រើសរើសម៉ោង"
+
+msgid "Midnight"
+msgstr "អធ្រាត្រ"
+
+msgid "6 a.m."
+msgstr "ម៉ោង ៦ ព្រឹក"
+
+msgid "Noon"
+msgstr "ពេលថ្ងែត្រង់"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "លប់ចោល"
+
+msgid "Today"
+msgstr "ថ្ងៃនេះ"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "ម្សិលមិញ"
+
+msgid "Tomorrow"
+msgstr "ថ្ងៃស្អែក"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"January February March April May June July August September October November "
+"December"
+
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/kn/LC_MESSAGES/django.mo b/tbc/static/admin/locale/kn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..19543a1
--- /dev/null
+++ b/tbc/static/admin/locale/kn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/kn/LC_MESSAGES/django.po b/tbc/static/admin/locale/kn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..55ce418
--- /dev/null
+++ b/tbc/static/admin/locale/kn/LC_MESSAGES/django.po
@@ -0,0 +1,634 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Kannada (http://www.transifex.com/django/django/language/"
+"kn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: kn\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "ಖಚಿತಪಡಿಸುವಿರಾ? "
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "ಎಲ್ಲಾ"
+
+msgid "Yes"
+msgstr "ಹೌದು"
+
+msgid "No"
+msgstr "ಇಲ್ಲ"
+
+msgid "Unknown"
+msgstr "ಗೊತ್ತಿಲ್ಲ(ದ/ದ್ದು)"
+
+msgid "Any date"
+msgstr "ಯಾವುದೇ ದಿನಾಂಕ"
+
+msgid "Today"
+msgstr "ಈದಿನ"
+
+msgid "Past 7 days"
+msgstr "ಕಳೆದ ೭ ದಿನಗಳು"
+
+msgid "This month"
+msgstr "ಈ ತಿಂಗಳು"
+
+msgid "This year"
+msgstr "ಈ ವರ್ಷ"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಸಮಯ"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "ವಸ್ತುವಿನ ಐಡಿ"
+
+msgid "object repr"
+msgstr "ವಸ್ತು ಪ್ರಾತಿನಿಧ್ಯ"
+
+msgid "action flag"
+msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಪತಾಕೆ"
+
+msgid "change message"
+msgstr "ಬದಲಾವಣೆಯ ಸಂದೇಶ/ಸಂದೇಶ ಬದಲಿಸಿ"
+
+msgid "log entry"
+msgstr "ಲಾಗ್ ದಾಖಲೆ"
+
+msgid "log entries"
+msgstr "ಲಾಗ್ ದಾಖಲೆಗಳು"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s ಬದಲಾಯಿಸಲಾಯಿತು."
+
+msgid "and"
+msgstr "ಮತ್ತು"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr "ಯಾವುದೇ ಅಂಶಗಳು ಬದಲಾಗಲಿಲ್ಲ."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಯಿತು. ನೀವು ಕೆಳಗೆ ಅದನ್ನು ಮತ್ತೆ "
+"ಬದಲಾಯಿಸಬಹುದು."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr " %(name)s \"%(obj)s\" ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಯಿತು."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ಸಫಲವಾಗಿ ಬದಲಾಯಿಸಲಾಯಿತು."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಯಿತು."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "%s ಸೇರಿಸಿ"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s ಅನ್ನು ಬದಲಿಸು"
+
+msgid "Database error"
+msgstr "ದತ್ತಸಂಚಯದ ದೋಷ"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "ಜಾಂಗೋ ತಾಣದ ಆಡಳಿತಗಾರರು"
+
+msgid "Django administration"
+msgstr "ಜಾಂಗೋ ಆಡಳಿತ"
+
+msgid "Site administration"
+msgstr "ತಾಣ ನಿರ್ವಹಣೆ"
+
+msgid "Log in"
+msgstr "ಒಳಗೆ ಬನ್ನಿ"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "ಪುಟ ಸಿಗಲಿಲ್ಲ"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "ಕ್ಷಮಿಸಿ, ನೀವು ಕೇಳಿದ ಪುಟ ಸಿಗಲಿಲ್ಲ"
+
+msgid "Home"
+msgstr "ಪ್ರಾರಂಭಸ್ಥಳ(ಮನೆ)"
+
+msgid "Server error"
+msgstr "ಸರ್ವರ್ ದೋಷ"
+
+msgid "Server error (500)"
+msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "ಸರ್ವರ್ ದೋಷ<em>(೫೦೦)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr "ಹೋಗಿ"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ಮೊದಲು ಬಳಕೆದಾರ-ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ಕೊಡಿರಿ. ನಂತರ, ನೀವು ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು "
+"ಬದಲಿಸಬಹುದಾಗಿದೆ."
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "ಪ್ರವೇಶಪದ ಬದಲಿಸಿ"
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "ಸುಸ್ವಾಗತ."
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "ವಿವರಮಾಹಿತಿ"
+
+msgid "Log out"
+msgstr "ಹೊರಕ್ಕೆ ಹೋಗಿ"
+
+msgid "Add"
+msgstr "ಸೇರಿಸಿ"
+
+msgid "History"
+msgstr "ಚರಿತ್ರೆ"
+
+msgid "View on site"
+msgstr "ತಾಣದಲ್ಲಿ ನೋಡಿ"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ಸೇರಿಸಿ"
+
+msgid "Filter"
+msgstr "ಸೋಸಕ"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "ಅಳಿಸಿಹಾಕಿ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"'%(escaped_object)s' %(object_name)s ಅನ್ನು ತೆಗೆದುಹಾಕುವುದರಿಂದ ಸಂಬಂಧಿತ ವಸ್ತುಗಳೂ "
+"ಕಳೆದುಹೋಗುತ್ತವೆ. ಆದರೆ ನಿಮ್ಮ ಖಾತೆಗೆ ಕೆಳಕಂಡ ಬಗೆಗಳ ವಸ್ತುಗಳನ್ನು ತೆಗೆದುಹಾಕಲು "
+"ಅನುಮತಿಯಿಲ್ಲ."
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ಹೌದು,ನನಗೆ ಖಚಿತವಿದೆ"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "ಬದಲಿಸಿ/ಬದಲಾವಣೆ"
+
+msgid "Remove"
+msgstr "ತೆಗೆದು ಹಾಕಿ"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ಇಂದ"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "ಯಾವುದನ್ನೂ ತಿದ್ದಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ ."
+
+msgid "Recent Actions"
+msgstr "ಇತ್ತೀಚಿನ ಕ್ರಮಗಳು"
+
+msgid "My Actions"
+msgstr "ನನ್ನ ಕ್ರಮಗಳು"
+
+msgid "None available"
+msgstr "ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ"
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"ಡಾಟಾಬೇಸನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ಸೂಕ್ತ ಡಾಟಾಬೇಸ್ ಕೋಷ್ಟಕಗಳು ರಚನೆಯಾಗಿ ಅರ್ಹ "
+"ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು ಓದಬಹುದಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಾತರಿ ಪಡಿಸಿಕೊಳ್ಳಿ."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "ದಿನಾಂಕ/ಸಮಯ"
+
+msgid "User"
+msgstr "ಬಳಕೆದಾರ"
+
+msgid "Action"
+msgstr "ಕ್ರಮ(ಕ್ರಿಯೆ)"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ಈ ವಸ್ತುವಿಗೆ ಬದಲಾವಣೆಯ ಇತಿಹಾಸವಿಲ್ಲ. ಅದು ಬಹುಶಃ ಈ ಆಡಳಿತತಾಣದ ಮೂಲಕ ಸೇರಿಸಲ್ಪಟ್ಟಿಲ್ಲ."
+
+msgid "Show all"
+msgstr "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು"
+
+msgid "Save"
+msgstr "ಉಳಿಸಿ"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "ಒಟ್ಟು %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "ಹೊಸದರಂತೆ ಉಳಿಸಿ"
+
+msgid "Save and add another"
+msgstr "ಉಳಿಸಿ ಮತ್ತು ಇನ್ನೊಂದನ್ನು ಸೇರಿಸಿ"
+
+msgid "Save and continue editing"
+msgstr "ಉಳಿಸಿ ಮತ್ತು ತಿದ್ದುವುದನ್ನು ಮುಂದುವರಿಸಿರಿ."
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ಈದಿನ ತಮ್ಮ ಅತ್ಯಮೂಲ್ಯವಾದ ಸಮಯವನ್ನು ನಮ್ಮ ತಾಣದಲ್ಲಿ ಕಳೆದುದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು."
+
+msgid "Log in again"
+msgstr "ಮತ್ತೆ ಒಳಬನ್ನಿ"
+
+msgid "Password change"
+msgstr "ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ"
+
+msgid "Your password was changed."
+msgstr "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಲಾಗಿದೆ"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"ಭದ್ರತೆಯ ದೃಷ್ಟಿಯಿಂದ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಸೂಚಿಸಿರಿ. ಆನಂತರ ನೀವು ಸರಿಯಾಗಿ "
+"ಬರೆದಿದ್ದೀರೆಂದು ನಾವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಎರಡು ಬಾರಿ ಬರೆಯಿರಿ."
+
+msgid "Change my password"
+msgstr "ನನ್ನ ಪ್ರವೇಶಪದ ಬದಲಿಸಿ"
+
+msgid "Password reset"
+msgstr "ಪ್ರವೇಶಪದವನ್ನು ಬದಲಿಸುವಿಕೆ"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr "ಹೊಸ ಪ್ರವೇಶಪದ:"
+
+msgid "Confirm password:"
+msgstr "ಪ್ರವೇಶಪದವನ್ನು ಖಚಿತಪಡಿಸಿ:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr "ನೀವು ಮರೆತಿದ್ದಲ್ಲಿ , ನಿಮ್ಮ ಬಳಕೆದಾರ-ಹೆಸರು"
+
+msgid "Thanks for using our site!"
+msgstr "ನಮ್ಮ ತಾಣವನ್ನು ಬಳಸಿದ್ದಕ್ದಾಗಿ ಧನ್ಯವಾದಗಳು!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ತಂಡ"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "ನನ್ನ ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೆ ನಿರ್ಧರಿಸಿ "
+
+msgid "All dates"
+msgstr "ಎಲ್ಲಾ ದಿನಾಂಕಗಳು"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s ಆಯ್ದುಕೊಳ್ಳಿ"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "ಬದಲಾಯಿಸಲು %s ಆಯ್ದುಕೊಳ್ಳಿ"
+
+msgid "Date:"
+msgstr "ದಿನಾಂಕ:"
+
+msgid "Time:"
+msgstr "ಸಮಯ:"
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b164674
--- /dev/null
+++ b/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e679c29
--- /dev/null
+++ b/tbc/static/admin/locale/kn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,149 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# karthikbgl <karthikbgl@gmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Kannada (http://www.transifex.com/django/django/language/"
+"kn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: kn\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "ಲಭ್ಯ %s "
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "ಶೋಧಕ"
+
+msgid "Choose all"
+msgstr "ಎಲ್ಲವನ್ನೂ ಆಯ್ದುಕೊಳ್ಳಿ"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "ತೆಗೆದು ಹಾಕಿ"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s ಆಯ್ದುಕೊಳ್ಳಲಾಗಿದೆ"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr "ಎಲ್ಲಾ ತೆಗೆದುಹಾಕಿ"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"ನೀವು ಪ್ರತ್ಯೇಕ ತಿದ್ದಬಲ್ಲ ಕ್ಷೇತ್ರಗಳಲ್ಲಿ ಬದಲಾವಣೆ ಉಳಿಸಿಲ್ಲ. ನಿಮ್ಮ ಉಳಿಸದ ಬದಲಾವಣೆಗಳು "
+"ನಾಶವಾಗುತ್ತವೆ"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "ಈಗ"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ಸಮಯವೊಂದನ್ನು ಆರಿಸಿ"
+
+msgid "Midnight"
+msgstr "ಮಧ್ಯರಾತ್ರಿ"
+
+msgid "6 a.m."
+msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ "
+
+msgid "Noon"
+msgstr "ಮಧ್ಯಾಹ್ನ"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "ರದ್ದುಗೊಳಿಸಿ"
+
+msgid "Today"
+msgstr "ಈ ದಿನ"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "ನಿನ್ನೆ"
+
+msgid "Tomorrow"
+msgstr "ನಾಳೆ"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ಜನವರಿ ಫೆಬ್ರುವರಿ ಮಾರ್ಚ್ ಎಪ್ರಿಲ್ ಮೇ ಜೂನ್ ಜುಲೈ ಆಗಸ್ಟ್ ಸೆಪ್ಟೆಂಬರ್ ನವೆಂಬರ್ ಡಿಸೆಂಬರ್"
+
+msgid "S M T W T F S"
+msgstr "ರ ಸೋ ಮ ಬು ಗು ಶು ಶ"
+
+msgid "Show"
+msgstr "ಪ್ರದರ್ಶನ"
+
+msgid "Hide"
+msgstr "ಮರೆಮಾಡಲು"
diff --git a/tbc/static/admin/locale/ko/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ko/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3cc6c3e
--- /dev/null
+++ b/tbc/static/admin/locale/ko/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ko/LC_MESSAGES/django.po b/tbc/static/admin/locale/ko/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7df66d5
--- /dev/null
+++ b/tbc/static/admin/locale/ko/LC_MESSAGES/django.po
@@ -0,0 +1,666 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jaehong Kim <mixe@korea.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jeong Seongtae <magno79@gmail.com>, 2014
+# Taesik Yoon <xotlr43@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d개의 %(items)s 을/를 성공적으로 삭제하였습니다."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s를 삭제할 수 없습니다."
+
+msgid "Are you sure?"
+msgstr "확실합니까?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "선택된 %(verbose_name_plural)s 을/를 삭제합니다."
+
+msgid "Administration"
+msgstr "관리"
+
+msgid "All"
+msgstr "모두"
+
+msgid "Yes"
+msgstr "예"
+
+msgid "No"
+msgstr "아니오"
+
+msgid "Unknown"
+msgstr "알 수 없습니다."
+
+msgid "Any date"
+msgstr "언제나"
+
+msgid "Today"
+msgstr "오늘"
+
+msgid "Past 7 days"
+msgstr "지난 7일"
+
+msgid "This month"
+msgstr "이번 달"
+
+msgid "This year"
+msgstr "이번 해"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"관리자 계정의 %(username)s 와 비밀번호를 입력해주세요. 대소문자를 구분해서 입"
+"력해주세요."
+
+msgid "Action:"
+msgstr "액션:"
+
+msgid "action time"
+msgstr "액션 타임"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "오브젝트 아이디"
+
+msgid "object repr"
+msgstr "오브젝트 표현"
+
+msgid "action flag"
+msgstr "액션 플래그"
+
+msgid "change message"
+msgstr "메시지 변경"
+
+msgid "log entry"
+msgstr "로그 엔트리"
+
+msgid "log entries"
+msgstr "로그 엔트리"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\"가 추가하였습니다."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" 를 %(changes)s 개 변경"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s.\"를 삭제하였습니다."
+
+msgid "LogEntry Object"
+msgstr "LogEntry 객체"
+
+msgid "None"
+msgstr "없음"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "하나 이상을 선택하려면 \"Control\" 키, Mac은 \"Command\"키를 누르세요."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s 이/가 변경되었습니다."
+
+msgid "and"
+msgstr "또한"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 을/를 추가하였습니다."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s에 대한 %(name)s \"%(object)s\" 을/를 변경하였습니다."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 을/를 삭제하였습니다."
+
+msgid "No fields changed."
+msgstr "변경된 필드가 없습니다."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 이/가 추가되었습니다. 계속해서 편집하세요."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" 이/가 추가되었습니다. 다른 %(name)s 을(를) 추가할 수 있"
+"습니다."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 이/가 추가되었습니다."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" 이/가 변경되었습니다. 계속해서 편집하세요."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" 이/가 변경되었습니다. 다른 %(name)s 을/를 추가할 수 있"
+"습니다."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 이/가 변경되었습니다."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"항목들에 액션을 적용하기 위해선 먼저 항목들이 선택되어 있어야 합니다. 아무 항"
+"목도 변경되지 않았습니다."
+
+msgid "No action selected."
+msgstr "액션이 선택되지 않았습니다."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\"이/가 삭제되었습니다."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Primary key %(key)r에 대한 오브젝트 %(name)s이/가 존재하지 않습니다."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s 추가"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s 변경"
+
+msgid "Database error"
+msgstr "데이터베이스 오류"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s개의 %(name)s이/가 변경되었습니다."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "모두 %(total_count)s개가 선택되었습니다."
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s 중 아무것도 선택되지 않았습니다."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "변경 히스토리: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s %(instance)s 을/를 삭제하려면 다음 보호상태의 연관된 오브젝트"
+"들을 삭제해야 합니다: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django 사이트 관리"
+
+msgid "Django administration"
+msgstr "Django 관리"
+
+msgid "Site administration"
+msgstr "사이트 관리"
+
+msgid "Log in"
+msgstr "로그인"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s 관리"
+
+msgid "Page not found"
+msgstr "해당 페이지가 없습니다."
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "죄송합니다, 요청하신 페이지를 찾을 수 없습니다."
+
+msgid "Home"
+msgstr "홈"
+
+msgid "Server error"
+msgstr "서버 오류"
+
+msgid "Server error (500)"
+msgstr "서버 오류 (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "서버 오류 <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"오류가 있었습니다. 사이트 관리자에게 이메일로 보고 되었고, 곧 수정될 것입니"
+"다. 이해해주셔서 고맙습니다."
+
+msgid "Run the selected action"
+msgstr "선택한 액션을 실행합니다."
+
+msgid "Go"
+msgstr "실행"
+
+msgid "Click here to select the objects across all pages"
+msgstr "모든 페이지의 항목들을 선택하려면 여기를 클릭하세요."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "%(total_count)s개의 %(module_name)s 모두를 선택합니다."
+
+msgid "Clear selection"
+msgstr "선택을 해제합니다."
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"사용자명와 비밀번호를 입력하세요.더 많은 사용자 옵션을 사용하실 수 있습니다."
+
+msgid "Enter a username and password."
+msgstr "유저명과 암호를 입력하세요."
+
+msgid "Change password"
+msgstr "비밀번호 변경"
+
+msgid "Please correct the error below."
+msgstr "아래의 오류를 수정하십시오."
+
+msgid "Please correct the errors below."
+msgstr "아래의 오류를 수정하십시오."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> 새로운 비밀번호를 입력하세요."
+
+msgid "Welcome,"
+msgstr "환영합니다,"
+
+msgid "View site"
+msgstr "사이트 보기"
+
+msgid "Documentation"
+msgstr "문서"
+
+msgid "Log out"
+msgstr "로그아웃"
+
+msgid "Add"
+msgstr "추가"
+
+msgid "History"
+msgstr "히스토리"
+
+msgid "View on site"
+msgstr "사이트에서 보기"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s 추가"
+
+msgid "Filter"
+msgstr "필터"
+
+msgid "Remove from sorting"
+msgstr "정렬에서 "
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "정렬 조건 : %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "정렬 "
+
+msgid "Delete"
+msgstr "삭제"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" 을/를 삭제하면서관련 오브젝트를 제거하"
+"고자 했으나, 지금 사용하시는 계정은 다음 타입의 오브젝트를 제거할 권한이 없습"
+"니다. :"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s'를 삭제하려면 다음 보호상태의 연관된 오브"
+"젝트들을 삭제해야 합니다."
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"정말로 %(object_name)s \"%(escaped_object)s\"을/를 삭제하시겠습니까? 다음의 "
+"관련 항목들이 모두 삭제됩니다. :"
+
+msgid "Objects"
+msgstr "오브젝트"
+
+msgid "Yes, I'm sure"
+msgstr "네, 확실합니다."
+
+msgid "No, take me back"
+msgstr "아뇨, 돌려주세요."
+
+msgid "Delete multiple objects"
+msgstr "여러 개의 오브젝트 삭제"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"연관 오브젝트 삭제로 선택한 %(objects_name)s의 삭제 중, 그러나 당신의 계정은 "
+"다음 오브젝트의 삭제 권한이 없습니다. "
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"%(objects_name)s를 삭제하려면 다음 보호상태의 연관된 오브젝트들을 삭제해야 합"
+"니다."
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"선택한 %(objects_name)s를 정말 삭제하시겠습니까? 다음의 오브젝트와 연관 아이"
+"템들이 모두 삭제됩니다:"
+
+msgid "Change"
+msgstr "변경"
+
+msgid "Remove"
+msgstr "삭제하기"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "%(verbose_name)s 더 추가하기"
+
+msgid "Delete?"
+msgstr "삭제"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s (으)로"
+
+msgid "Summary"
+msgstr "개요"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s 애플리케이션의 "
+
+msgid "You don't have permission to edit anything."
+msgstr "수정할 권한이 없습니다."
+
+msgid "Recent Actions"
+msgstr "최근 액션"
+
+msgid "My Actions"
+msgstr "나의 액션"
+
+msgid "None available"
+msgstr "이용할 수 없습니다."
+
+msgid "Unknown content"
+msgstr "내용 형식이 지정되지 않았습니다."
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"데이터베이스 설정에 문제가 발생했습니다. 해당 데이터베이스 테이블이 생성되었"
+"는지, 해당 유저가 데이터베이스를 읽어 들일 수 있는지 확인하세요."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "이름이나 비밀번호를 분실하였습니까?"
+
+msgid "Date/time"
+msgstr "날짜/시간"
+
+msgid "User"
+msgstr "사용자"
+
+msgid "Action"
+msgstr "액션"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"오브젝트에 변경사항이 없습니다. 이 admin 사이트를 통해 추가된 것이 아닐 수 있"
+"습니다."
+
+msgid "Show all"
+msgstr "모두 표시"
+
+msgid "Save"
+msgstr "저장"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "선택된 %(model)s 변경"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "%(model)s 추가"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "선택된 %(model)s 제거"
+
+msgid "Search"
+msgstr "검색"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "결과 %(counter)s개 나옴"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "총 %(full_result_count)s건"
+
+msgid "Save as new"
+msgstr "새로 저장"
+
+msgid "Save and add another"
+msgstr "저장 및 다른 이름으로 추가"
+
+msgid "Save and continue editing"
+msgstr "저장 및 편집 계속"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "사이트를 이용해 주셔서 고맙습니다."
+
+msgid "Log in again"
+msgstr "다시 로그인하기"
+
+msgid "Password change"
+msgstr "비밀번호 변경"
+
+msgid "Your password was changed."
+msgstr "비밀번호가 변경되었습니다."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"보안상 필요하오니 기존에 사용하시던 비밀번호를 입력해 주세요. 새로운 비밀번호"
+"는 정확히 입력했는지 확인할 수 있도록 두 번 입력하시기 바랍니다."
+
+msgid "Change my password"
+msgstr "비밀번호 변경"
+
+msgid "Password reset"
+msgstr "비밀번호 초기화"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "비밀번호가 설정되었습니다. 이제 로그인하세요."
+
+msgid "Password reset confirmation"
+msgstr "비밀번호 초기화 확인"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"새로운 비밀번호를 정확히 입력했는지 확인할 수 있도록두 번 입력하시기 바랍니"
+"다."
+
+msgid "New password:"
+msgstr "새로운 비밀번호:"
+
+msgid "Confirm password:"
+msgstr "새로운 비밀번호(확인):"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"비밀번호 초기화 링크가 이미 사용되어 올바르지 않습니다.비밀번호 초기화을 다"
+"시 해주세요."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"계정에 등록된 이메일로 비밀번호를 지정하기 위한 지침을 보냈습니다. 곧 메일을 "
+"받으실 것입니다."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"만약 이메일을 받지 못하였다면, 등록하신 이메일을 다시 확인하시거나 스팸 메일"
+"함을 확인해주세요."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr "%(site_name)s 의 사용자"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "이어지는 페이지에서 새 비밀번호를 선택하세요."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "사용자명:"
+
+msgid "Thanks for using our site!"
+msgstr "사이트를 이용해 주셔서 고맙습니다."
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 팀"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"비밀번호를 분실하셨습니까? 아래에 이메일 주소를 입력해주십시오. 새로운 비밀번"
+"호를 설정하는 이메일을 보내드리겠습니다."
+
+msgid "Email address:"
+msgstr "이메일 주소"
+
+msgid "Reset my password"
+msgstr "비밀번호 초기화"
+
+msgid "All dates"
+msgstr "언제나"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s 선택"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "변경할 %s 선택"
+
+msgid "Date:"
+msgstr "날짜:"
+
+msgid "Time:"
+msgstr "시각:"
+
+msgid "Lookup"
+msgstr "찾아보기"
+
+msgid "Currently:"
+msgstr "현재:"
+
+msgid "Change:"
+msgstr "변경:"
diff --git a/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a7b0d44
--- /dev/null
+++ b/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..34b116c
--- /dev/null
+++ b/tbc/static/admin/locale/ko/LC_MESSAGES/djangojs.po
@@ -0,0 +1,157 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jaehong Kim <mixe@korea.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jeong Seongtae <magno79@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "이용 가능한 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"사용 가능한 %s 의 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 "
+"\"선택\" 화살표를 클릭하여 몇 가지를 선택할 수 있습니다."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "사용 가능한 %s 리스트를 필터링하려면 이 상자에 입력하세요."
+
+msgid "Filter"
+msgstr "필터"
+
+msgid "Choose all"
+msgstr "모두 선택"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "한번에 모든 %s 를 선택하려면 클릭하세요."
+
+msgid "Choose"
+msgstr "선택"
+
+msgid "Remove"
+msgstr "삭제"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "선택된 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"선택된 %s 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 \"제거\" 화"
+"살표를 클릭하여 일부를 제거 할 수 있습니다."
+
+msgid "Remove all"
+msgstr "모두 제거"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "한번에 선택된 모든 %s 를 제거하려면 클릭하세요."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s개가 %(cnt)s개 중에 선택됨."
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"개별 편집 가능한 필드에 저장되지 않은 값이 있습니다. 액션을 수행하면 저장되"
+"지 않은 값들을 잃어버리게 됩니다."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"개별 필드의 값들을 저장하지 않고 액션을 선택했습니다. OK를 누르면 저장되며, "
+"액션을 한 번 더 실행해야 합니다."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"개별 필드에 아무런 변경이 없는 상태로 액션을 선택했습니다. 저장 버튼이 아니"
+"라 진행 버튼을 찾아보세요."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Note: 서버 시간보다 %s 시간 빠릅니다."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Note: 서버 시간보다 %s 시간 늦은 시간입니다."
+
+msgid "Now"
+msgstr "현재"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "시간 선택"
+
+msgid "Midnight"
+msgstr "자정"
+
+msgid "6 a.m."
+msgstr "오전 6시"
+
+msgid "Noon"
+msgstr "정오"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "취소"
+
+msgid "Today"
+msgstr "오늘"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "어제"
+
+msgid "Tomorrow"
+msgstr "내일"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월"
+
+msgid "S M T W T F S"
+msgstr "일 월 화 수 목 금 토"
+
+msgid "Show"
+msgstr "보기"
+
+msgid "Hide"
+msgstr "감추기"
diff --git a/tbc/static/admin/locale/lb/LC_MESSAGES/django.mo b/tbc/static/admin/locale/lb/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b166d1a
--- /dev/null
+++ b/tbc/static/admin/locale/lb/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lb/LC_MESSAGES/django.po b/tbc/static/admin/locale/lb/LC_MESSAGES/django.po
new file mode 100644
index 0000000..830c9ca
--- /dev/null
+++ b/tbc/static/admin/locale/lb/LC_MESSAGES/django.po
@@ -0,0 +1,625 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# sim0n <sim0n@trypill.org>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Luxembourgish (http://www.transifex.com/django/django/"
+"language/lb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "All"
+
+msgid "Yes"
+msgstr "Jo"
+
+msgid "No"
+msgstr "Nee"
+
+msgid "Unknown"
+msgstr "Onbekannt"
+
+msgid "Any date"
+msgstr "Iergendeen Datum"
+
+msgid "Today"
+msgstr "Haut"
+
+msgid "Past 7 days"
+msgstr "Läscht 7 Deeg"
+
+msgid "This month"
+msgstr "Dëse Mount"
+
+msgid "This year"
+msgstr "Dëst Joer"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Aktioun:"
+
+msgid "action time"
+msgstr ""
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Läschen"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "Änner"
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..5b7937f
--- /dev/null
+++ b/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e1c4a6a
--- /dev/null
+++ b/tbc/static/admin/locale/lb/LC_MESSAGES/djangojs.po
@@ -0,0 +1,145 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:12+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/"
+"language/lb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/lt/LC_MESSAGES/django.mo b/tbc/static/admin/locale/lt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..f1932ad
--- /dev/null
+++ b/tbc/static/admin/locale/lt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lt/LC_MESSAGES/django.po b/tbc/static/admin/locale/lt/LC_MESSAGES/django.po
new file mode 100644
index 0000000..44f2d37
--- /dev/null
+++ b/tbc/static/admin/locale/lt/LC_MESSAGES/django.po
@@ -0,0 +1,688 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# lauris <lauris@runbox.com>, 2011
+# Matas Dailyda <matas@dailyda.com>, 2015
+# Nikolajus Krauklis <nikolajus@gmail.com>, 2013
+# Simonas Kazlauskas <simonas@kazlauskas.me>, 2012-2013
+# sirex <sirexas@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 10:34+0000\n"
+"Last-Translator: Matas Dailyda <matas@dailyda.com>\n"
+"Language-Team: Lithuanian (http://www.transifex.com/django/django/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=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Sėkmingai ištrinta %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ištrinti %(name)s negalima"
+
+msgid "Are you sure?"
+msgstr "Ar esate tikras?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Ištrinti pasirinktus %(verbose_name_plural)s "
+
+msgid "Administration"
+msgstr "Administravimas"
+
+msgid "All"
+msgstr "Visi"
+
+msgid "Yes"
+msgstr "Taip"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Nežinomas"
+
+msgid "Any date"
+msgstr "Betkokia data"
+
+msgid "Today"
+msgstr "Šiandien"
+
+msgid "Past 7 days"
+msgstr "Paskutinės 7 dienos"
+
+msgid "This month"
+msgstr "Šį mėnesį"
+
+msgid "This year"
+msgstr "Šiais metais"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Prašome įvesti tinkamą personalo paskyros %(username)s ir slaptažodį. "
+"Atminkite, kad abu laukeliai yra jautrūs raidžių dydžiui."
+
+msgid "Action:"
+msgstr "Veiksmas:"
+
+msgid "action time"
+msgstr "veiksmo laikas"
+
+msgid "user"
+msgstr "vartotojas"
+
+msgid "content type"
+msgstr "turinio tipas"
+
+msgid "object id"
+msgstr "objekto id"
+
+msgid "object repr"
+msgstr "objekto repr"
+
+msgid "action flag"
+msgstr "veiksmo žymė"
+
+msgid "change message"
+msgstr "pakeisti žinutę"
+
+msgid "log entry"
+msgstr "log įrašas"
+
+msgid "log entries"
+msgstr "log įrašai"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "„%(object)s“ pridėti."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Pakeisti „%(object)s“ - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "„%(object)s“ ištrinti."
+
+msgid "LogEntry Object"
+msgstr "LogEntry objektas"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Nuspauskite \"Control\", arba \"Command\" Mac kompiuteriuose, kad pasirinkti "
+"daugiau nei vieną."
+
+msgid "Added."
+msgstr "Pridėta."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Pakeistas %s."
+
+msgid "and"
+msgstr "ir"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Įrašyta %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Pakeistas %(list)s šiam %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Pašalinta %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nei vienas laukas nepakeistas"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" pridėtas sėkmingai. Jūs galite jį taisytį dar kartą "
+"žemiau."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" buvo sėkmingai pridėtas. Jūs galite pridėti naują "
+"%(name)s žemiau."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" pridėtas sėkmingai."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" buvo sėkmingai pakeistas. Jūs galite jį koreguoti "
+"žemiau."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" buvo sėkmingai pakeistas. Jūs galite pridėti naują "
+"%(name)s žemiau."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" buvo sėkmingai pakeistas."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Įrašai turi būti pasirinkti, kad būtų galima atlikti veiksmus. Įrašai "
+"pakeisti nebuvo."
+
+msgid "No action selected."
+msgstr "Veiksmai atlikti nebuvo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" sėkmingai ištrintas."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Įrašas %(name)s su pirminiu raktu %(key)r neegzistuoja."
+
+#, python-format
+msgid "Add %s"
+msgstr "Pridėti %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Pakeisti %s"
+
+msgid "Database error"
+msgstr "Duomenų bazės klaida"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s sėkmingai pakeistas."
+msgstr[1] "%(count)s %(name)s sėkmingai pakeisti."
+msgstr[2] "%(count)s %(name)s "
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s pasirinktas"
+msgstr[1] "%(total_count)s pasirinkti"
+msgstr[2] "Visi %(total_count)s pasirinkti"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 iš %(cnt)s pasirinkta"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Pakeitimų istorija: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s %(instance)s šalinimas reikalautų pašalinti apsaugotus "
+"susijusius objektus: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django tinklalapio administravimas"
+
+msgid "Django administration"
+msgstr "Django administravimas"
+
+msgid "Site administration"
+msgstr "Tinklalapio administravimas"
+
+msgid "Log in"
+msgstr "Prisijungti"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administravimas"
+
+msgid "Page not found"
+msgstr "Puslapis nerastas"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Atsiprašome, bet prašytas puslapis nerastas."
+
+msgid "Home"
+msgstr "Pradinis"
+
+msgid "Server error"
+msgstr "Serverio klaida"
+
+msgid "Server error (500)"
+msgstr "Serverio klaida (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverio klaida <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Netikėta klaida. Apie ją buvo pranešta administratoriams el. paštu ir ji "
+"turėtų būti greitai sutvarkyta. Dėkui už kantrybę."
+
+msgid "Run the selected action"
+msgstr "Vykdyti pasirinktus veiksmus"
+
+msgid "Go"
+msgstr "Vykdyti"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Spauskite čia norėdami pasirinkti visus įrašus"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Pasirinkti visus %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Atstatyti į pradinę būseną"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Pirmiausia įveskite naudotojo vardą ir slaptažodį. Tada galėsite keisti "
+"daugiau naudotojo nustatymų."
+
+msgid "Enter a username and password."
+msgstr "Įveskite naudotojo vardą ir slaptažodį."
+
+msgid "Change password"
+msgstr "Keisti slaptažodį"
+
+msgid "Please correct the error below."
+msgstr "Ištaisykite žemiau esancias klaidas."
+
+msgid "Please correct the errors below."
+msgstr "Ištaisykite žemiau esančias klaidas."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Įveskite naują slaptažodį naudotojui <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Sveiki,"
+
+msgid "View site"
+msgstr "Peržiūrėti tinklalapį"
+
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+msgid "Log out"
+msgstr "Atsijungti"
+
+msgid "Add"
+msgstr "Pridėti"
+
+msgid "History"
+msgstr "Istorija"
+
+msgid "View on site"
+msgstr "Matyti tinklalapyje"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Naujas %(name)s"
+
+msgid "Filter"
+msgstr "Filtras"
+
+msgid "Remove from sorting"
+msgstr "Pašalinti iš rikiavimo"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Rikiavimo prioritetas: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Perjungti rikiavimą"
+
+msgid "Delete"
+msgstr "Ištrinti"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Trinant %(object_name)s '%(escaped_object)s' turi būti ištrinti ir susiję "
+"objektai, bet tavo vartotojas neturi teisių ištrinti šių objektų:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Ištrinant %(object_name)s '%(escaped_object)s' būtų ištrinti šie apsaugoti "
+"ir susiję objektai:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ar este tikri, kad norite ištrinti %(object_name)s \"%(escaped_object)s\"? "
+"Visi susiję objektai bus ištrinti:"
+
+msgid "Objects"
+msgstr "Objektai"
+
+msgid "Yes, I'm sure"
+msgstr "Taip, esu tikras"
+
+msgid "No, take me back"
+msgstr "Ne, grįžti atgal"
+
+msgid "Delete multiple objects"
+msgstr "Ištrinti kelis objektus"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Ištrinant pasirinktą %(objects_name)s būtų ištrinti susiję objektai, tačiau "
+"jūsų vartotojas neturi reikalingų teisių ištrinti šiuos objektų tipus:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Ištrinant pasirinktus %(objects_name)s būtų ištrinti šie apsaugoti ir susiję "
+"objektai:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ar esate tikri, kad norite ištrinti pasirinktus %(objects_name)s? Sekantys "
+"pasirinkti bei susiję objektai bus ištrinti:"
+
+msgid "Change"
+msgstr "Pakeisti"
+
+msgid "Remove"
+msgstr "Pašalinti"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Pridėti dar viena %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Ištrinti?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Pagal %(filter_title)s "
+
+msgid "Summary"
+msgstr "Santrauka"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s aplikacijos modeliai"
+
+msgid "You don't have permission to edit anything."
+msgstr "Neturite teisių ką nors keistis."
+
+msgid "Recent Actions"
+msgstr "Paskutiniai Veiksmai"
+
+msgid "My Actions"
+msgstr "Mano Veiksmai"
+
+msgid "None available"
+msgstr "Nėra prieinamų"
+
+msgid "Unknown content"
+msgstr "Nežinomas turinys"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Kažkas yra negerai su jūsų duomenų bazės instaliacija. Įsitikink, kad visos "
+"reikalingos lentelės sukurtos ir vartotojas turi teises skaityti duomenų "
+"bazę."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Jūs esate prisijungęs kaip %(username)s, bet neturite teisių patekti į šį "
+"puslapį. Ar norėtumete prisijungti su kitu vartotoju?"
+
+msgid "Forgotten your password or username?"
+msgstr "Pamiršote slaptažodį ar vartotojo vardą?"
+
+msgid "Date/time"
+msgstr "Data/laikas"
+
+msgid "User"
+msgstr "Naudotojas"
+
+msgid "Action"
+msgstr "Veiksmas"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Šis objektas neturi pakeitimų istorijos. Tikriausiai jis buvo pridėtas ne "
+"per administravimo puslapį."
+
+msgid "Show all"
+msgstr "Rodyti visus"
+
+msgid "Save"
+msgstr "Išsaugoti"
+
+msgid "Popup closing..."
+msgstr "Langas užsidaro..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Keisti pasirinktus %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Pridėti dar vieną %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Pašalinti pasirinktus %(model)s"
+
+msgid "Search"
+msgstr "Ieškoti"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s rezultatas"
+msgstr[1] "%(counter)s rezultatai"
+msgstr[2] "%(counter)s rezultatai"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s iš viso"
+
+msgid "Save as new"
+msgstr "Išsaugoti kaip naują"
+
+msgid "Save and add another"
+msgstr "Išsaugoti ir pridėti naują"
+
+msgid "Save and continue editing"
+msgstr "Išsaugoti ir tęsti redagavimą"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dėkui už šiandien tinklalapyje turiningai praleistą laiką."
+
+msgid "Log in again"
+msgstr "Prisijungti dar kartą"
+
+msgid "Password change"
+msgstr "Slaptažodžio keitimas"
+
+msgid "Your password was changed."
+msgstr "Jūsų slaptažodis buvo pakeistas."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Saugumo sumetimais įveskite seną slaptažodį ir tada du kartus naują, kad "
+"įsitikinti, jog nesuklydote rašydamas"
+
+msgid "Change my password"
+msgstr "Keisti mano slaptažodį"
+
+msgid "Password reset"
+msgstr "Slaptažodžio atstatymas"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Jūsų slaptažodis buvo išsaugotas. Dabas galite prisijungti."
+
+msgid "Password reset confirmation"
+msgstr "Slaptažodžio atstatymo patvirtinimas"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Įveskite naująjį slaptažodį du kartus, taip užtikrinant, jog nesuklydote "
+"rašydami."
+
+msgid "New password:"
+msgstr "Naujasis slaptažodis:"
+
+msgid "Confirm password:"
+msgstr "Slaptažodžio patvirtinimas:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Slaptažodžio atstatymo nuoroda buvo negaliojanti, nes ji tikriausiai jau "
+"buvo panaudota. Prašykite naujo slaptažodžio pakeitimo."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Jei egzistuoja vartotojas su jūsų įvestu elektroninio pašto adresu, "
+"išsiųsime jums slaptažodžio nustatymo instrukcijas . Instrukcijas turėtumėte "
+"gauti netrukus."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Jei el. laiško negavote, prašome įsitikinti ar įvedėte tą el. pašto adresą "
+"kuriuo registravotės ir patikrinkite savo šlamšto aplanką."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Jūs gaunate šį laišką nes prašėte paskyros slaptažodžio atkūrimo "
+"%(site_name)s svetainėje."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Prašome eiti į šį puslapį ir pasirinkti naują slaptažodį:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Jūsų naudotojo vardas, jei netyčia jį užmiršote:"
+
+msgid "Thanks for using our site!"
+msgstr "Dėkui, kad naudojatės mūsų tinklalapiu!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komanda"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Pamiršote slaptažodį? Įveskite savo el. pašto adresą ir mes išsiųsime laišką "
+"su instrukcijomis kaip nustatyti naują slaptažodį."
+
+msgid "Email address:"
+msgstr "El. pašto adresas:"
+
+msgid "Reset my password"
+msgstr "Atstatyti slaptažodį"
+
+msgid "All dates"
+msgstr "Visos datos"
+
+#, python-format
+msgid "Select %s"
+msgstr "Pasirinkti %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Pasirinkite %s kurį norite keisti"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Laikas:"
+
+msgid "Lookup"
+msgstr "Paieška"
+
+msgid "Currently:"
+msgstr "Šiuo metu:"
+
+msgid "Change:"
+msgstr "Pakeisti:"
diff --git a/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..95ac325
--- /dev/null
+++ b/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9fa118e
--- /dev/null
+++ b/tbc/static/admin/locale/lt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,176 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kostas <tamosiunas@gmail.com>, 2011
+# Matas Dailyda <matas@dailyda.com>, 2015
+# Povilas Balzaravičius <pavvka@gmail.com>, 2011
+# Simonas Kazlauskas <simonas@kazlauskas.me>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-12 10:09+0000\n"
+"Last-Translator: Matas Dailyda <matas@dailyda.com>\n"
+"Language-Team: Lithuanian (http://www.transifex.com/django/django/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=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Galimi %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Tai yra sąrašas prieinamų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir "
+"paspausdami „Pasirinkti“ rodyklę tarp dviejų dėžučių jūs galite pasirinkti "
+"keletą iš jų."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Rašykite į šią dėžutę, kad išfiltruotumėte prieinamų %s sąrašą."
+
+msgid "Filter"
+msgstr "Filtras"
+
+msgid "Choose all"
+msgstr "Pasirinkti visus"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Spustelėkite, kad iš karto pasirinktumėte visus %s."
+
+msgid "Choose"
+msgstr "Pasirinkti"
+
+msgid "Remove"
+msgstr "Pašalinti"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Pasirinktas %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Tai yra sąrašas pasirinktų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir "
+"paspausdami „Pašalinti“ rodyklę tarp dviejų dėžučių jūs galite pašalinti "
+"keletą iš jų."
+
+msgid "Remove all"
+msgstr "Pašalinti visus"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Spustelėkite, kad iš karto pašalintumėte visus pasirinktus %s."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "pasirinktas %(sel)s iš %(cnt)s"
+msgstr[1] "pasirinkti %(sel)s iš %(cnt)s"
+msgstr[2] "pasirinkti %(sel)s iš %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Turite neišsaugotų pakeitimų. Jeigu tęsite, Jūsų pakeitimai bus prarasti."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Pasirinkote veiksmą, bet dar neesate išsaugoję pakeitimų. Nuspauskite Gerai "
+"norėdami išsaugoti. Jus reikės iš naujo paleisti veiksmą."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Pasirinkote veiksmą, bet neesate pakeitę laukų reikšmių. Jūs greičiausiai "
+"ieškote mygtuko Vykdyti, o ne mygtuko Saugoti."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"Pastaba: Jūsų laikrodis rodo %s valanda daugiau nei serverio laikrodis."
+msgstr[1] ""
+"Pastaba: Jūsų laikrodis rodo %s valandomis daugiau nei serverio laikrodis."
+msgstr[2] ""
+"Pastaba: Jūsų laikrodis rodo %s valandų daugiau nei serverio laikrodis."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Pastaba: Jūsų laikrodis rodo %s valanda mažiau nei serverio laikrodis."
+msgstr[1] ""
+"Pastaba: Jūsų laikrodis rodo %s valandomis mažiau nei serverio laikrodis."
+msgstr[2] ""
+"Pastaba: Jūsų laikrodis rodo %s valandų mažiau nei serverio laikrodis."
+
+msgid "Now"
+msgstr "Dabar"
+
+msgid "Choose a Time"
+msgstr "Pasirinkite laiką"
+
+msgid "Choose a time"
+msgstr "Pasirinkite laiką"
+
+msgid "Midnight"
+msgstr "Vidurnaktis"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Vidurdienis"
+
+msgid "6 p.m."
+msgstr "18:00"
+
+msgid "Cancel"
+msgstr "Atšaukti"
+
+msgid "Today"
+msgstr "Šiandien"
+
+msgid "Choose a Date"
+msgstr "Pasirinkite datą"
+
+msgid "Yesterday"
+msgstr "Vakar"
+
+msgid "Tomorrow"
+msgstr "Rytoj"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Sausis Vasaris Kovas Balandis Gegužė Birželis Liepa Rugpjūtis Rugsėjis "
+"Spalis Lapkritis Gruodis"
+
+msgid "S M T W T F S"
+msgstr "S Pr A T K Pn Š"
+
+msgid "Show"
+msgstr "Parodyti"
+
+msgid "Hide"
+msgstr "Slėpti"
diff --git a/tbc/static/admin/locale/lv/LC_MESSAGES/django.mo b/tbc/static/admin/locale/lv/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9a136bf
--- /dev/null
+++ b/tbc/static/admin/locale/lv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lv/LC_MESSAGES/django.po b/tbc/static/admin/locale/lv/LC_MESSAGES/django.po
new file mode 100644
index 0000000..a5ed007
--- /dev/null
+++ b/tbc/static/admin/locale/lv/LC_MESSAGES/django.po
@@ -0,0 +1,646 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# edgars <edgars.jekabsons@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Latvian (http://www.transifex.com/django/django/language/"
+"lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Veiksmīgi izdzēsti %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "Vai esat pārliecināts?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Izdzēst izvēlēto %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Visi"
+
+msgid "Yes"
+msgstr "Jā"
+
+msgid "No"
+msgstr "Nē"
+
+msgid "Unknown"
+msgstr "Nezināms"
+
+msgid "Any date"
+msgstr "Jebkurš datums"
+
+msgid "Today"
+msgstr "Šodien"
+
+msgid "Past 7 days"
+msgstr "Pēdējās 7 dienas"
+
+msgid "This month"
+msgstr "Šomēnes"
+
+msgid "This year"
+msgstr "Šogad"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Darbība:"
+
+msgid "action time"
+msgstr "darbības laiks"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "objekta id"
+
+msgid "object repr"
+msgstr "objekta attēlojums"
+
+msgid "action flag"
+msgstr "darbības atzīme"
+
+msgid "change message"
+msgstr "izmaiņas teksts"
+
+msgid "log entry"
+msgstr "žurnāla ieraksts"
+
+msgid "log entries"
+msgstr "žurnāla ieraksti"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "nekas"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Izmainīts %s."
+
+msgid "and"
+msgstr "un"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Pievienots %(name)s \"%(object)s\""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Izmainīts %(list)s priekš %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Dzēsts %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Lauki nav izmainīti"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" pievienots sekmīgi. Zemāk varat to labot."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" pievienots sekmīgi."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" nomainīts sekmīgi."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "Lai veiktu darbību, jāizvēlas rindas. Rindas nav izmainītas."
+
+msgid "No action selected."
+msgstr "Nav izvēlēta darbība."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" sekmīgi izdzēsts."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s objekts ar primāro atslēgu %(key)r neeksistē."
+
+#, python-format
+msgid "Add %s"
+msgstr "Pievienot %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Labot %s"
+
+msgid "Database error"
+msgstr "Datubāzes kļūda"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ir laboti sekmīgi"
+msgstr[1] "%(count)s %(name)s ir sekmīgi rediģēts"
+msgstr[2] "%(count)s %(name)s ir sekmīgi rediģēti."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s izvēlēti"
+msgstr[1] "%(total_count)s izvēlēts"
+msgstr[2] "%(total_count)s izvēlēti"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 no %(cnt)s izvēlēti"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Izmaiņu vēsture: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django administrācijas lapa"
+
+msgid "Django administration"
+msgstr "Django administrācija"
+
+msgid "Site administration"
+msgstr "Lapas administrācija"
+
+msgid "Log in"
+msgstr "Pieslēgties"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Lapa nav atrasta"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Atvainojiet, pieprasītā lapa neeksistē."
+
+msgid "Home"
+msgstr "Sākums"
+
+msgid "Server error"
+msgstr "Servera kļūda"
+
+msgid "Server error (500)"
+msgstr "Servera kļūda (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Servera kļūda <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Izpildīt izvēlēto darbību"
+
+msgid "Go"
+msgstr "Aiziet!"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Spiest šeit, lai iezīmētu objektus no visām lapām"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Izvēlēties visus %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Atcelt iezīmēto"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Vispirms ievadiet lietotāja vārdu un paroli. Tad varēsiet labot pārējos "
+"lietotāja uzstādījumus."
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "Paroles maiņa"
+
+msgid "Please correct the error below."
+msgstr "Lūdzu, izlabojiet kļūdas zemāk."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Ievadiet jaunu paroli lietotājam <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Sveicināti,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentācija"
+
+msgid "Log out"
+msgstr "Atslēgties"
+
+msgid "Add"
+msgstr "Pievienot"
+
+msgid "History"
+msgstr "Vēsture"
+
+msgid "View on site"
+msgstr "Apskatīt lapā"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pievienot %(name)s"
+
+msgid "Filter"
+msgstr "Filtrs"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Dzēst"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Izdzēšot objektu %(object_name)s '%(escaped_object)s', tiks dzēsti visi "
+"saistītie objekti, bet jums nav tiesību dzēst sekojošus objektu tipus:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s \"%(escaped_object)s"
+"\"? Tiks dzēsti arī sekojoši saistītie objekti:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Jā, esmu pārliecināts"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Dzēst vairākus objektus"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "Izmainīt"
+
+msgid "Remove"
+msgstr "Dzēst"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Pievienot vēl %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Dzēst?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Pēc %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Jums nav tiesības neko labot."
+
+msgid "Recent Actions"
+msgstr "Nesenās darbības"
+
+msgid "My Actions"
+msgstr "Manas darbības"
+
+msgid "None available"
+msgstr "Nav pieejams"
+
+msgid "Unknown content"
+msgstr "Nezināms saturs"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Problēma ar datubāzes instalāciju. Pārliecinieties, ka attiecīgās tabulas ir "
+"izveidotas un attiecīgajam lietotājam ir tiesības tai piekļūt."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "Datums/laiks"
+
+msgid "User"
+msgstr "Lietotājs"
+
+msgid "Action"
+msgstr "Darbība"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Šim objektam nav izmaiņu vēstures. Tas visdrīzāk netika pievienots, "
+"izmantojot šo administrācijas rīku."
+
+msgid "Show all"
+msgstr "Rādīt visu"
+
+msgid "Save"
+msgstr "Saglabāt"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Meklēt"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "kopā - %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Saglabāt kā jaunu"
+
+msgid "Save and add another"
+msgstr "Saglabāt un pievienot vēl vienu"
+
+msgid "Save and continue editing"
+msgstr "Saglabāt un turpināt labošanu"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Paldies par pavadīto laiku mājas lapā."
+
+msgid "Log in again"
+msgstr "Pieslēgties vēlreiz"
+
+msgid "Password change"
+msgstr "Paroles maiņa"
+
+msgid "Your password was changed."
+msgstr "Jūsu parole tika nomainīta."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Drošības nolūkos ievadiet veco paroli un pēc tam ievadiet jauno paroli "
+"divreiz, lai varētu pārbaudīt, ka tā ir uzrakstīta pareizi."
+
+msgid "Change my password"
+msgstr "Nomainīt manu paroli"
+
+msgid "Password reset"
+msgstr "Paroles pārstatīšana(reset)"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Jūsu parole ir uzstādīta. Varat pieslēgties."
+
+msgid "Password reset confirmation"
+msgstr "Paroles pārstatīšanas apstiprinājums"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Lūdzu ievadiet jauno paroli divreiz, lai varētu pārbaudīt, ka tā ir "
+"uzrakstīta pareizi."
+
+msgid "New password:"
+msgstr "Jaunā parole:"
+
+msgid "Confirm password:"
+msgstr "Apstiprināt paroli:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Paroles pārstatīšanas saite bija nekorekta, iespējams, tā jau ir izmantota. "
+"Lūdzu pieprasiet paroles pārstatīšanu vēlreiz."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Lūdzu apmeklējiet sekojošo lapu un ievadiet jaunu paroli:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Jūsu lietotājvārds, ja gadījumā tas ir aizmirsts:"
+
+msgid "Thanks for using our site!"
+msgstr "Paldies par mūsu lapas lietošanu!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komanda"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Paroles pārstatīšana"
+
+msgid "All dates"
+msgstr "Visi datumi"
+
+#, python-format
+msgid "Select %s"
+msgstr "Izvēlēties %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Izvēlēties %s, lai izmainītu"
+
+msgid "Date:"
+msgstr "Datums:"
+
+msgid "Time:"
+msgstr "Laiks:"
+
+msgid "Lookup"
+msgstr "Pārlūkot"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3150019
--- /dev/null
+++ b/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..188eed9
--- /dev/null
+++ b/tbc/static/admin/locale/lv/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Latvian (http://www.transifex.com/django/django/language/"
+"lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Pieejams %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Filtrs"
+
+msgid "Choose all"
+msgstr "Izvēlēties visu"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "Izņemt"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Izvēlies %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s no %(cnt)s izvēlēts"
+msgstr[1] "%(sel)s no %(cnt)s izvēlēti"
+msgstr[2] "%(sel)s no %(cnt)s izvēlēti"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Jūs neesat saglabājis izmaiņas rediģējamiem laukiem. Ja jūs tagad "
+"izpildīsiet izvēlēto darbību, šīs izmaiņas netiks saglabātas."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Jūs esat izvēlējies veikt darbību un neesat saglabājis veiktās izmaiņas. "
+"Lūdzu nospiežat OK, lai saglabātu. Jums nāksies šo darbību izpildīt vēlreiz."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Jūs esat izvēlējies veikt darbību un neesat izmainījis nevienu lauku. Jūs "
+"droši vien meklējat pogu 'Aiziet' nevis 'Saglabāt'."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr "Tagad"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Izvēlieties laiku"
+
+msgid "Midnight"
+msgstr "Pusnakts"
+
+msgid "6 a.m."
+msgstr "06.00"
+
+msgid "Noon"
+msgstr "Pusdienas laiks"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Atcelt"
+
+msgid "Today"
+msgstr "Šodien"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Vakar"
+
+msgid "Tomorrow"
+msgstr "Rīt"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janvāris Februāris Marts Aprīlis Maijs Jūnijs Jūlijs Augusts Septembris "
+"Oktobris Novembris Decembris"
+
+msgid "S M T W T F S"
+msgstr "S P O T C P S"
+
+msgid "Show"
+msgstr "Parādīt"
+
+msgid "Hide"
+msgstr "Slēpt"
diff --git a/tbc/static/admin/locale/mk/LC_MESSAGES/django.mo b/tbc/static/admin/locale/mk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0d3d749
--- /dev/null
+++ b/tbc/static/admin/locale/mk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mk/LC_MESSAGES/django.po b/tbc/static/admin/locale/mk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fe9eb9b
--- /dev/null
+++ b/tbc/static/admin/locale/mk/LC_MESSAGES/django.po
@@ -0,0 +1,682 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# dekomote <dr.mote@gmail.com>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Vasil Vangelovski <vvangelovski@gmail.com>, 2013-2015
+# Vasil Vangelovski <vvangelovski@gmail.com>, 2011-2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Macedonian (http://www.transifex.com/django/django/language/"
+"mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Успешно беа избришани %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Не може да се избрише %(name)s"
+
+msgid "Are you sure?"
+msgstr "Сигурни сте?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Избриши ги избраните %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Администрација"
+
+msgid "All"
+msgstr "Сите"
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Не"
+
+msgid "Unknown"
+msgstr "Непознато"
+
+msgid "Any date"
+msgstr "Било кој датум"
+
+msgid "Today"
+msgstr "Денеска"
+
+msgid "Past 7 days"
+msgstr "Последните 7 дена"
+
+msgid "This month"
+msgstr "Овој месец"
+
+msgid "This year"
+msgstr "Оваа година"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Ве молиме внесете ги точните %(username)s и лозинка за член на сајтот. "
+"Внимавајте, двете полиња се осетливи на големи и мали букви."
+
+msgid "Action:"
+msgstr "Акција:"
+
+msgid "action time"
+msgstr "време на акција"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "идентификационен број на објект"
+
+msgid "object repr"
+msgstr "репрезентација на објект"
+
+msgid "action flag"
+msgstr "знакче за акција"
+
+msgid "change message"
+msgstr "измени ја пораката"
+
+msgid "log entry"
+msgstr "ставка во записникот"
+
+msgid "log entries"
+msgstr "ставки во записникот"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Додадено \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Променето \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Избришано \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Запис во дневник"
+
+msgid "None"
+msgstr "Ништо"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Држете го копчето \"Control\", или \"Command\" на Mac, за да изберете повеќе "
+"од едно."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Изменета %s."
+
+msgid "and"
+msgstr "и"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Додадено %(name)s „%(object)s“."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Изменето %(list)s за %(name)s „%(object)s“."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Избришано %(name)s „%(object)s“."
+
+msgid "No fields changed."
+msgstr "Не е изменето ниедно поле."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Ставката %(name)s \"%(obj)s\" беше успешно додадена. Подолу можете повторно "
+"да ја уредите."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ставката %(name)s \"%(obj)s\" беше успешно додадена. Можете да додадете нов "
+"%(name)s подолу."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Ставката %(name)s \"%(obj)s\" беше успешно додадена."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Ставката %(name)s \"%(obj)s\" беше успешно уредена. Подолу можете повторно "
+"да ја уредите."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ставката %(name)s \"%(obj)s\" беше успешно уредена. Подолу можете да "
+"додадете нов %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" беше успешно изменета."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Мора да се одберат предмети за да се изврши акција врз нив. Ниеден предмет "
+"не беше променет."
+
+msgid "No action selected."
+msgstr "Ниедна акција не е одбрана."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Ставаката %(name)s \"%(obj)s\" беше успешно избришана."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Објект %(name)s со примарен клуч %(key)r не постои."
+
+#, python-format
+msgid "Add %s"
+msgstr "Додади %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Измени %s"
+
+msgid "Database error"
+msgstr "Грешка во базата на податоци"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s ставка %(name)s беше успешно изменета."
+msgstr[1] "%(count)s ставки %(name)s беа успешно изменети."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s одбран"
+msgstr[1] "Сите %(total_count)s одбрани"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 од %(cnt)s избрани"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Историја на измени: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Бришењето на %(class_name)s %(instance)s бара бришење на следните заштитени "
+"поврзани објекти: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Администрација на Џанго сајт"
+
+msgid "Django administration"
+msgstr "Џанго администрација"
+
+msgid "Site administration"
+msgstr "Администрација на сајт"
+
+msgid "Log in"
+msgstr "Најава"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Администрација на %(app)s"
+
+msgid "Page not found"
+msgstr "Страницата не е најдена"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Се извинуваме, но неможе да ја најдеме страницата која ја баравте."
+
+msgid "Home"
+msgstr "Дома"
+
+msgid "Server error"
+msgstr "Грешка со серверот"
+
+msgid "Server error (500)"
+msgstr "Грешка со серверот (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Грешка со серверот <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Се случи грешка. Администраторите на сајтот се известени и треба да биде "
+"брзо поправена. Ви благодариме за вашето трпение."
+
+msgid "Run the selected action"
+msgstr "Изврши ја избраната акција"
+
+msgid "Go"
+msgstr "Оди"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Кликнете тука за да изберете објекти низ сите страници"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Избери ги сите %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Откажи го изборот"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Прво, внесете корисничко име и лозинка. Потоа ќе можете да уредувате повеќе "
+"кориснички опции."
+
+msgid "Enter a username and password."
+msgstr "Внесете корисничко име и лозинка."
+
+msgid "Change password"
+msgstr "Промени лозинка"
+
+msgid "Please correct the error below."
+msgstr "Ве молам поправете ги грешките подолу."
+
+msgid "Please correct the errors below."
+msgstr "Ве молам поправете ги грешките подолу."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Внесете нова лозинка за корисникот <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Добредојдовте,"
+
+msgid "View site"
+msgstr "Посети го сајтот"
+
+msgid "Documentation"
+msgstr "Документација"
+
+msgid "Log out"
+msgstr "Одјава"
+
+msgid "Add"
+msgstr "Додади"
+
+msgid "History"
+msgstr "Историја"
+
+msgid "View on site"
+msgstr "Погледни на сајтот"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додади %(name)s"
+
+msgid "Filter"
+msgstr "Филтер"
+
+msgid "Remove from sorting"
+msgstr "Отстрани од сортирање"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Приоритет на сортирање: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Вклучи/исклучи сортирање"
+
+msgid "Delete"
+msgstr "Избриши"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на "
+"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги "
+"бришете следните типови на објекти:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на "
+"следниве заштитени објекти:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? "
+"Сите овие ставки ќе бидат избришани:"
+
+msgid "Objects"
+msgstr "Предмети"
+
+msgid "Yes, I'm sure"
+msgstr "Да, сигурен сум"
+
+msgid "No, take me back"
+msgstr "Не, врати ме назад"
+
+msgid "Delete multiple objects"
+msgstr "Избриши повеќе ставки"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Бришење на избраните %(objects_name)s ќе резултира со бришење на поврзани "
+"објекти, но немате одобрување да ги избришете следниве типови објекти:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Бришење на избраните %(objects_name)s бара бришење на следните поврзани "
+"објекти кои се заштитени:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Дали сте сигурни дека сакате да го избришете избраниот %(objects_name)s? "
+"Сите овие објекти и оние поврзани со нив ќе бидат избришани:"
+
+msgid "Change"
+msgstr "Измени"
+
+msgid "Remove"
+msgstr "Отстрани"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Додадете уште %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Избриши?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Според %(filter_title)s "
+
+msgid "Summary"
+msgstr "Резиме"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Модели во %(name)s апликација"
+
+msgid "You don't have permission to edit anything."
+msgstr "Немате дозвола ништо да уредува."
+
+msgid "Recent Actions"
+msgstr "Последни акции"
+
+msgid "My Actions"
+msgstr "Мои акции"
+
+msgid "None available"
+msgstr "Ништо не е достапно"
+
+msgid "Unknown content"
+msgstr "Непозната содржина"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Нешто не е во ред со инсталацијата на базата на податоци. Потврдете дека "
+"соодветни табели во базата се направени и потврдете дека базата може да биде "
+"прочитана од соодветниот корисник."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Ја заборавивте вашата лозинка или корисничко име?"
+
+msgid "Date/time"
+msgstr "Датум/час"
+
+msgid "User"
+msgstr "Корисник"
+
+msgid "Action"
+msgstr "Акција"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Овој објект нема историја на измени. Најверојатно не бил додаден со админ "
+"сајтот."
+
+msgid "Show all"
+msgstr "Прикажи ги сите"
+
+msgid "Save"
+msgstr "Сними"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Промени ги избраните %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Додади уште %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Избриши ги избраните %(model)s"
+
+msgid "Search"
+msgstr "Барај"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s резултат"
+msgstr[1] "%(counter)s резултати"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "вкупно %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Сними како нова"
+
+msgid "Save and add another"
+msgstr "Сними и додади уште"
+
+msgid "Save and continue editing"
+msgstr "Сними и продолжи со уредување"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"Ви благодариме што денеска поминавте квалитетно време со интернет страницава."
+
+msgid "Log in again"
+msgstr "Најавете се повторно"
+
+msgid "Password change"
+msgstr "Измена на лозинка"
+
+msgid "Your password was changed."
+msgstr "Вашата лозинка беше сменета."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја "
+"новата двапати за да може да се потврди дека правилно сте ја искуцале."
+
+msgid "Change my password"
+msgstr "Промени ја мојата лозинка"
+
+msgid "Password reset"
+msgstr "Ресетирање на лозинка"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Вашата лозинка беше поставена. Сега можете да се најавите."
+
+msgid "Password reset confirmation"
+msgstr "Одобрување за ресетирање на лозинка"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Ве молам внесете ја вашата нова лозинка двапати за да може да бидете сигурни "
+"дека правилно сте ја внеле."
+
+msgid "New password:"
+msgstr "Нова лозинка:"
+
+msgid "Confirm password:"
+msgstr "Потврди лозинка:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Врската за ресетирање на лозинката беше невалидна, најверојатно бидејќи веќе "
+"била искористена. Ве молам повторно побарајте ресетирање на вашата лозинката."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Ви испративме упатства за поставување на вашата лозинката, ако постои "
+"корисник со е-пошта што ја внесовте. Треба наскоро да ги добиете "
+"инструкциите."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ако не примивте email, ве молиме осигурајте се дека сте ја внесле правата "
+"адреса кога се регистриравте и проверете го spam фолдерот."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Го примате овој email бидејќи побаравте ресетирање на лозинка за вашето "
+"корисничко име на %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Ве молам одете на следната страница и внесете нова лозинка:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Вашето корисничко име, во случај да сте го заборавиле:"
+
+msgid "Thanks for using our site!"
+msgstr "Ви благодариме што го користите овој сајт!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Тимот на %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Ја заборавивте вашата лозинка? Внесете ја вашата email адреса подолу, ќе "
+"добиете порака со инструкции за промена на лозинката."
+
+msgid "Email address:"
+msgstr "Email адреса:"
+
+msgid "Reset my password"
+msgstr "Ресетирај ја мојата лозинка"
+
+msgid "All dates"
+msgstr "Сите датуми"
+
+#, python-format
+msgid "Select %s"
+msgstr "Изберете %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за измена"
+
+msgid "Date:"
+msgstr "Датум:"
+
+msgid "Time:"
+msgstr "Време:"
+
+msgid "Lookup"
+msgstr "Побарај"
+
+msgid "Currently:"
+msgstr "Моментално:"
+
+msgid "Change:"
+msgstr "Измени:"
diff --git a/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..6321de3
--- /dev/null
+++ b/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9d104a3
--- /dev/null
+++ b/tbc/static/admin/locale/mk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,164 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Vasil Vangelovski <vvangelovski@gmail.com>, 2014
+# Vasil Vangelovski <vvangelovski@gmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Macedonian (http://www.transifex.com/django/django/language/"
+"mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Достапно %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ова е листа на достапни %s. Можете да изберете неколку кликајќи на нив во "
+"полето подолу и со кликање на стрелката \"Одбери\" помеѓу двете полиња."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Пишувајте во ова поле за да ја филтрирате листата на достапни %s."
+
+msgid "Filter"
+msgstr "Филтер"
+
+msgid "Choose all"
+msgstr "Избери ги сите"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Кликнете за да ги изберете сите %s од еднаш."
+
+msgid "Choose"
+msgstr "Изберете"
+
+msgid "Remove"
+msgstr "Отстрани"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Избрано %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ова е листа на избрани %s. Можете да отстраните неколку кликајќи на нив во "
+"полето подолу и со кликање на стрелката \"Отстрани\" помеѓу двете полиња."
+
+msgid "Remove all"
+msgstr "Отстрани ги сите"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Кликнете за да ги отстраните сите одбрани %s одеднаш."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "избрано %(sel)s од %(cnt)s"
+msgstr[1] "избрани %(sel)s од %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Имате незачувани промени на поединечни полиња. Ако извршите акција вашите "
+"незачувани промени ќе бидат изгубени."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Избравте акција, но сеуште ги немате зачувано вашите промени на поединечни "
+"полиња. Кликнете ОК за да ги зачувате. Ќе треба повторно да ја извршите "
+"акцијата."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Избравте акција и немате направено промени на поединечни полиња. Веројатно "
+"го барате копчето Оди наместо Зачувај."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Забелешка: Вие сте %s час понапред од времето на серверот."
+msgstr[1] "Забелешка: Вие сте %s часа понапред од времето на серверот."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Забелешка: Вие сте %s час поназад од времето на серверот."
+msgstr[1] "Забелешка: Вие сте %s часа поназад од времето на серверот."
+
+msgid "Now"
+msgstr "Сега"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Избери време"
+
+msgid "Midnight"
+msgstr "Полноќ"
+
+msgid "6 a.m."
+msgstr "6 наутро"
+
+msgid "Noon"
+msgstr "Пладне"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Откажи"
+
+msgid "Today"
+msgstr "Денеска"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Вчера"
+
+msgid "Tomorrow"
+msgstr "Утре"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Јануари Февруари Март Април Мај Јуни Јули Август Септември Октомври Ноември "
+"Декември"
+
+msgid "S M T W T F S"
+msgstr "Н П В С Ч П С"
+
+msgid "Show"
+msgstr "Прикажи"
+
+msgid "Hide"
+msgstr "Сокриј"
diff --git a/tbc/static/admin/locale/ml/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ml/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..791ac3c
--- /dev/null
+++ b/tbc/static/admin/locale/ml/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ml/LC_MESSAGES/django.po b/tbc/static/admin/locale/ml/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cdf07d8
--- /dev/null
+++ b/tbc/static/admin/locale/ml/LC_MESSAGES/django.po
@@ -0,0 +1,664 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aby Thomas <abyzthomas@gmail.com>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Junaid <junu.pv@gmail.com>, 2012
+# Rajeesh Nair <rajeeshrnair@gmail.com>, 2011-2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Malayalam (http://www.transifex.com/django/django/language/"
+"ml/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ml\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s നീക്കം ചെയ്തു."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s നീക്കം ചെയ്യാന്‍ കഴിയില്ല."
+
+msgid "Are you sure?"
+msgstr "തീര്‍ച്ചയാണോ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "തെരഞ്ഞെടുത്ത %(verbose_name_plural)s നീക്കം ചെയ്യുക."
+
+msgid "Administration"
+msgstr "ഭരണം"
+
+msgid "All"
+msgstr "എല്ലാം"
+
+msgid "Yes"
+msgstr "അതെ"
+
+msgid "No"
+msgstr "അല്ല"
+
+msgid "Unknown"
+msgstr "അജ്ഞാതം"
+
+msgid "Any date"
+msgstr "ഏതെങ്കിലും തീയതി"
+
+msgid "Today"
+msgstr "ഇന്ന്"
+
+msgid "Past 7 days"
+msgstr "കഴിഞ്ഞ ഏഴു ദിവസം"
+
+msgid "This month"
+msgstr "ഈ മാസം"
+
+msgid "This year"
+msgstr "ഈ വര്‍ഷം"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"ദയവായി സ്റ്റാഫ് അക്കൗണ്ടിനുവേണ്ടിയുള്ള ശരിയായ %(username)s -ഉം പാസ്‌വേഡും നല്കുക. രണ്ടു "
+"കള്ളികളിലും അക്ഷരങ്ങള്‍ (ഇംഗ്ലീഷിലെ) വലിയക്ഷരമോ ചെറിയക്ഷരമോ എന്നത് പ്രധാനമാണെന്നത് "
+"ശ്രദ്ധിയ്ക്കുക."
+
+msgid "Action:"
+msgstr "ആക്ഷന്‍"
+
+msgid "action time"
+msgstr "ആക്ഷന്‍ സമയം"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "ഒബ്ജെക്ട് ഐഡി"
+
+msgid "object repr"
+msgstr "ഒബ്ജെക്ട് സൂചന"
+
+msgid "action flag"
+msgstr "ആക്ഷന്‍ ഫ്ളാഗ്"
+
+msgid "change message"
+msgstr "സന്ദേശം മാറ്റുക"
+
+msgid "log entry"
+msgstr "ലോഗ് എന്ട്രി"
+
+msgid "log entries"
+msgstr "ലോഗ് എന്ട്രികള്‍"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" ചേര്‍ത്തു."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\"ല്‍ %(changes)s മാറ്റം വരുത്തി"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" നീക്കം ചെയ്തു."
+
+msgid "LogEntry Object"
+msgstr "ലോഗ്‌എന്‍ട്രി വസ്തു"
+
+msgid "None"
+msgstr "ഒന്നുമില്ല"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s മാറ്റി."
+
+msgid "and"
+msgstr "ഉം"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ചേര്‍ത്തു."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ന്റെ %(list)s മാറ്റി."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ഡിലീറ്റ് ചെയ്തു."
+
+msgid "No fields changed."
+msgstr "ഒരു മാറ്റവുമില്ല."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" കൂട്ടി ചേര്‍ത്തു. താഴെ നിന്നും മാറ്റം വരുത്താം."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" കൂട്ടി ചേര്‍ത്തു. താഴെ ഒരു %(name)s കൂടെ കൂട്ടിച്ചേർക്കാം."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" വിജയകരമായി കൂട്ടിച്ചേര്ത്തു."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" മാറ്റം വരുത്തി. താഴെ വീണ്ടും മാറ്റം വരുത്താം."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" മാറ്റം വരുത്തി. താഴെ ഒരു %(name)s കൂടെ കൂട്ടിച്ചേർക്കാം."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ല്‍ മാറ്റം വരുത്തി."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നും മാറ്റിയിട്ടില്ല."
+
+msgid "No action selected."
+msgstr "ആക്ഷനൊന്നും തെരഞ്ഞെടുത്തില്ല."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" നീക്കം ചെയ്തു."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r എന്ന പ്രാഥമിക കീ ഉള്ള %(name)s വസ്തു ഒന്നും നിലവിലില്ല."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s ചേര്‍ക്കുക"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s മാറ്റാം"
+
+msgid "Database error"
+msgstr "ഡേറ്റാബേസ് തകരാറാണ്."
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി."
+msgstr[1] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s തെരഞ്ഞെടുത്തു."
+msgstr[1] "%(total_count)sഉം തെരഞ്ഞെടുത്തു."
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s ല്‍ ഒന്നും തെരഞ്ഞെടുത്തില്ല."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "%s ലെ മാറ്റങ്ങള്‍."
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+" %(class_name)s %(instance)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന "
+"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "ജാംഗോ സൈറ്റ് അഡ്മിന്‍"
+
+msgid "Django administration"
+msgstr "ജാംഗോ ഭരണം"
+
+msgid "Site administration"
+msgstr "സൈറ്റ് ഭരണം"
+
+msgid "Log in"
+msgstr "ലോഗ്-ഇന്‍"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s ഭരണം"
+
+msgid "Page not found"
+msgstr "പേജ് കണ്ടില്ല"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "ക്ഷമിക്കണം, ആവശ്യപ്പെട്ട പേജ് കണ്ടെത്താന്‍ കഴിഞ്ഞില്ല."
+
+msgid "Home"
+msgstr "പൂമുഖം"
+
+msgid "Server error"
+msgstr "സെര്‍വര്‍ തകരാറാണ്"
+
+msgid "Server error (500)"
+msgstr "സെര്‍വര്‍ തകരാറാണ് (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "സെര്‍വര്‍ തകരാറാണ് <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"എന്തോ തകരാറ് സംഭവിച്ചു. ബന്ധപ്പെട്ട സൈറ്റ് ഭരണകർത്താക്കളെ ഈമെയിൽ മുഖാന്തരം അറിയിച്ചിട്ടുണ്ട്. "
+"ഷമയൊടെ കത്തിരിക്കുനതിന് നന്ദി."
+
+msgid "Run the selected action"
+msgstr "തെരഞ്ഞെടുത്ത ആക്ഷന്‍ നടപ്പിലാക്കുക"
+
+msgid "Go"
+msgstr "Go"
+
+msgid "Click here to select the objects across all pages"
+msgstr "എല്ലാ പേജിലേയും വസ്തുക്കള്‍ തെരഞ്ഞെടുക്കാന്‍ ഇവിടെ ക്ലിക് ചെയ്യുക."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "മുഴുവന്‍ %(total_count)s %(module_name)s ഉം തെരഞ്ഞെടുക്കുക"
+
+msgid "Clear selection"
+msgstr "തെരഞ്ഞെടുത്തത് റദ്ദാക്കുക."
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "ആദ്യം, യൂസര്‍ നാമവും പാസ് വേര്‍ഡും നല്കണം. പിന്നെ, കൂടുതല്‍ കാര്യങ്ങള്‍ മാറ്റാവുന്നതാണ്."
+
+msgid "Enter a username and password."
+msgstr "Enter a username and password."
+
+msgid "Change password"
+msgstr "പാസ് വേര്‍ഡ് മാറ്റുക."
+
+msgid "Please correct the error below."
+msgstr "ദയവായി താഴെയുള്ള തെറ്റുകള്‍ പരിഹരിക്കുക."
+
+msgid "Please correct the errors below."
+msgstr "ദയവായി താഴെയുള്ള തെറ്റുകള്‍ പരിഹരിക്കുക."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> ന് പുതിയ പാസ് വേര്‍ഡ് നല്കുക."
+
+msgid "Welcome,"
+msgstr "സ്വാഗതം, "
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "സഹായക്കുറിപ്പുകള്‍"
+
+msgid "Log out"
+msgstr "പുറത്ത് കടക്കുക."
+
+msgid "Add"
+msgstr "ചേര്‍ക്കുക"
+
+msgid "History"
+msgstr "ചരിത്രം"
+
+msgid "View on site"
+msgstr "View on site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ചേര്‍ക്കുക"
+
+msgid "Filter"
+msgstr "അരിപ്പ"
+
+msgid "Remove from sorting"
+msgstr "ക്രമീകരണത്തില്‍ നിന്നും ഒഴിവാക്കുക"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "ക്രമീകരണത്തിനുള്ള മുന്‍ഗണന: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "ക്രമീകരണം വിപരീത ദിശയിലാക്കുക."
+
+msgid "Delete"
+msgstr "നീക്കം ചെയ്യുക"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s ഡിലീറ്റ് ചെയ്യുമ്പോള്‍ അതുമായി ബന്ധമുള്ള "
+"വസ്തുക്കളുംഡിലീറ്റ് ആവും. പക്ഷേ നിങ്ങള്‍ക്ക് താഴെ പറഞ്ഞ തരം വസ്തുക്കള്‍ ഡിലീറ്റ് ചെയ്യാനുള്ള അനുമതി "
+"ഇല്ല:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"തിരഞ്ഞെടുക്കപ്പെട്ട %(object_name)s '%(escaped_object)s' നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് "
+"ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" നീക്കം ചെയ്യണമെന്ന് ഉറപ്പാണോ?അതുമായി ബന്ധമുള്ള "
+"താഴെപ്പറയുന്ന വസ്തുക്കളെല്ലാം നീക്കം ചെയ്യുന്നതാണ്:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "അതെ, തീര്‍ച്ചയാണ്"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "ഒന്നിലേറെ വസ്തുക്കള്‍ നീക്കം ചെയ്യുക"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്താൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന "
+"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്, പക്ഷെ അതിനുളള അവകാശം അക്കൗണ്ടിനില്ല:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ "
+"താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെന്നു ഉറപ്പാണോ ? തിരഞ്ഞെടുക്കപ്പെട്ടതും "
+"അതിനോട് ബന്ധപ്പെട്ടതും ആയ എല്ലാ താഴെപ്പറയുന്ന വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:"
+
+msgid "Change"
+msgstr "മാറ്റുക"
+
+msgid "Remove"
+msgstr "നീക്കം ചെയ്യുക"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "%(verbose_name)s ഒന്നു കൂടി ചേര്‍ക്കുക"
+
+msgid "Delete?"
+msgstr "ഡിലീറ്റ് ചെയ്യട്ടെ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ആൽ"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s മാതൃകയിലുള്ള"
+
+msgid "You don't have permission to edit anything."
+msgstr "ഒന്നിലും മാറ്റം വരുത്താനുള്ള അനുമതി ഇല്ല."
+
+msgid "Recent Actions"
+msgstr "സമീപകാല പ്രവ്രുത്തികള്‍"
+
+msgid "My Actions"
+msgstr "എന്റെ പ്രവ്രുത്തികള്‍"
+
+msgid "None available"
+msgstr "ഒന്നും ലഭ്യമല്ല"
+
+msgid "Unknown content"
+msgstr "ഉള്ളടക്കം അറിയില്ല."
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"നിങ്ങളുടെ ഡേറ്റാബേസ് ഇന്‍സ്ടാലേഷനില്‍ എന്തോ പിശകുണ്ട്. ശരിയായ ടേബിളുകള്‍ ഉണ്ടെന്നും ഡേറ്റാബേസ് "
+"വായനായോഗ്യമാണെന്നും ഉറപ്പു വരുത്തുക."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "രഹസ്യവാക്കോ ഉപയോക്തൃനാമമോ മറന്നുപോയോ?"
+
+msgid "Date/time"
+msgstr "തീയതി/സമയം"
+
+msgid "User"
+msgstr "യൂസര്‍"
+
+msgid "Action"
+msgstr "ആക്ഷന്‍"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ഈ വസ്തുവിന്റെ മാറ്റങ്ങളുടെ ചരിത്രം ലഭ്യമല്ല. ഒരുപക്ഷെ ഇത് അഡ്മിന്‍ സൈറ്റ് വഴി "
+"ചേര്‍ത്തതായിരിക്കില്ല."
+
+msgid "Show all"
+msgstr "എല്ലാം കാണട്ടെ"
+
+msgid "Save"
+msgstr "സേവ് ചെയ്യണം"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "പരതുക"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s results"
+msgstr[1] "%(counter)s ഫലം"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "ആകെ %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "പുതിയതായി സേവ് ചെയ്യണം"
+
+msgid "Save and add another"
+msgstr "സേവ് ചെയ്ത ശേഷം വേറെ ചേര്‍ക്കണം"
+
+msgid "Save and continue editing"
+msgstr "സേവ് ചെയ്ത ശേഷം മാറ്റം വരുത്താം"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ഈ വെബ് സൈറ്റില്‍ കുറെ നല്ല സമയം ചെലവഴിച്ചതിനു നന്ദി."
+
+msgid "Log in again"
+msgstr "വീണ്ടും ലോഗ്-ഇന്‍ ചെയ്യുക."
+
+msgid "Password change"
+msgstr "പാസ് വേര്‍ഡ് മാറ്റം"
+
+msgid "Your password was changed."
+msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് മാറ്റിക്കഴിഞ്ഞു."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"സുരക്ഷയ്ക്കായി നിങ്ങളുടെ പഴയ പാസ് വേര്‍ഡ് നല്കുക. പിന്നെ, പുതിയ പാസ് വേര്‍ഡ് രണ്ട് തവണ നല്കുക. "
+"(ടയ്പ് ചെയ്തതു ശരിയാണെന്ന് ഉറപ്പാക്കാന്‍)"
+
+msgid "Change my password"
+msgstr "എന്റെ പാസ് വേര്‍ഡ് മാറ്റണം"
+
+msgid "Password reset"
+msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് തയ്യാര്‍. ഇനി ലോഗ്-ഇന്‍ ചെയ്യാം."
+
+msgid "Password reset confirmation"
+msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ ഉറപ്പാക്കല്‍"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"ദയവായി നിങ്ങളുടെ പുതിയ പാസ് വേര്‍ഡ് രണ്ടു തവണ നല്കണം. ശരിയായാണ് ടൈപ്പു ചെയ്തത് എന്നു "
+"ഉറപ്പിക്കാനാണ്."
+
+msgid "New password:"
+msgstr "പുതിയ പാസ് വേര്‍ഡ്:"
+
+msgid "Confirm password:"
+msgstr "പാസ് വേര്‍ഡ് ഉറപ്പാക്കൂ:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കാന്‍ നല്കിയ ലിങ്ക് യോഗ്യമല്ല. ഒരു പക്ഷേ, അതു മുന്പ് തന്നെ ഉപയോഗിച്ചു "
+"കഴിഞ്ഞതാവാം. പുതിയ ഒരു ലിങ്കിന് അപേക്ഷിക്കൂ."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"ഞങ്ങളുടെ ഇമെയിൽ കിട്ടിയില്ലെങ്കിൽ രജിസ്റ്റർ ചെയ്യാൻ ഉപയോകിച്ച അതെ ഇമെയിൽ വിലാസം തന്നെ "
+"ആണോ എന്ന് ഉറപ്പ് വരുത്തുക. ശരിയാണെങ്കിൽ സ്പാം ഫോൾഡറിലും നോക്കുക "
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"നിങ്ങളുൾ പാസ് വേർഡ്‌ മാറ്റാനുള്ള നിർദേശങ്ങൾ %(site_name)s ഇൽ ആവശ്യപ്പെട്ടതുകൊണ്ടാണ് ഈ "
+"ഇമെയിൽ സന്ദേശം ലഭിച്ചദ്."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "ദയവായി താഴെ പറയുന്ന പേജ് സന്ദര്‍ശിച്ച് പുതിയ പാസ് വേര്‍ഡ് തെരഞ്ഞെടുക്കുക:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "നിങ്ങള്‍ മറന്നെങ്കില്‍, നിങ്ങളുടെ യൂസര്‍ നാമം, :"
+
+msgid "Thanks for using our site!"
+msgstr "ഞങ്ങളുടെ സൈറ്റ് ഉപയോഗിച്ചതിന് നന്ദി!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s പക്ഷം"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"പാസ് വേര്‍ഡ് മറന്നു പോയോ? നിങ്ങളുടെ ഇമെയിൽ വിലാസം താഴെ എഴുതുക. പാസ് വേർഡ്‌ മാറ്റാനുള്ള "
+"നിർദേശങ്ങൾ ഇമെയിലിൽ അയച്ചു തരുന്നതായിരിക്കും."
+
+msgid "Email address:"
+msgstr "ഇമെയിൽ വിലാസം:"
+
+msgid "Reset my password"
+msgstr "എന്റെ പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കൂ"
+
+msgid "All dates"
+msgstr "എല്ലാ തീയതികളും"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s തെരഞ്ഞെടുക്കൂ"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "മാറ്റാനുള്ള %s തെരഞ്ഞെടുക്കൂ"
+
+msgid "Date:"
+msgstr "തീയതി:"
+
+msgid "Time:"
+msgstr "സമയം:"
+
+msgid "Lookup"
+msgstr "തിരയുക"
+
+msgid "Currently:"
+msgstr "പ്രചാരത്തിൽ:"
+
+msgid "Change:"
+msgstr "മാറ്റം"
diff --git a/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3806a94
--- /dev/null
+++ b/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..50631f3
--- /dev/null
+++ b/tbc/static/admin/locale/ml/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aby Thomas <abyzthomas@gmail.com>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Rajeesh Nair <rajeeshrnair@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Malayalam (http://www.transifex.com/django/django/language/"
+"ml/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ml\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "ലഭ്യമായ %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"ഇതാണ് ലഭ്യമായ %s പട്ടിക. അതില്‍ ചിലത് തിരഞ്ഞെടുക്കാന്‍ താഴെ കളത്തില്‍ നിന്നും ഉചിതമായവ സെലക്ട് "
+"ചെയ്ത ശേഷം രണ്ടു കളങ്ങള്‍ക്കുമിടയിലെ \"തെരഞ്ഞെടുക്കൂ\" അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "ലഭ്യമായ %s പട്ടികയെ ഫില്‍ട്ടര്‍ ചെയ്തെടുക്കാന്‍ ഈ ബോക്സില്‍ ടൈപ്പ് ചെയ്യുക."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "%s എല്ലാം ഒന്നിച്ച് തെരഞ്ഞെടുക്കാന്‍ ക്ലിക് ചെയ്യുക."
+
+msgid "Choose"
+msgstr "തെരഞ്ഞെടുക്കൂ"
+
+msgid "Remove"
+msgstr "നീക്കം ചെയ്യൂ"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "തെരഞ്ഞെടുത്ത %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"തെരഞ്ഞെടുക്കപ്പെട്ട %s പട്ടികയാണിത്. അവയില്‍ ചിലത് ഒഴിവാക്കണമെന്നുണ്ടെങ്കില്‍ താഴെ കളത്തില്‍ "
+"നിന്നും അവ സെലക്ട് ചെയ്ത് കളങ്ങള്‍ക്കിടയിലുള്ള \"നീക്കം ചെയ്യൂ\" എന്ന അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക."
+
+msgid "Remove all"
+msgstr "എല്ലാം നീക്കം ചെയ്യുക"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "തെരഞ്ഞെടുക്കപ്പെട്ട %s എല്ലാം ഒരുമിച്ച് നീക്കം ചെയ്യാന്‍ ക്ലിക് ചെയ്യുക."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)sല്‍ %(sel)s തെരഞ്ഞെടുത്തു"
+msgstr[1] "%(cnt)sല്‍ %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങളെല്ലാം "
+"നഷ്ടപ്പെടും."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. പക്ഷേ, കളങ്ങളിലെ മാറ്റങ്ങള്‍ ഇനിയും സേവ് ചെയ്യാനുണ്ട്. "
+"ആദ്യം സേവ്ചെയ്യാനായി OK ക്ലിക് ചെയ്യുക. അതിനു ശേഷം ആക്ഷന്‍ ഒന്നു കൂടി പ്രയോഗിക്കേണ്ടി വരും."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. കളങ്ങളില്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങള്‍ ഇല്ല. നിങ്ങള്‍സേവ് ബട്ടണ്‍ "
+"തന്നെയാണോ അതോ ഗോ ബട്ടണാണോ ഉദ്ദേശിച്ചത്."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്."
+msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്."
+msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്."
+
+msgid "Now"
+msgstr "ഇപ്പോള്‍"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "സമയം തെരഞ്ഞെടുക്കൂ"
+
+msgid "Midnight"
+msgstr "അര്‍ധരാത്രി"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "ഉച്ച"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "റദ്ദാക്കൂ"
+
+msgid "Today"
+msgstr "ഇന്ന്"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "ഇന്നലെ"
+
+msgid "Tomorrow"
+msgstr "നാളെ"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ജനുവരി ഫെബൃവരി മാര്‍ച്ച് ഏപ്രില്‍ മെയ് ജൂണ്‍ ജൂലൈ ആഗസ്ത് സെപ്തംബര്‍ ഒക്ടോബര്‍ നവംബര്‍ ഡിസംബര്‍"
+
+msgid "S M T W T F S"
+msgstr "ഞാ തി ചൊ ബു വ്യാ വെ ശ"
+
+msgid "Show"
+msgstr "കാണട്ടെ"
+
+msgid "Hide"
+msgstr "മറയട്ടെ"
diff --git a/tbc/static/admin/locale/mn/LC_MESSAGES/django.mo b/tbc/static/admin/locale/mn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ee32d23
--- /dev/null
+++ b/tbc/static/admin/locale/mn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mn/LC_MESSAGES/django.po b/tbc/static/admin/locale/mn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c4265a8
--- /dev/null
+++ b/tbc/static/admin/locale/mn/LC_MESSAGES/django.po
@@ -0,0 +1,681 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ankhbayar <ankhaa1002@gmail.com>, 2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# jargalan <jargalanch@gmail.com>, 2011
+# Анхбаяр Анхаа <l.ankhbayar@gmail.com>, 2013-2015
+# Баясгалан Цэвлээ <bayasaa_7672@yahoo.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Mongolian (http://www.transifex.com/django/django/language/"
+"mn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(items)s ээс %(count)d-ийг амжилттай устгалаа."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s устгаж чадахгүй."
+
+msgid "Are you sure?"
+msgstr "Итгэлтэй байна уу?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Сонгосон %(verbose_name_plural)s-ийг устга"
+
+msgid "Administration"
+msgstr "Удирдлага"
+
+msgid "All"
+msgstr "Бүгд "
+
+msgid "Yes"
+msgstr "Тийм"
+
+msgid "No"
+msgstr "Үгүй"
+
+msgid "Unknown"
+msgstr "Тодорхойгүй"
+
+msgid "Any date"
+msgstr "Бүх өдөр"
+
+msgid "Today"
+msgstr "Өнөөдөр"
+
+msgid "Past 7 days"
+msgstr "Өнгөрсөн долоо хоног"
+
+msgid "This month"
+msgstr "Энэ сар"
+
+msgid "This year"
+msgstr "Энэ жил"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Ажилтан хэрэглэгчийн %(username)s ба нууц үгийг зөв оруулна уу. Хоёр талбарт "
+"том жижигээр үсгээр бичих ялгаатай."
+
+msgid "Action:"
+msgstr "Үйлдэл:"
+
+msgid "action time"
+msgstr "үйлдлийн хугацаа"
+
+msgid "user"
+msgstr "хэрэглэгч"
+
+msgid "content type"
+msgstr "агуулгын төрөл"
+
+msgid "object id"
+msgstr "обектийн id"
+
+msgid "object repr"
+msgstr "обектийн хамаарал"
+
+msgid "action flag"
+msgstr "үйлдэлийн тэмдэг"
+
+msgid "change message"
+msgstr "өөрчлөлтийн мэдээлэл"
+
+msgid "log entry"
+msgstr "лог өгөгдөл"
+
+msgid "log entries"
+msgstr "лог өгөгдөлүүд"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" нэмсэн."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\"-ийг %(changes)s өөрчилсөн."
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" устгасан."
+
+msgid "LogEntry Object"
+msgstr "Лог бүртгэлийн обект"
+
+msgid "None"
+msgstr "Хоосон"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Олон утга сонгохын тулд \"Control\", эсвэл Mac дээр \"Command\" товчыг дарж "
+"байгаад сонгоно."
+
+msgid "Added."
+msgstr "Нэмэгдсэн."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Өөрчлөгдсөн %s."
+
+msgid "and"
+msgstr "ба"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Нэмэгдсэн %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\"-ийн өөрчлөгдсөн %(list)s"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Устгасан %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Өөрчилсөн талбар алга байна."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" амжилттай нэмэгдлээ. Доорх хэсэгт үүнийг ахин засварлах "
+"боломжтой."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" амжилттай нэмэгдлээ. Доорх хэсгээс %(name)s өөрийн "
+"нэмэх боломжтой."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr " %(name)s \"%(obj)s\" амжилттай нэмэгдлээ."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" амжилттай өөрчлөгдлөө. Доорх хэсэгт дахин засах "
+"боломжтой."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" амжилттай өөрчлөгдлөө. Доорх %(name)s хэсгээс дахин "
+"нэмэх боломжтой."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr " %(name)s \"%(obj)s\" амжилттай өөрчлөгдлөө. "
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Үйлдэл хийхийн тулд Та ядаж 1-ийг сонгох хэрэгтэй. Өөрчилөлт хийгдсэнгүй."
+
+msgid "No action selected."
+msgstr "Үйлдэл сонгоогүй."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr " %(name)s \"%(obj)s\" амжилттай устгагдлаа."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s обектийн үндсэн түлхүүр %(key)r олдохгүй байна."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s-ийг нэмэх"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s-ийг өөрчлөх"
+
+msgid "Database error"
+msgstr "Өгөгдлийн сангийн алдаа"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s-ийг амжилттай өөрчиллөө."
+msgstr[1] "%(count)s %(name)s-ийг амжилттай өөрчиллөө."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Бүгд %(total_count)s сонгогдсон"
+msgstr[1] "Бүгд %(total_count)s сонгогдсон"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s оос 0 сонгосон"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Өөрчлөлтийн түүх: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(instance)s %(class_name)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+" %(class_name)s төрлийн %(instance)s-ийг устгах гэж байна. Эхлээд дараах "
+"холбоотой хамгаалагдсан обектуудыг устгах шаардлагатай: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Сайтын удирдлага"
+
+msgid "Django administration"
+msgstr "Удирдлага"
+
+msgid "Site administration"
+msgstr "Сайтын удирдлага"
+
+msgid "Log in"
+msgstr "Нэвтрэх"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s удирдлага"
+
+msgid "Page not found"
+msgstr "Хуудас олдсонгүй."
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Уучлаарай, хандахыг хүссэн хуудас тань олдсонгүй."
+
+msgid "Home"
+msgstr "Нүүр"
+
+msgid "Server error"
+msgstr "Серверийн алдаа"
+
+msgid "Server error (500)"
+msgstr "Серверийн алдаа (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Серверийн алдаа <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Алдаа гарсан байна. Энэ алдааг сайт хариуцагчид имэйлээр мэдэгдсэн бөгөөд "
+"тэд нэн даруй засах хэрэгтэй. Хүлээцтэй хандсанд баярлалаа."
+
+msgid "Run the selected action"
+msgstr "Сонгосон үйлдэлийг ажилуулах"
+
+msgid "Go"
+msgstr "Гүйцэтгэх"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Бүх хуудаснууд дээрх объектуудыг сонгох"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Сонгосонг цэвэрлэх"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Эхлээд хэрэглэгчийн нэр нууц үгээ оруулна уу. Ингэснээр та хэрэглэгчийн "
+"сонголтыг нэмж засварлах боломжтой болно. "
+
+msgid "Enter a username and password."
+msgstr "Хэрэглэгчийн нэр ба нууц үгээ оруулна."
+
+msgid "Change password"
+msgstr "Нууц үг өөрчлөх"
+
+msgid "Please correct the error below."
+msgstr "Доорх алдаануудыг засна уу."
+
+msgid "Please correct the errors below."
+msgstr "Доор гарсан алдаануудыг засна уу."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong>.хэрэглэгчид шинэ нууц үг оруулна уу."
+
+msgid "Welcome,"
+msgstr "Тавтай морилно уу"
+
+msgid "View site"
+msgstr "Сайтаас харах"
+
+msgid "Documentation"
+msgstr "Баримтжуулалт"
+
+msgid "Log out"
+msgstr "Гарах"
+
+msgid "Add"
+msgstr "Нэмэх"
+
+msgid "History"
+msgstr "Түүх"
+
+msgid "View on site"
+msgstr "Сайтаас харах"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s нэмэх"
+
+msgid "Filter"
+msgstr "Шүүлтүүр"
+
+msgid "Remove from sorting"
+msgstr "Эрэмблэлтээс хасах"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Эрэмблэх урьтамж: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Эрэмбэлэлтийг харуул"
+
+msgid "Delete"
+msgstr "Устгах"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s'-ийг устгавал холбогдох объект нь устах "
+"ч бүртгэл тань дараах төрлийн объектуудийг устгах зөвшөөрөлгүй байна:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+" %(object_name)s обектийг устгаж байна. '%(escaped_object)s' холбоотой "
+"хамгаалагдсан обектуудыг заавал утсгах хэрэгтэй :"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Та %(object_name)s \"%(escaped_object)s\"-ийг устгахдаа итгэлтэй байна уу? "
+"Үүнийг устгавал дараах холбогдох зүйлс нь бүгд устана:"
+
+msgid "Objects"
+msgstr "Бичлэгүүд"
+
+msgid "Yes, I'm sure"
+msgstr "Тийм, итгэлтэй байна."
+
+msgid "No, take me back"
+msgstr "Үгүй, намайг буцаа"
+
+msgid "Delete multiple objects"
+msgstr "Олон обектууд устгах"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Сонгосон %(objects_name)s обектуудыг устгасанаар хамаатай бүх обкетууд устах "
+"болно. Гэхдээ таньд эрх эдгээр төрлийн обектуудыг утсгах эрх байхгүй байна: "
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"%(objects_name)s обектуудыг утсгаж байна дараах холбоотой хамгаалагдсан "
+"обектуудыг устгах шаардлагатай:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Та %(objects_name)s ийг устгах гэж байна итгэлтэй байна? Дараах обектууд "
+"болон холбоотой зүйлс хамт устагдах болно:"
+
+msgid "Change"
+msgstr "Өөрчлөх"
+
+msgid "Remove"
+msgstr "Хасах"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Өөр %(verbose_name)s нэмэх "
+
+msgid "Delete?"
+msgstr "Устгах уу?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s -ээр"
+
+msgid "Summary"
+msgstr "Нийт"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s хэрэглүүр дэх моделууд."
+
+msgid "You don't have permission to edit anything."
+msgstr "Та ямар нэг зүйл засварлах зөвшөөрөлгүй байна."
+
+msgid "Recent Actions"
+msgstr "Сүүлд хийсэн үйлдлүүд"
+
+msgid "My Actions"
+msgstr "Миний үйлдлүүд"
+
+msgid "None available"
+msgstr "Үйлдэл алга"
+
+msgid "Unknown content"
+msgstr "Тодорхойгүй агуулга"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Өгөгдлийн сангийн ямар нэг зүйл буруу суугдсан байна. Өгөгдлийн сангийн "
+"зохих хүснэгт үүсгэгдсэн эсэх, өгөгдлийн санг зохих хэрэглэгч унших "
+"боломжтой байгаа эсэхийг шалгаарай."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Та %(username)s нэрээр нэвтэрсэн байна гэвч энэ хуудасхуу хандах эрх "
+"байхгүй байна. Та өөр эрхээр логин хийх үү?"
+
+msgid "Forgotten your password or username?"
+msgstr "Таны мартсан нууц үг эсвэл нэрвтэр нэр?"
+
+msgid "Date/time"
+msgstr "Огноо/цаг"
+
+msgid "User"
+msgstr "Хэрэглэгч"
+
+msgid "Action"
+msgstr "Үйлдэл"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Уг объектэд өөрчлөлтийн түүх байхгүй байна. Магадгүй үүнийг уг удирдлагын "
+"сайтаар дамжуулан нэмээгүй байх."
+
+msgid "Show all"
+msgstr "Бүгдийг харуулах"
+
+msgid "Save"
+msgstr "Хадгалах"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Сонгосон %(model)s-ийг өөрчлөх"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Өөр %(model)s нэмэх"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Сонгосон %(model)s устгах"
+
+msgid "Search"
+msgstr "Хайлт"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s үр дүн"
+msgstr[1] "%(counter)s үр дүн"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Нийт %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Шинээр хадгалах"
+
+msgid "Save and add another"
+msgstr "Хадгалаад өөрийг нэмэх"
+
+msgid "Save and continue editing"
+msgstr "Хадгалаад нэмж засах"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Манай вэб сайтыг ашигласанд баярлалаа."
+
+msgid "Log in again"
+msgstr "Ахин нэвтрэх "
+
+msgid "Password change"
+msgstr "Нууц үгийн өөрчлөлт"
+
+msgid "Your password was changed."
+msgstr "Нууц үг тань өөрчлөгдлөө."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Аюулгүй байдлын үүднээс хуучин нууц үгээ оруулаад шинэ нууц үгээ хоёр удаа "
+"хийнэ үү. Ингэснээр нууц үгээ зөв бичиж байгаа эсэхийг тань шалгах юм."
+
+msgid "Change my password"
+msgstr "Нууц үгээ солих"
+
+msgid "Password reset"
+msgstr "Нууц үг шинэчилэх"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Та нууц үгтэй боллоо. Одоо бүртгэлд нэвтрэх боломжтой."
+
+msgid "Password reset confirmation"
+msgstr "Нууц үг шинэчилэхийг баталгаажуулах"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Шинэ нууц үгээ хоёр удаа оруулна уу. Ингэснээр нууц үгээ зөв бичиж байгаа "
+"эсэхийг тань шалгах юм. "
+
+msgid "New password:"
+msgstr "Шинэ нууц үг:"
+
+msgid "Confirm password:"
+msgstr "Нууц үгээ батлах:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Нууц үг авах холбоос болохгүй байна. Үүнийг аль хэдийнэ хэрэглэснээс болсон "
+"байж болзошгүй. Шинэ нууц үг авахаар хүсэлт гаргана уу. "
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Таны оруулсан имайл хаяг бүртгэлтэй бол таны имайл хаягруу нууц үг "
+"тохируулах зааварыг удахгүй очих болно. Та удахгүй имайл хүлээж авах болно. "
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Хэрвээ та имайл хүлээж аваагүй бол оруулсан имайл хаягаараа бүртгүүлсэн "
+"эсхээ шалгаад мөн имайлийнхаа Spam фолдер ийг шалгана уу."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"%(site_name)s сайтанд бүртгүүлсэн эрхийн нууц үгийг сэргээх хүсэлт гаргасан "
+"учир энэ имэйл ийг та хүлээн авсан болно. "
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Хэрэглэгчийн нэрээ мартсан бол :"
+
+msgid "Thanks for using our site!"
+msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s баг"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Нууц үгээ мартсан уу? Доорх хэсэгт имайл хаягаа оруулвал бид хаягаар тань "
+"нууц үг сэргэх зааварчилгаа явуулах болно."
+
+msgid "Email address:"
+msgstr "Имэйл хаяг:"
+
+msgid "Reset my password"
+msgstr "Нууц үгээ шинэчлэх"
+
+msgid "All dates"
+msgstr "Бүх огноо"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s-г сонго"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Өөрчлөх %s-г сонгоно уу"
+
+msgid "Date:"
+msgstr "Огноо:"
+
+msgid "Time:"
+msgstr "Цаг:"
+
+msgid "Lookup"
+msgstr "Хайх"
+
+msgid "Currently:"
+msgstr "Одоогийнх:"
+
+msgid "Change:"
+msgstr "Өөрчилөлт:"
diff --git a/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..949918c
--- /dev/null
+++ b/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2081ca0
--- /dev/null
+++ b/tbc/static/admin/locale/mn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,162 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Tsolmon <mnts26@gmail.com>, 2012
+# Zorig <zorig_ezd@yahoo.com>, 2014
+# Анхбаяр Анхаа <l.ankhbayar@gmail.com>, 2011-2012,2015
+# Ганзориг БП <ganzo.bp@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 11:21+0000\n"
+"Last-Translator: Анхбаяр Анхаа <l.ankhbayar@gmail.com>\n"
+"Language-Team: Mongolian (http://www.transifex.com/django/django/language/"
+"mn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Боломжтой %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Энэ %s жагсаалт нь боломжит утгын жагсаалт. Та аль нэгийг нь сонгоод \"Сонгох"
+"\" дээр дарж нөгөө хэсэгт оруулах боломжтой."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Энэ нүдэнд бичээд дараах %s жагсаалтаас шүүнэ үү. "
+
+msgid "Filter"
+msgstr "Шүүлтүүр"
+
+msgid "Choose all"
+msgstr "Бүгдийг нь сонгох"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Бүгдийг сонгох бол %s дарна уу"
+
+msgid "Choose"
+msgstr "Сонгох"
+
+msgid "Remove"
+msgstr "Хас"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Сонгогдсон %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Энэ %s сонгогдсон утгуудыг жагсаалт. Та аль нэгийг нь хасахыг хүсвэл сонгоох "
+"\"Хас\" дээр дарна уу."
+
+msgid "Remove all"
+msgstr "Бүгдийг арилгах"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "%s ийн сонгоод бүгдийг нь арилгана"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s ээс %(cnt)s сонгосон"
+msgstr[1] "%(sel)s ээс %(cnt)s сонгосон"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Хадгалаагүй өөрчлөлтүүд байна. Энэ үйлдэлийг хийвэл өөрчлөлтүүд устах болно."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Та 1 үйлдлийг сонгосон байна, гэвч та өөрийн өөрчлөлтүүдээ тодорхой "
+"талбаруудад нь оруулагүй байна. OK дарж сануулна уу. Энэ үйлдлийг та дахин "
+"хийх шаардлагатай."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Та 1 үйлдлийг сонгосон байна бас та ямарваа өөрчлөлт оруулсангүй. Та Save "
+"товчлуур биш Go товчлуурыг хайж байгаа бололтой."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Та серверийн цагаас %s цагийн түрүүнд явж байна"
+msgstr[1] "Та серверийн цагаас %s цагийн түрүүнд явж байна"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Та серверийн цагаас %s цагаар хоцорч байна"
+msgstr[1] "Та серверийн цагаас %s цагаар хоцорч байна"
+
+msgid "Now"
+msgstr "Одоо"
+
+msgid "Choose a Time"
+msgstr "Цаг сонгох"
+
+msgid "Choose a time"
+msgstr "Цаг сонгох"
+
+msgid "Midnight"
+msgstr "Шөнө дунд"
+
+msgid "6 a.m."
+msgstr "6 цаг"
+
+msgid "Noon"
+msgstr "Үд дунд"
+
+msgid "6 p.m."
+msgstr "Оройн 6 цаг"
+
+msgid "Cancel"
+msgstr "Болих"
+
+msgid "Today"
+msgstr "Өнөөдөр"
+
+msgid "Choose a Date"
+msgstr "Өдөр сонгох"
+
+msgid "Yesterday"
+msgstr "Өчигдөр"
+
+msgid "Tomorrow"
+msgstr "Маргааш"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Хулгана Үхэр Бар Туулай Луу Могой Морь Хонь Бич Тахиа Нохой Гахай"
+
+msgid "S M T W T F S"
+msgstr "Ня Да Мя Лх Пү Ба Бя"
+
+msgid "Show"
+msgstr "Үзэх"
+
+msgid "Hide"
+msgstr "Нуух"
diff --git a/tbc/static/admin/locale/mr/LC_MESSAGES/django.mo b/tbc/static/admin/locale/mr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d847b48
--- /dev/null
+++ b/tbc/static/admin/locale/mr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mr/LC_MESSAGES/django.po b/tbc/static/admin/locale/mr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c02c72b
--- /dev/null
+++ b/tbc/static/admin/locale/mr/LC_MESSAGES/django.po
@@ -0,0 +1,609 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-18 08:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/"
+"mr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mr\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Any date"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr ""
+
+msgid "This year"
+msgstr ""
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+msgid "(None)"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..183b3d1
--- /dev/null
+++ b/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2026d16
--- /dev/null
+++ b/tbc/static/admin/locale/mr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,145 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:12+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/"
+"mr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mr\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/my/LC_MESSAGES/django.mo b/tbc/static/admin/locale/my/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..838e1cf
--- /dev/null
+++ b/tbc/static/admin/locale/my/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/my/LC_MESSAGES/django.po b/tbc/static/admin/locale/my/LC_MESSAGES/django.po
new file mode 100644
index 0000000..a55817d
--- /dev/null
+++ b/tbc/static/admin/locale/my/LC_MESSAGES/django.po
@@ -0,0 +1,622 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Yhal Htet Aung <jumoun@gmail.com>, 2013-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Burmese (http://www.transifex.com/django/django/language/"
+"my/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: my\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr "စီမံခန့်ခွဲမှု"
+
+msgid "All"
+msgstr "အားလုံး"
+
+msgid "Yes"
+msgstr "ဟုတ်"
+
+msgid "No"
+msgstr "မဟုတ်"
+
+msgid "Unknown"
+msgstr "အမည်မသိ"
+
+msgid "Any date"
+msgstr "နှစ်သက်ရာရက်စွဲ"
+
+msgid "Today"
+msgstr "ယနေ့"
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr "ယခုလ"
+
+msgid "This year"
+msgstr "ယခုနှစ်"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "လုပ်ဆောင်ချက်:"
+
+msgid "action time"
+msgstr ""
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "တစ်ခုမှမဟုတ်"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr "နှင့်"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "ထည့်သွင်း %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "ပြောင်းလဲ %s"
+
+msgid "Database error"
+msgstr "အချက်အလက်အစုအမှား"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "မှတ်တမ်းပြောင်းလဲ: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr "ဒီဂျန်ဂိုစီမံခန့်ခွဲမှု"
+
+msgid "Site administration"
+msgstr "ဆိုက်စီမံခန့်ခွဲမှု"
+
+msgid "Log in"
+msgstr "ဖွင့်ဝင်"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr "ပင်မ"
+
+msgid "Server error"
+msgstr "ဆာဗာအမှားပြ"
+
+msgid "Server error (500)"
+msgstr "ဆာဗာအမှားပြ (၅၀၀)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "ဆာဗာအမှားပြ <em>(၅၀၀)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr "သွား"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "စကားဝှက်ပြောင်း"
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "ကြိုဆို၊ "
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "စာရွက်စာတမ်း"
+
+msgid "Log out"
+msgstr "ဖွင့်ထွက်"
+
+msgid "Add"
+msgstr "ထည့်သွင်း"
+
+msgid "History"
+msgstr "မှတ်တမ်း"
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr "စီစစ်မှု"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "ပယ်ဖျက်"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "ပြောင်းလဲ"
+
+msgid "Remove"
+msgstr "ဖယ်ရှား"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr "ပယ်ဖျက်?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr "အကျဉ်းချုပ်"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "ရက်စွဲ/အချိန်"
+
+msgid "User"
+msgstr "အသုံးပြုသူ"
+
+msgid "Action"
+msgstr "လုပ်ဆောင်ချက်"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr "သိမ်းဆည်း"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "ရှာဖွေ"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr "စကားဝှက်ပြောင်း"
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr "အီးမေးလ်လိပ်စာ:"
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr "ရက်စွဲအားလုံး"
+
+#, python-format
+msgid "Select %s"
+msgstr "ရွေးချယ် %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "ပြောင်းလဲရန် %s ရွေးချယ်"
+
+msgid "Date:"
+msgstr "ရက်စွဲ:"
+
+msgid "Time:"
+msgstr "အချိန်:"
+
+msgid "Lookup"
+msgstr "ပြန်ကြည့်"
+
+msgid "Currently:"
+msgstr "လက်ရှိ:"
+
+msgid "Change:"
+msgstr "ပြောင်းလဲ:"
diff --git a/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..57e02af
--- /dev/null
+++ b/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..16527f3
--- /dev/null
+++ b/tbc/static/admin/locale/my/LC_MESSAGES/djangojs.po
@@ -0,0 +1,150 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Yhal Htet Aung <jumoun@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Burmese (http://www.transifex.com/django/django/language/"
+"my/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: my\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s ကိုရယူနိုင်"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုရွေးချယ်နိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ရွေး"
+"\"များကိုကလစ်နှိပ်။"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "ယခုဘူးထဲတွင်စာသားရိုက်ထည့်ပြီး %s ရယူနိုင်သောစာရင်းကိုစိစစ်နိုင်။"
+
+msgid "Filter"
+msgstr "စီစစ်မှု"
+
+msgid "Choose all"
+msgstr "အားလံုးရွေး"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ရွေးချယ်ရန်ကလစ်နှိပ်။"
+
+msgid "Choose"
+msgstr "ရွေး"
+
+msgid "Remove"
+msgstr "ဖယ်ရှား"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s ရွေးပြီး"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုဖယ်ရှားနိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ဖယ်ရှား"
+"\"ကိုကလစ်နှိပ်။"
+
+msgid "Remove all"
+msgstr "အားလံုးဖယ်ရှား"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ဖယ်ရှားရန်ကလစ်နှိပ်။"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s မှ %(sel)s ရွေးချယ်ပြီး"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "ယခု"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "အချိန်ရွေးပါ"
+
+msgid "Midnight"
+msgstr "သန်းခေါင်"
+
+msgid "6 a.m."
+msgstr "မနက်၆နာရီ"
+
+msgid "Noon"
+msgstr "မွန်းတည့်"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "ပယ်ဖျက်"
+
+msgid "Today"
+msgstr "ယနေ့"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "မနေ့"
+
+msgid "Tomorrow"
+msgstr "မနက်ဖြန်"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr "နွေ လာ ဂါ ဟူး တေး ကြာ နေ"
+
+msgid "Show"
+msgstr "ပြသ"
+
+msgid "Hide"
+msgstr "ဖုံးကွယ်"
diff --git a/tbc/static/admin/locale/nb/LC_MESSAGES/django.mo b/tbc/static/admin/locale/nb/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..fd1cb58
--- /dev/null
+++ b/tbc/static/admin/locale/nb/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nb/LC_MESSAGES/django.po b/tbc/static/admin/locale/nb/LC_MESSAGES/django.po
new file mode 100644
index 0000000..63805d2
--- /dev/null
+++ b/tbc/static/admin/locale/nb/LC_MESSAGES/django.po
@@ -0,0 +1,679 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# jensadne <jensadne@pvv.ntnu.no>, 2013-2014
+# Jon <jon@funkbit.no>, 2015
+# Jon <jon@funkbit.no>, 2013
+# Jon <jon@funkbit.no>, 2011,2013
+# Sigurd Gartmann <sigurdga-transifex@sigurdga.no>, 2012
+# Tommy Strand <transifex@ireality.no>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-17 10:10+0000\n"
+"Last-Translator: Jon <jon@funkbit.no>\n"
+"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/"
+"language/nb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Slettet %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kan ikke slette %(name)s"
+
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Slett valgte %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administrasjon"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nei"
+
+msgid "Unknown"
+msgstr "Ukjent"
+
+msgid "Any date"
+msgstr "Når som helst"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Past 7 days"
+msgstr "Siste syv dager"
+
+msgid "This month"
+msgstr "Denne måneden"
+
+msgid "This year"
+msgstr "I år"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Vennligst oppgi gyldig %(username)s og passord til en "
+"administrasjonsbrukerkonto. Merk at det er forskjell på små og store "
+"bokstaver."
+
+msgid "Action:"
+msgstr "Handling:"
+
+msgid "action time"
+msgstr "tid for handling"
+
+msgid "user"
+msgstr "bruker"
+
+msgid "content type"
+msgstr "innholdstype"
+
+msgid "object id"
+msgstr "objekt-ID"
+
+msgid "object repr"
+msgstr "objekt-repr"
+
+msgid "action flag"
+msgstr "handlingsflagg"
+
+msgid "change message"
+msgstr "endre melding"
+
+msgid "log entry"
+msgstr "logginnlegg"
+
+msgid "log entries"
+msgstr "logginnlegg"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "La til «%(object)s»."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Endret «%(object)s» - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Slettet «%(object)s»."
+
+msgid "LogEntry Object"
+msgstr "LogEntry-objekt"
+
+msgid "None"
+msgstr "Ingen"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold nede «Control», eller «Command» på en Mac, for å velge mer enn en."
+
+msgid "Added."
+msgstr "Lagt til."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Endret %s."
+
+msgid "and"
+msgstr "og"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Opprettet %(name)s «%(object)s»."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Endret %(list)s for %(name)s «%(object)s»."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Slettet %(name)s «%(object)s»."
+
+msgid "No fields changed."
+msgstr "Ingen felt endret."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s «%(obj)s» ble lagt til. Du kan redigere videre nedenfor."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ble lagt til. Du kan legge til en ny %(name)s nedenfor."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s «%(obj)s» ble lagt til."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" ble endret. Du kan redigere videre nedenfor."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ble endret. Du kan legge til en ny %(name)s nedenfor."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s «%(obj)s» ble endret."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Du må velge objekter for å utføre handlinger på dem. Ingen objekter har "
+"blitt endret."
+
+msgid "No action selected."
+msgstr "Ingen handling valgt."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s «%(obj)s» ble slettet."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s-objekt med primærnøkkelen %(key)r finnes ikke."
+
+#, python-format
+msgid "Add %s"
+msgstr "Legg til ny %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Endre %s"
+
+msgid "Database error"
+msgstr "Databasefeil"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ble endret."
+msgstr[1] "%(count)s %(name)s ble endret."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s valgt"
+msgstr[1] "Alle %(total_count)s valgt"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 av %(cnt)s valgt"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Endringshistorikk: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Sletting av %(class_name)s «%(instance)s» krever sletting av følgende "
+"beskyttede relaterte objekter: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django administrasjonsside"
+
+msgid "Django administration"
+msgstr "Django-administrasjon"
+
+msgid "Site administration"
+msgstr "Nettstedsadministrasjon"
+
+msgid "Log in"
+msgstr "Logg inn"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s-administrasjon"
+
+msgid "Page not found"
+msgstr "Fant ikke siden"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Beklager, men siden du spør etter finnes ikke."
+
+msgid "Home"
+msgstr "Hjem"
+
+msgid "Server error"
+msgstr "Tjenerfeil"
+
+msgid "Server error (500)"
+msgstr "Tjenerfeil (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Tjenerfeil <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-"
+"post, og vil bli fikset snart. Takk for din tålmodighet."
+
+msgid "Run the selected action"
+msgstr "Utfør den valgte handlingen"
+
+msgid "Go"
+msgstr "Gå"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Trykk her for å velge samtlige objekter fra alle sider"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Velg alle %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Nullstill valg"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Skriv først inn brukernavn og passord. Deretter vil du få mulighet til å "
+"endre flere brukerinnstillinger."
+
+msgid "Enter a username and password."
+msgstr "Skriv inn brukernavn og passord."
+
+msgid "Change password"
+msgstr "Endre passord"
+
+msgid "Please correct the error below."
+msgstr "Vennligst korriger feilene under."
+
+msgid "Please correct the errors below."
+msgstr "Vennligst korriger feilene under."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Skriv inn et nytt passord for brukeren <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Velkommen,"
+
+msgid "View site"
+msgstr "Vis nettsted"
+
+msgid "Documentation"
+msgstr "Dokumentasjon"
+
+msgid "Log out"
+msgstr "Logg ut"
+
+msgid "Add"
+msgstr "Legg til"
+
+msgid "History"
+msgstr "Historikk"
+
+msgid "View on site"
+msgstr "Vis på nettsted"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Legg til ny %(name)s"
+
+msgid "Filter"
+msgstr "Filtrering"
+
+msgid "Remove from sorting"
+msgstr "Fjern fra sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteringsprioritet: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Slå av og på sortering"
+
+msgid "Delete"
+msgstr "Slett"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Om du sletter %(object_name)s «%(escaped_object)s», vil også relaterte "
+"objekter slettes, men du har ikke tillatelse til å slette følgende "
+"objekttyper:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Sletting av %(object_name)s «%(escaped_object)s» krever sletting av følgende "
+"beskyttede relaterte objekter:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vil slette %(object_name)s «%(escaped_object)s»? Alle "
+"de følgende relaterte objektene vil bli slettet:"
+
+msgid "Objects"
+msgstr "Objekter"
+
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+msgid "No, take me back"
+msgstr "Nei, ta meg tilbake"
+
+msgid "Delete multiple objects"
+msgstr "Slett flere objekter"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Sletting av det valgte %(objects_name)s ville resultere i sletting av "
+"relaterte objekter, men kontoen din har ikke tillatelse til å slette "
+"følgende objekttyper:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Sletting av det valgte %(objects_name)s ville kreve sletting av følgende "
+"beskyttede relaterte objekter:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Er du sikker på vil slette det valgte %(objects_name)s? De følgende "
+"objektene og deres relaterte objekter vil bli slettet:"
+
+msgid "Change"
+msgstr "Endre"
+
+msgid "Remove"
+msgstr "Fjern"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Legg til ny %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Slette?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Etter %(filter_title)s "
+
+msgid "Summary"
+msgstr "Oppsummering"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeller i %(name)s-applikasjonen"
+
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigheter til å redigere noe."
+
+msgid "Recent Actions"
+msgstr "Siste handlinger"
+
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+msgid "None available"
+msgstr "Ingen tilgjengelige"
+
+msgid "Unknown content"
+msgstr "Ukjent innhold"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Noe er galt med databaseinstallasjonen din. Sørg for at databasetabellene er "
+"opprettet og at brukeren har de nødvendige rettighetene."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Du er logget inn som %(username)s, men er ikke autorisert til å få tilgang "
+"til denne siden. Ønsker du å logge inn med en annen konto?"
+
+msgid "Forgotten your password or username?"
+msgstr "Glemt brukernavnet eller passordet ditt?"
+
+msgid "Date/time"
+msgstr "Dato/tid"
+
+msgid "User"
+msgstr "Bruker"
+
+msgid "Action"
+msgstr "Handling"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objektet har ingen endringshistorikk. Det ble sannsynligvis ikke lagt "
+"til på denne administrasjonssiden."
+
+msgid "Show all"
+msgstr "Vis alle"
+
+msgid "Save"
+msgstr "Lagre"
+
+msgid "Popup closing..."
+msgstr "Lukker popup..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Endre valgt %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Legg til ny %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Slett valgte %(model)s"
+
+msgid "Search"
+msgstr "Søk"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultat"
+msgstr[1] "%(counter)s resultater"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+msgid "Save as new"
+msgstr "Lagre som ny"
+
+msgid "Save and add another"
+msgstr "Lagre og legg til ny"
+
+msgid "Save and continue editing"
+msgstr "Lagre og fortsett å redigere"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk for i dag."
+
+msgid "Log in again"
+msgstr "Logg inn igjen"
+
+msgid "Password change"
+msgstr "Endre passord"
+
+msgid "Your password was changed."
+msgstr "Ditt passord ble endret."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Av sikkerhetsgrunner må du oppgi ditt gamle passord. Deretter oppgir du det "
+"nye passordet ditt to ganger, slik at vi kan kontrollere at det er korrekt."
+
+msgid "Change my password"
+msgstr "Endre passord"
+
+msgid "Password reset"
+msgstr "Nullstill passord"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Passordet ditt er satt. Du kan nå logge inn."
+
+msgid "Password reset confirmation"
+msgstr "Bekreftelse på nullstilt passord"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Oppgi det nye passordet to ganger, for å sikre at det er skrevet korrekt."
+
+msgid "New password:"
+msgstr "Nytt passord:"
+
+msgid "Confirm password:"
+msgstr "Gjenta nytt passord:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Nullstillingslenken er ugyldig, kanskje fordi den allerede har vært brukt. "
+"Vennligst nullstill passordet ditt på nytt."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Vi har sendt deg en e-post med instruksjoner for nullstilling av passord, "
+"hvis en konto finnes på den e-postadressen du oppga. Du bør motta den om "
+"kort tid."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Hvis du ikke mottar en epost, sjekk igjen at du har oppgitt den adressen du "
+"er registrert med og sjekk ditt spam filter."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Du mottar denne e-posten fordi du har bedt om nullstilling av passordet ditt "
+"på %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Vennligst gå til følgende side og velg et nytt passord:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Brukernavnet ditt, i tilfelle du har glemt det:"
+
+msgid "Thanks for using our site!"
+msgstr "Takk for at du bruker siden vår!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Hilsen %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Glemt passordet ditt? Oppgi e-postadressen din under, så sender vi deg en e-"
+"post med instruksjoner for nullstilling av passord."
+
+msgid "Email address:"
+msgstr "E-postadresse:"
+
+msgid "Reset my password"
+msgstr "Nullstill mitt passord"
+
+msgid "All dates"
+msgstr "Alle datoer"
+
+#, python-format
+msgid "Select %s"
+msgstr "Velg %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Velg %s du ønsker å endre"
+
+msgid "Date:"
+msgstr "Dato:"
+
+msgid "Time:"
+msgstr "Tid:"
+
+msgid "Lookup"
+msgstr "Oppslag"
+
+msgid "Currently:"
+msgstr "Nåværende:"
+
+msgid "Change:"
+msgstr "Endre:"
diff --git a/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..6761a51
--- /dev/null
+++ b/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..04865c5
--- /dev/null
+++ b/tbc/static/admin/locale/nb/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Eirik Krogstad <eirikkr@gmail.com>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jon <jon@funkbit.no>, 2015
+# Jon <jon@funkbit.no>, 2014
+# Jon <jon@funkbit.no>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-17 10:13+0000\n"
+"Last-Translator: Jon <jon@funkbit.no>\n"
+"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/"
+"language/nb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Tilgjengelige %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dette er listen over tilgjengelige %s. Du kan velge noen ved å markere de i "
+"boksen under og så klikke på \"Velg\"-pilen mellom de to boksene."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Skriv i dette feltet for å filtrere ned listen av tilgjengelige %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Velg alle"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klikk for å velge alle %s samtidig"
+
+msgid "Choose"
+msgstr "Velg"
+
+msgid "Remove"
+msgstr "Slett"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valgte %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dette er listen over valgte %s. Du kan fjerne noen ved å markere de i boksen "
+"under og så klikke på \"Fjern\"-pilen mellom de to boksene."
+
+msgid "Remove all"
+msgstr "Fjern alle"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klikk for å fjerne alle valgte %s samtidig"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s av %(cnt)s valgt"
+msgstr[1] "%(sel)s av %(cnt)s valgt"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Du har ulagrede endringer i individuelle felter. Hvis du utfører en "
+"handling, vil dine ulagrede endringer gå tapt."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Du har valgt en handling, men du har ikke lagret dine endringer i "
+"individuelle felter enda. Vennligst trykk OK for å lagre. Du må utføre "
+"handlingen på nytt."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Du har valgt en handling, og har ikke gjort noen endringer i individuelle "
+"felter. Du ser mest sannsynlig etter Gå-knappen, ikke Lagre-knappen."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Merk: Du er %s time foran server-tid."
+msgstr[1] "Merk: Du er %s timer foran server-tid."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Merk: Du er %s time bak server-tid."
+msgstr[1] "Merk: Du er %s timer bak server-tid."
+
+msgid "Now"
+msgstr "Nå"
+
+msgid "Choose a Time"
+msgstr "Velg et klokkeslett"
+
+msgid "Choose a time"
+msgstr "Velg et klokkeslett"
+
+msgid "Midnight"
+msgstr "Midnatt"
+
+msgid "6 a.m."
+msgstr "06:00"
+
+msgid "Noon"
+msgstr "12:00"
+
+msgid "6 p.m."
+msgstr "18:00"
+
+msgid "Cancel"
+msgstr "Avbryt"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Choose a Date"
+msgstr "Velg en dato"
+
+msgid "Yesterday"
+msgstr "I går"
+
+msgid "Tomorrow"
+msgstr "I morgen"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Mars April Mai Juni Juli August September Oktober November "
+"Desember"
+
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+msgid "Show"
+msgstr "Vis"
+
+msgid "Hide"
+msgstr "Skjul"
diff --git a/tbc/static/admin/locale/ne/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ne/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..779aabe
--- /dev/null
+++ b/tbc/static/admin/locale/ne/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ne/LC_MESSAGES/django.po b/tbc/static/admin/locale/ne/LC_MESSAGES/django.po
new file mode 100644
index 0000000..10e3626
--- /dev/null
+++ b/tbc/static/admin/locale/ne/LC_MESSAGES/django.po
@@ -0,0 +1,644 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Sagar Chalise <chalisesagar@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ne\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "सफलतापूर्वक मेटियो %(count)d %(items)s ।"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s मेट्न सकिएन "
+
+msgid "Are you sure?"
+msgstr "के तपाई पक्का हुनुहुन्छ ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस"
+
+msgid "Administration"
+msgstr "प्रशासन "
+
+msgid "All"
+msgstr "सबै"
+
+msgid "Yes"
+msgstr "हो"
+
+msgid "No"
+msgstr "होइन"
+
+msgid "Unknown"
+msgstr "अज्ञात"
+
+msgid "Any date"
+msgstr "कुनै मिति"
+
+msgid "Today"
+msgstr "आज"
+
+msgid "Past 7 days"
+msgstr "पूर्व ७ दिन"
+
+msgid "This month"
+msgstr "यो महिना"
+
+msgid "This year"
+msgstr "यो साल"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"कृपया स्टाफ खाताको लागि सही %(username)s र पासवर्ड राख्नु होस । दुवै खाली ठाउँ केस "
+"सेन्सिटिव हुन सक्छन् ।"
+
+msgid "Action:"
+msgstr "कार्य:"
+
+msgid "action time"
+msgstr "कार्य समय"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "वस्तु परिचय"
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr "एक्सन फ्ल्याग"
+
+msgid "change message"
+msgstr "सन्देश परिवर्तन गर्नुहोस"
+
+msgid "log entry"
+msgstr "लग"
+
+msgid "log entries"
+msgstr "लगहरु"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr " \"%(object)s\" थपिएको छ ।"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" - %(changes)s फेरियो ।"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" मेटिएको छ ।"
+
+msgid "LogEntry Object"
+msgstr "लग ईन्ट्री वस्तु"
+
+msgid "None"
+msgstr "शुन्य"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s परिवर्तित ।"
+
+msgid "and"
+msgstr "र"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" थपिएको छ ।"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s को %(list)s फेरियो ।"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" मेटिएको छ ।"
+
+msgid "No fields changed."
+msgstr "कुनै फाँट फेरिएन ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" सफलतापूर्वक थप भयो । तपाई यो पुन: संशोधन गर्न सक्नुहुनेछ ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" सफलता पूर्वक थप भयो । तपाई अर्को %(name)s तल राख्न सक्नु हुनेछ।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" सफलतापूर्वक परिवर्तन भयो । "
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" सफलता पूर्वक फेर बदल भयो । तपाई तल यो पुन: संशोधन गर्न सक्नु "
+"हुनेछ ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" सफलता पूर्वक फेर बदल भयो । तपाई अर्को %(name)s तल राख्न सक्नु "
+"हुनेछ।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" सफलतापूर्वक परिवर्तन भयो । "
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "कार्य गर्नका निम्ति वस्तु छान्नु पर्दछ । कुनैपनि छस्तु छानिएको छैन । "
+
+msgid "No action selected."
+msgstr "कार्य छानिएको छैन ।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" सफलतापूर्वक मेटियो । "
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "प्राइमरी की %(key)r भएको %(name)s अब्जेक्ट"
+
+#, python-format
+msgid "Add %s"
+msgstr "%s थप्नुहोस"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s परिवर्तित ।"
+
+msgid "Database error"
+msgstr "डाटाबेस त्रुटि"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s सफलतापूर्वक परिवर्तन भयो ।"
+msgstr[1] "%(count)s %(name)sहरु सफलतापूर्वक परिवर्तन भयो ।"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s चयन भयो"
+msgstr[1] "सबै %(total_count)s चयन भयो"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s को ० चयन गरियो"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "इतिहास फेर्नुहोस : %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "ज्याङ्गो साइट प्रशासन"
+
+msgid "Django administration"
+msgstr "ज्याङ्गो प्रशासन"
+
+msgid "Site administration"
+msgstr "साइट प्रशासन"
+
+msgid "Log in"
+msgstr "लगिन"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "पृष्ठ भेटिएन"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "क्षमापार्थी छौं तर अनुरोध गरिएको पृष्ठ भेटिएन ।"
+
+msgid "Home"
+msgstr "गृह"
+
+msgid "Server error"
+msgstr "सर्भर त्रुटि"
+
+msgid "Server error (500)"
+msgstr "सर्भर त्रुटि (५००)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "सर्भर त्रुटि <em>(५००)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"त्रुटी भयो । साइट प्रशासकलाई ई-मेलबाट खबर गरिएको छ र चाँडै समाधान हुनेछ । धैर्यताको "
+"लागि धन्यवाद ।"
+
+msgid "Run the selected action"
+msgstr "छानिएको कार्य गर्नुहोस ।"
+
+msgid "Go"
+msgstr "बढ्नुहोस"
+
+msgid "Click here to select the objects across all pages"
+msgstr "सबै पृष्ठभरमा वस्तु छान्न यहाँ थिच्नुहोस ।"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "%(total_count)s %(module_name)s सबै छान्नुहोस "
+
+msgid "Clear selection"
+msgstr "चुनेको कुरा हटाउनुहोस ।"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"सर्वप्रथम प्रयोगकर्ता नाम र पासवर्ड हाल्नुहोस । अनिपछि तपाइ प्रयोगकर्ताका विकल्पहरु "
+"संपादन गर्न सक्नुहुनेछ ।"
+
+msgid "Enter a username and password."
+msgstr "प्रयोगकर्ता नाम र पासवर्ड राख्नुहोस।"
+
+msgid "Change password"
+msgstr "पासवर्ड फेर्नुहोस "
+
+msgid "Please correct the error below."
+msgstr "कृपया तलका त्रुटिहरु सच्याउनुहोस ।"
+
+msgid "Please correct the errors below."
+msgstr "कृपया तलका त्रुटी सुधार्नु होस ।"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "प्रयोगकर्ता <strong>%(username)s</strong> को लागि नयाँ पासवर्ड राख्नुहोस ।"
+
+msgid "Welcome,"
+msgstr "स्वागतम्"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "विस्तृत विवरण"
+
+msgid "Log out"
+msgstr "लग आउट"
+
+msgid "Add"
+msgstr "थप्नुहोस "
+
+msgid "History"
+msgstr "इतिहास"
+
+msgid "View on site"
+msgstr "साइटमा हेर्नुहोस"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s थप्नुहोस"
+
+msgid "Filter"
+msgstr "छान्नुहोस"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "मेट्नुहोस"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "हुन्छ, म पक्का छु ।"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "वहु वस्तुहरु मेट्नुहोस ।"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr "%(objects_name)s "
+
+msgid "Change"
+msgstr "फेर्नुहोस"
+
+msgid "Remove"
+msgstr "हटाउनुहोस"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "अर्को %(verbose_name)s थप्नुहोस ।"
+
+msgid "Delete?"
+msgstr "मेट्नुहुन्छ ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s द्वारा"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु"
+
+msgid "You don't have permission to edit anything."
+msgstr "तपाइलाई केही पनि संपादन गर्ने अनुमति छैन ।"
+
+msgid "Recent Actions"
+msgstr "हालैका कार्यहरु"
+
+msgid "My Actions"
+msgstr "मेरो कार्यहरु"
+
+msgid "None available"
+msgstr "कुनै पनि उपलब्ध छैन ।"
+
+msgid "Unknown content"
+msgstr "अज्ञात सामग्री"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"डाटाबेस स्थापनामा केही त्रुटी छ । सम्वद्ध टेबल बनाएको र प्रयोगकर्तालाई डाटाबेसमा अनुमति "
+"भएको छ छैन जाच्नुहोस ।"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "पासवर्ड अथवा प्रयोगकर्ता नाम भुल्नुभयो ।"
+
+msgid "Date/time"
+msgstr "मिति/समय"
+
+msgid "User"
+msgstr "प्रयोगकर्ता"
+
+msgid "Action"
+msgstr "कार्य:"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "यो अब्जेक्टको पुर्व परिवर्तन छैन । यो यस "
+
+msgid "Show all"
+msgstr "सबै देखाउनुहोस"
+
+msgid "Save"
+msgstr "बचत गर्नुहोस"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "खोज्नुहोस"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s नतिजा"
+msgstr[1] "%(counter)s नतिजाहरु"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "जम्मा %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "नयाँ रुपमा बचत गर्नुहोस"
+
+msgid "Save and add another"
+msgstr "बचत गरेर अर्को थप्नुहोस"
+
+msgid "Save and continue editing"
+msgstr "बचत गरेर संशोधन जारी राख्नुहोस"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "वेब साइटमा समय बिताउनु भएकोमा धन्यवाद ।"
+
+msgid "Log in again"
+msgstr "पुन: लगिन गर्नुहोस"
+
+msgid "Password change"
+msgstr "पासवर्ड फेरबदल"
+
+msgid "Your password was changed."
+msgstr "तपाइको पासवर्ड फेरिएको छ ।"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"सुरक्षाको निम्ति आफ्नो पुरानो पासवर्ड राख्नुहोस र कृपया दोहर्याएर आफ्नो नयाँ पासवर्ड "
+"राख्नुहोस ताकी प्रमाणीकरण होस । "
+
+msgid "Change my password"
+msgstr "मेरो पासवर्ड फेर्नुहोस "
+
+msgid "Password reset"
+msgstr "पासवर्डपून: राख्नुहोस । "
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "तपाइको पासवर्ड राखियो । कृपया लगिन गर्नुहोस ।"
+
+msgid "Password reset confirmation"
+msgstr "पासवर्ड पुनर्स्थापना पुष्टि"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "ठीक तरिकाले राखिएको पुष्टि गर्न कृपया नयाँ पासवर्ड दोहोर्याएर राख्नुहोस ।"
+
+msgid "New password:"
+msgstr "नयाँ पासवर्ड :"
+
+msgid "Confirm password:"
+msgstr "पासवर्ड पुष्टि:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr "पासवर्ड पुनर्स्थापना प्रयोग भइसकेको छ । कृपया नयाँ पासवर्ड रिसेट माग्नुहोस ।"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"ई-मेल नपाइए मा कृपया ई-मेल ठेगाना सही राखेको नराखेको जाँच गर्नु होला र साथै आफ्नो ई-"
+"मेलको स्प्याम पनि जाँच गर्नु होला ।"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+" %(site_name)s को लागि तपाइले पासवर्ड पुन: राख्न आग्रह गरेको हुनाले ई-मेल पाउनुहुदैंछ । "
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "कृपया उक्त पृष्ठमा जानुहोस र नयाँ पासवर्ड राख्नुहोस :"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "तपाइको प्रयोगकर्ता नाम, बिर्सनुभएको भए :"
+
+msgid "Thanks for using our site!"
+msgstr "हाम्रो साइट प्रयोग गरेकोमा धन्यवाद"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s टोली"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"पासवर्ड बिर्सनु भयो ? तल ई-मेल दिनु होस र हामी नयाँ पासवर्ड हाल्ने प्रकृया पठाइ दिनेछौँ ।"
+
+msgid "Email address:"
+msgstr "ई-मेल ठेगाना :"
+
+msgid "Reset my password"
+msgstr "मेरो पासवर्ड पुन: राख्नुहोस ।"
+
+msgid "All dates"
+msgstr "सबै मिति"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s छान्नुहोस"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s परिवर्तन गर्न छान्नुहोस ।"
+
+msgid "Date:"
+msgstr "मिति:"
+
+msgid "Time:"
+msgstr "समय:"
+
+msgid "Lookup"
+msgstr "खोज तलास"
+
+msgid "Currently:"
+msgstr "अहिले :"
+
+msgid "Change:"
+msgstr "फेर्नु होस :"
diff --git a/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..66ff0e8
--- /dev/null
+++ b/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..6f9831a
--- /dev/null
+++ b/tbc/static/admin/locale/ne/LC_MESSAGES/djangojs.po
@@ -0,0 +1,157 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Paras Nath Chaudhary <opnchaudhary@gmail.com>, 2012
+# Sagar Chalise <chalisesagar@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ne\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "उपलब्ध %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"यो उपलब्ध %s को सुची हो। तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को \"छान्नुहोस "
+"\" तीरमा क्लिक गरी छान्नसक्नुहुन्छ । "
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr " उपलब्ध %s को सुचिबाट छान्न यो बक्समा टाइप गर्नुहोस "
+
+msgid "Filter"
+msgstr "छान्नुहोस"
+
+msgid "Choose all"
+msgstr "सबै छान्नुहोस "
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "एकै क्लिकमा सबै %s छान्नुहोस "
+
+msgid "Choose"
+msgstr "छान्नुहोस "
+
+msgid "Remove"
+msgstr "हटाउनुहोस"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "छानिएको %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"यो छानिएका %s को सुची हो । तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को "
+"\"हटाउनुहोस\" तीरमा क्लिक गरी हटाउन सक्नुहुन्छ । "
+
+msgid "Remove all"
+msgstr "सबै हटाउनुहोस "
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "एकै क्लिकमा सबै छानिएका %s हटाउनुहोस ।"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s को %(sel)s चयन गरियो"
+msgstr[1] "%(cnt)s को %(sel)s चयन गरियो"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr "तपाइको फेरबदल बचत भएको छैन । कार्य भएमा बचत नभएका फेरबदल हराउने छन् ।"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"तपाइले कार्य छाने पनि फेरबदलहरु बचत गर्नु भएको छैन । कृपया बचत गर्न हुन्छ थिच्नुहोस । कार्य "
+"पुन: सञ्चालन गर्नुपर्नेछ ।"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"तपाइले कार्य छाने पनि फाँटहरुमा फेरबदलहरु गर्नु भएको छैन । बचत गर्नु भन्दा पनि अघि बढ्नुहोस "
+"।"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "यतिखेर"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "समय चयन गर्नुहोस"
+
+msgid "Midnight"
+msgstr "मध्यरात"
+
+msgid "6 a.m."
+msgstr "बिहान ६ बजे"
+
+msgid "Noon"
+msgstr "मध्यान्ह"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "रद्द गर्नुहोस "
+
+msgid "Today"
+msgstr "आज"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "हिजो"
+
+msgid "Tomorrow"
+msgstr "भोलि"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "जनवरी फेब्रुअरी मार्च अप्रिल मई जुन जुलै अगस्त सेप्टेम्बर अक्टुवर नभम्वर डिसम्वर"
+
+msgid "S M T W T F S"
+msgstr "आइत सोम मंगल बुध बिही शुक्र शनि"
+
+msgid "Show"
+msgstr "देखाउनुहोस "
+
+msgid "Hide"
+msgstr "लुकाउनुहोस "
diff --git a/tbc/static/admin/locale/nl/LC_MESSAGES/django.mo b/tbc/static/admin/locale/nl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1169cc7
--- /dev/null
+++ b/tbc/static/admin/locale/nl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nl/LC_MESSAGES/django.po b/tbc/static/admin/locale/nl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5db29d9
--- /dev/null
+++ b/tbc/static/admin/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,686 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Bas Peschier <bas.peschier@gmail.com>, 2013
+# Harro van der Klauw <hvdklauw@gmail.com>, 2012
+# Ilja Maas <iljamaas@dreamsolution.nl>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jeffrey Gelens <jeffrey@noppo.pro>, 2011-2012
+# dokterbob <mathijs@mathijsfietst.nl>, 2015
+# Sander Steffann <sander@steffann.nl>, 2014-2015
+# Tino de Bruijn <tinodb@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 22:01+0000\n"
+"Last-Translator: Ilja Maas <iljamaas@dreamsolution.nl>\n"
+"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s succesvol verwijderd."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s kan niet worden verwijderd "
+
+msgid "Are you sure?"
+msgstr "Weet u het zeker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Verwijder geselecteerde %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Beheer"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nee"
+
+msgid "Unknown"
+msgstr "Onbekend"
+
+msgid "Any date"
+msgstr "Elke datum"
+
+msgid "Today"
+msgstr "Vandaag"
+
+msgid "Past 7 days"
+msgstr "Afgelopen zeven dagen"
+
+msgid "This month"
+msgstr "Deze maand"
+
+msgid "This year"
+msgstr "Dit jaar"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Voer de correcte %(username)s en wachtwoord voor een stafaccount in. Let op "
+"dat beide velden hoofdlettergevoelig zijn."
+
+msgid "Action:"
+msgstr "Actie:"
+
+msgid "action time"
+msgstr "actietijd"
+
+msgid "user"
+msgstr "gebruiker"
+
+msgid "content type"
+msgstr "inhoudstype"
+
+msgid "object id"
+msgstr "object-id"
+
+msgid "object repr"
+msgstr "object-repr"
+
+msgid "action flag"
+msgstr "actievlag"
+
+msgid "change message"
+msgstr "wijzig bericht"
+
+msgid "log entry"
+msgstr "logregistratie"
+
+msgid "log entries"
+msgstr "logregistraties"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Toegevoegd \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Gewijzigd \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Verwijderd \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry Object"
+
+msgid "None"
+msgstr "Geen"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Houdt \"Control\", of \"Command\" op een Mac, ingedrukt om meerdere te "
+"selecteren."
+
+msgid "Added."
+msgstr "Toegevoegd."
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s gewijzigd."
+
+msgid "and"
+msgstr "en"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" toegevoegd."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s aangepast voor %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" verwijderd."
+
+msgid "No fields changed."
+msgstr "Geen velden gewijzigd."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "De %(name)s \"%(obj)s\" was toegevoegd. U kunt het hieronder wijzigen."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"De %(name)s \"%(obj)s\" was succesvol gewijzigd. Je kan hieronder een andere "
+"%(name)s toevoegen."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "De %(name)s \"%(obj)s\" is toegevoegd."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"De %(name)s \"%(obj)s\" was succesvol gewijzigd. Je kunt het hieronder "
+"wijzigen."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"De %(name)s \"%(obj)s\" was succesvol gewijzigd. Je kan hieronder een andere "
+"%(name)s toevoegen."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Het wijzigen van %(name)s \"%(obj)s\" is geslaagd."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Er moeten items worden geselecteerd om acties op uit te voeren. Geen items "
+"zijn veranderd."
+
+msgid "No action selected."
+msgstr "Geen actie geselecteerd."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "\"%(obj)s\" van type %(name)s is verwijderd."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s object met primaire sleutel %(key)r bestaat niet."
+
+#, python-format
+msgid "Add %s"
+msgstr "Toevoegen %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Wijzig %s"
+
+msgid "Database error"
+msgstr "Databasefout"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s is succesvol gewijzigd."
+msgstr[1] "%(count)s %(name)s zijn succesvol gewijzigd."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s geselecteerd"
+msgstr[1] "Alle %(total_count)s geselecteerd"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 van de %(cnt)s geselecteerd"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Wijzigingsgeschiedenis: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Het verwijderen van %(class_name)s %(instance)s vereist het verwijderen van "
+"de volgende beschermde gerelateerde objecten: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django sitebeheer"
+
+msgid "Django administration"
+msgstr "Djangobeheer"
+
+msgid "Site administration"
+msgstr "Sitebeheer"
+
+msgid "Log in"
+msgstr "Inloggen"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s beheer"
+
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Onze excuses, maar de gevraagde pagina bestaat niet."
+
+msgid "Home"
+msgstr "Voorpagina"
+
+msgid "Server error"
+msgstr "Serverfout"
+
+msgid "Server error (500)"
+msgstr "Serverfout (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfout <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Er heeft zich een fout voorgedaan. De fout is via email gemeld aan de "
+"website administrators en zou snel verholpen moeten zijn. Bedankt voor uw "
+"geduld."
+
+msgid "Run the selected action"
+msgstr "Voer de geselecteerde actie uit"
+
+msgid "Go"
+msgstr "Voer Uit"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klik hier om alle objecten op alle pagina's te selecteren"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Selecteer alle %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Leeg selectie"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Vul allereerst een gebruikersnaam en wachtwoord in. Vervolgens kunt u de "
+"andere opties instellen."
+
+msgid "Enter a username and password."
+msgstr "Voer een gebruikersnaam en wachtwoord in."
+
+msgid "Change password"
+msgstr "Wachtwoord wijzigen"
+
+msgid "Please correct the error below."
+msgstr "Herstel de fouten hieronder."
+
+msgid "Please correct the errors below."
+msgstr "Herstel de fouten hieronder."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Geef een nieuw wachtwoord voor gebruiker <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Welkom,"
+
+msgid "View site"
+msgstr "Bekijk site"
+
+msgid "Documentation"
+msgstr "Documentatie"
+
+msgid "Log out"
+msgstr "Afmelden"
+
+msgid "Add"
+msgstr "Toevoegen"
+
+msgid "History"
+msgstr "Geschiedenis"
+
+msgid "View on site"
+msgstr "Toon op site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s toevoegen"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Verwijder uit de sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteer prioriteit: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Sortering aan/uit"
+
+msgid "Delete"
+msgstr "Verwijderen"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Het verwijderen van %(object_name)s '%(escaped_object)s' zal ook "
+"gerelateerde objecten verwijderen. Echter u heeft geen rechten om de "
+"volgende typen objecten te verwijderen:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Het verwijderen van %(object_name)s '%(escaped_object)s' vereist het "
+"verwijderen van de volgende gerelateerde objecten:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Weet u zeker dat u %(object_name)s \"%(escaped_object)s\" wilt verwijderen? "
+"Alle volgende objecten worden verwijderd:"
+
+msgid "Objects"
+msgstr "Objecten"
+
+msgid "Yes, I'm sure"
+msgstr "Ja, ik weet het zeker"
+
+msgid "No, take me back"
+msgstr "Nee, ga terug"
+
+msgid "Delete multiple objects"
+msgstr "Verwijder meerdere objecten"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Het verwijderen van de geselecteerde %(objects_name)s vereist het "
+"verwijderen van gerelateerde objecten, maar uw account heeft geen "
+"toestemming om de volgende soorten objecten te verwijderen:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Het verwijderen van de geselecteerde %(objects_name)s vereist het "
+"verwijderen van de volgende beschermde gerelateerde objecten:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Weet u zeker dat u de geselecteerde %(objects_name)s wilt verwijderen? Alle "
+"volgende objecten en hun aanverwante items zullen worden verwijderd:"
+
+msgid "Change"
+msgstr "Wijzigen"
+
+msgid "Remove"
+msgstr "Verwijderen"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Voeg nog een %(verbose_name)s toe"
+
+msgid "Delete?"
+msgstr "Verwijderen?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Op %(filter_title)s "
+
+msgid "Summary"
+msgstr "Samenvatting"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modellen in de %(name)s applicatie"
+
+msgid "You don't have permission to edit anything."
+msgstr "U heeft geen rechten om iets te wijzigen."
+
+msgid "Recent Actions"
+msgstr "Recente acties"
+
+msgid "My Actions"
+msgstr "Mijn acties"
+
+msgid "None available"
+msgstr "Geen beschikbaar"
+
+msgid "Unknown content"
+msgstr "Onbekende inhoud"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Er is iets mis met de database. Verzeker u ervan dat de benodigde tabellen "
+"zijn aangemaakt en dat de database toegankelijk is voor de juiste gebruiker."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"U bent geverifieerd als %(username)s, maar niet bevoegd om deze pagina te "
+"bekijken. Wilt u inloggen met een ander account?"
+
+msgid "Forgotten your password or username?"
+msgstr "Wachtwoord of gebruikersnaam vergeten?"
+
+msgid "Date/time"
+msgstr "Datum/tijd"
+
+msgid "User"
+msgstr "Gebruiker"
+
+msgid "Action"
+msgstr "Actie"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dit object heeft geen wijzigingsgeschiedenis. Het is mogelijk niet via de "
+"beheersite toegevoegd."
+
+msgid "Show all"
+msgstr "Alles tonen"
+
+msgid "Save"
+msgstr "Opslaan"
+
+msgid "Popup closing..."
+msgstr "Popup wordt gesloten..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Wijzig geselecteerde %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Voeg nog een %(model)s toe"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Verwijder geselecteerde %(model)s"
+
+msgid "Search"
+msgstr "Zoek"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultaat"
+msgstr[1] "%(counter)s resultaten"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totaal"
+
+msgid "Save as new"
+msgstr "Opslaan als nieuw item"
+
+msgid "Save and add another"
+msgstr "Opslaan en nieuwe toevoegen"
+
+msgid "Save and continue editing"
+msgstr "Opslaan en opnieuw bewerken"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Bedankt voor de aanwezigheid op de site vandaag."
+
+msgid "Log in again"
+msgstr "Log opnieuw in"
+
+msgid "Password change"
+msgstr "Wachtwoordwijziging"
+
+msgid "Your password was changed."
+msgstr "Uw wachtwoord is gewijzigd."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vanwege de beveiliging moet u uw oude en twee keer uw nieuwe wachtwoord "
+"invoeren, zodat we kunnen controleren of er geen typefouten zijn gemaakt."
+
+msgid "Change my password"
+msgstr "Wijzig mijn wachtwoord"
+
+msgid "Password reset"
+msgstr "Wachtwoord hersteld"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Uw wachtwoord is ingesteld. U kunt nu verder gaan en inloggen."
+
+msgid "Password reset confirmation"
+msgstr "Bevestiging wachtwoord herstellen"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Voer het nieuwe wachtwoord twee keer in, zodat we kunnen controleren of er "
+"geen typefouten zijn gemaakt."
+
+msgid "New password:"
+msgstr "Nieuw wachtwoord:"
+
+msgid "Confirm password:"
+msgstr "Bevestig wachtwoord:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"De link voor het herstellen van het wachtwoord is ongeldig, waarschijnlijk "
+"omdat de link al eens is gebruikt. Vraag opnieuw een wachtwoord aan."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"We hebben u instructies toegestuurd om uw wachtwoord in te stellen, als er "
+"een account bestond met het door u opgegeven emailadres. U zou deze binnen "
+"korte tijd moeten ontvangen."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Als u geen e-mail ontvangt, controleer dan of u het e-mailadres hebt "
+"opgegeven waar u zich mee geregistreerd heeft en controleer uw spam-map."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"U ontvangt deze email omdat u heeft verzocht het wachtwoord te resetten voor "
+"uw account op %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gaat u naar de volgende pagina en kies een nieuw wachtwoord:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Uw gebruikersnaam, mocht u deze vergeten zijn:"
+
+msgid "Thanks for using our site!"
+msgstr "Bedankt voor het gebruik van onze site!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Het %(site_name)s team"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Wachtwoord vergeten? Vul uw emailadres hieronder in, en we zullen "
+"instructies voor het opnieuw instellen van uw wachtwoord mailen."
+
+msgid "Email address:"
+msgstr "Emailadres:"
+
+msgid "Reset my password"
+msgstr "Herstel mijn wachtwoord"
+
+msgid "All dates"
+msgstr "Alle data"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selecteer %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecteer %s om te wijzigen"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Tijd:"
+
+msgid "Lookup"
+msgstr "Opzoeken"
+
+msgid "Currently:"
+msgstr "Huidig:"
+
+msgid "Change:"
+msgstr "Wijzig:"
diff --git a/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ca2dffa
--- /dev/null
+++ b/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..34a7d06
--- /dev/null
+++ b/tbc/static/admin/locale/nl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,170 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Bouke Haarsma <bouke@webatoom.nl>, 2013
+# Harro van der Klauw <hvdklauw@gmail.com>, 2012
+# Ilja Maas <iljamaas@dreamsolution.nl>, 2015
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jeffrey Gelens <jeffrey@noppo.pro>, 2011-2012
+# Sander Steffann <sander@steffann.nl>, 2015
+# wunki <petar@wunki.org>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-25 19:29+0000\n"
+"Last-Translator: Ilja Maas <iljamaas@dreamsolution.nl>\n"
+"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Beschikbare %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dit is de lijst met beschikbare %s. U kunt kiezen uit een aantal door ze te "
+"selecteren in het vak hieronder en vervolgens op de \"Kiezen\" pijl tussen "
+"de twee lijsten te klikken."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Type in dit vak om te filteren in de lijst met beschikbare %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Kies alle"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klik om alle %s te kiezen."
+
+msgid "Choose"
+msgstr "Kiezen"
+
+msgid "Remove"
+msgstr "Verwijderen"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Gekozen %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dit is de lijst van de gekozen %s. Je kunt ze verwijderen door ze te "
+"selecteren in het vak hieronder en vervolgens op de \"Verwijderen\" pijl "
+"tussen de twee lijsten te klikken."
+
+msgid "Remove all"
+msgstr "Verwijder alles"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klik om alle gekozen %s tegelijk te verwijderen."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s van de %(cnt)s geselecteerd"
+msgstr[1] "%(sel)s van de %(cnt)s geselecteerd"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"U heeft niet opgeslagen wijzigingen op enkele indviduele velden. Als u nu "
+"een actie uitvoert zullen uw wijzigingen verloren gaan."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"U heeft een actie geselecteerd, maar heeft de wijzigingen op de individuele "
+"velden nog niet opgeslagen. Klik alstublieft op OK om op te slaan. U zult "
+"vervolgens de actie opnieuw moeten uitvoeren."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"U heeft een actie geselecteerd en heeft geen wijzigingen gemaakt op de "
+"individuele velden. U zoekt waarschijnlijk naar de Gaan knop in plaats van "
+"de Opslaan knop."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Let op: U ligt %s uur voor ten opzichte van de server-tijd."
+msgstr[1] "Let op: U ligt %s uren voor ten opzichte van de server-tijd."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Let op: U ligt %s uur achter ten opzichte van de server-tijd."
+msgstr[1] "Let op: U ligt %s uren achter ten opzichte van de server-tijd."
+
+msgid "Now"
+msgstr "Nu"
+
+msgid "Choose a Time"
+msgstr "Kies een tijdstip"
+
+msgid "Choose a time"
+msgstr "Kies een tijd"
+
+msgid "Midnight"
+msgstr "Middernacht"
+
+msgid "6 a.m."
+msgstr "6 uur 's ochtends"
+
+msgid "Noon"
+msgstr "12 uur 's middags"
+
+msgid "6 p.m."
+msgstr "6 uur 's avonds"
+
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgid "Today"
+msgstr "Vandaag"
+
+msgid "Choose a Date"
+msgstr "Kies een datum"
+
+msgid "Yesterday"
+msgstr "Gisteren"
+
+msgid "Tomorrow"
+msgstr "Morgen"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"januari februari maart april mei juni juli augustus september oktober "
+"november december"
+
+msgid "S M T W T F S"
+msgstr "Z M D W D V Z"
+
+msgid "Show"
+msgstr "Tonen"
+
+msgid "Hide"
+msgstr "Verbergen"
diff --git a/tbc/static/admin/locale/nn/LC_MESSAGES/django.mo b/tbc/static/admin/locale/nn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..bb98e99
--- /dev/null
+++ b/tbc/static/admin/locale/nn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nn/LC_MESSAGES/django.po b/tbc/static/admin/locale/nn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d5959c7
--- /dev/null
+++ b/tbc/static/admin/locale/nn/LC_MESSAGES/django.po
@@ -0,0 +1,657 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# hgrimelid <havard@grimelid.com>, 2011-2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# jensadne <jensadne@pvv.ntnu.no>, 2013
+# Sigurd Gartmann <sigurdga-transifex@sigurdga.no>, 2012
+# velmont <odin.omdal@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/"
+"language/nn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Sletta %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kan ikkje slette %(name)s"
+
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Slett valgte %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nei"
+
+msgid "Unknown"
+msgstr "Ukjend"
+
+msgid "Any date"
+msgstr "Når som helst"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Past 7 days"
+msgstr "Siste sju dagar"
+
+msgid "This month"
+msgstr "Denne månaden"
+
+msgid "This year"
+msgstr "I år"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Handling:"
+
+msgid "action time"
+msgstr "tid for handling"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "objekt-ID"
+
+msgid "object repr"
+msgstr "objekt repr"
+
+msgid "action flag"
+msgstr "handlingsflagg"
+
+msgid "change message"
+msgstr "endre melding"
+
+msgid "log entry"
+msgstr "logginnlegg"
+
+msgid "log entries"
+msgstr "logginnlegg"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "La til «%(object)s»."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Endra «%(object)s» - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Sletta «%(object)s»."
+
+msgid "LogEntry Object"
+msgstr "LogEntry-objekt"
+
+msgid "None"
+msgstr "Ingen"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Endra %s."
+
+msgid "and"
+msgstr "og"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Oppretta %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Endra %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Sletta %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ingen felt endra."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" vart endra Du kan redigere vidare nedanfor."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" vart oppretta."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" vart endra."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Objekt må vere valde for at dei skal kunne utførast handlingar på. Ingen "
+"object er endra."
+
+msgid "No action selected."
+msgstr "Inga valt handling."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" vart sletta."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s-objekt med primærnøkkelen %(key)r eksisterer ikkje."
+
+#, python-format
+msgid "Add %s"
+msgstr "Opprett %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Rediger %s"
+
+msgid "Database error"
+msgstr "Databasefeil"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s vart endra."
+msgstr[1] "%(count)s %(name)s vart endra."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s valde"
+msgstr[1] "Alle %(total_count)s valde"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Ingen av %(cnt)s valde"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Endringshistorikk: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Sletting av %(class_name)s «%(instance)s» krev sletting av følgande beskytta "
+"relaterte objekt: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django administrasjonsside"
+
+msgid "Django administration"
+msgstr "Django-administrasjon"
+
+msgid "Site administration"
+msgstr "Nettstadsadministrasjon"
+
+msgid "Log in"
+msgstr "Logg inn"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Fann ikkje sida"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sida du spør etter finst ikkje."
+
+msgid "Home"
+msgstr "Heim"
+
+msgid "Server error"
+msgstr "Tenarfeil"
+
+msgid "Server error (500)"
+msgstr "Tenarfeil (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Tenarfeil <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Utfør den valde handlinga"
+
+msgid "Go"
+msgstr "Gå"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klikk her for å velje objekt på tvers av alle sider"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Velg alle %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Nullstill utval"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre "
+"fleire brukarinnstillingar."
+
+msgid "Enter a username and password."
+msgstr "Skriv inn nytt brukarnamn og passord."
+
+msgid "Change password"
+msgstr "Endre passord"
+
+msgid "Please correct the error below."
+msgstr "Korriger feila under."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Skriv inn eit nytt passord for brukaren <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Velkommen,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentasjon"
+
+msgid "Log out"
+msgstr "Logg ut"
+
+msgid "Add"
+msgstr "Opprett"
+
+msgid "History"
+msgstr "Historikk"
+
+msgid "View on site"
+msgstr "Vis på nettstad"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Opprett %(name)s"
+
+msgid "Filter"
+msgstr "Filtrering"
+
+msgid "Remove from sorting"
+msgstr "Fjern frå sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteringspriorite: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Slår av eller på sortering"
+
+msgid "Delete"
+msgstr "Slett"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Dersom du slettar %(object_name)s '%(escaped_object)s', vil også slette "
+"relaterte objekt, men du har ikkje løyve til å slette følgande objekttypar:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Sletting av %(object_name)s '%(escaped_object)s' krevar sletting av "
+"følgjande beskytta relaterte objekt:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vil slette %(object_name)s \"%(escaped_object)s\"? "
+"Alle dei følgjande relaterte objekta vil bli sletta:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ja, eg er sikker"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Slett fleire objekt"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Sletting av %(objects_name)s vil føre til at relaterte objekt blir sletta, "
+"men kontoen din manglar løyve til å slette følgjande objekttypar:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Sletting av %(objects_name)s krevar sletting av følgjande beskytta relaterte "
+"objekt:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vil slette dei valgte objekta %(objects_name)s? "
+"Følgjande objekt og deira relaterte objekt vil bli sletta:"
+
+msgid "Change"
+msgstr "Endre"
+
+msgid "Remove"
+msgstr "Fjern"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Legg til ny %(verbose_name)s."
+
+msgid "Delete?"
+msgstr "Slette?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Etter %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikkje løyve til å redigere noko."
+
+msgid "Recent Actions"
+msgstr "Siste handlingar"
+
+msgid "My Actions"
+msgstr "Mine handlingar"
+
+msgid "None available"
+msgstr "Ingen tilgjengelege"
+
+msgid "Unknown content"
+msgstr "Ukjent innhald"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Noko er gale med databaseinstallasjonen din. Syt for at databasetabellane er "
+"oppretta og at brukaren har dei naudsynte løyve."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Gløymd brukarnamn eller passord?"
+
+msgid "Date/time"
+msgstr "Dato/tid"
+
+msgid "User"
+msgstr "Brukar"
+
+msgid "Action"
+msgstr "Handling"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objektet har ingen endringshistorikk. Det var sannsynlegvis ikkje "
+"oppretta med administrasjonssida."
+
+msgid "Show all"
+msgstr "Vis alle"
+
+msgid "Save"
+msgstr "Lagre"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Søk"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultat"
+msgstr[1] "%(counter)s resultat"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+msgid "Save as new"
+msgstr "Lagre som ny"
+
+msgid "Save and add another"
+msgstr "Lagre og opprett ny"
+
+msgid "Save and continue editing"
+msgstr "Lagre og hald fram å redigere"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk for at du brukte kvalitetstid på nettstaden i dag."
+
+msgid "Log in again"
+msgstr "Logg inn att"
+
+msgid "Password change"
+msgstr "Endre passord"
+
+msgid "Your password was changed."
+msgstr "Passordet ditt vart endret."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Av sikkerheitsgrunnar må du oppgje det gamle passordet ditt. Oppgje så det "
+"nye passordet ditt to gonger, slik at vi kan kontrollere at det er korrekt."
+
+msgid "Change my password"
+msgstr "Endre passord"
+
+msgid "Password reset"
+msgstr "Nullstill passord"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Passordet ditt er sett. Du kan logge inn."
+
+msgid "Password reset confirmation"
+msgstr "Stadfesting på nullstilt passord"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Oppgje det nye passordet ditt to gonger, for å sikre at du oppgjev det "
+"korrekt."
+
+msgid "New password:"
+msgstr "Nytt passord:"
+
+msgid "Confirm password:"
+msgstr "Gjenta nytt passord:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Nullstillingslinken er ugyldig, kanskje fordi den allereie har vore brukt. "
+"Nullstill passordet ditt på nytt."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gå til følgjande side og velg eit nytt passord:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Brukarnamnet ditt, i tilfelle du har gløymt det:"
+
+msgid "Thanks for using our site!"
+msgstr "Takk for at du brukar sida vår!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Helsing %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Nullstill passordet"
+
+msgid "All dates"
+msgstr "Alle datoar"
+
+#, python-format
+msgid "Select %s"
+msgstr "Velg %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Velg %s du ønskar å redigere"
+
+msgid "Date:"
+msgstr "Dato:"
+
+msgid "Time:"
+msgstr "Tid:"
+
+msgid "Lookup"
+msgstr "Oppslag"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..9f98cde
--- /dev/null
+++ b/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..11108d3
--- /dev/null
+++ b/tbc/static/admin/locale/nn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,163 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# hgrimelid <havard@grimelid.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# velmont <odin.omdal@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/"
+"language/nn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Tilgjengelege %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Dette er lista over tilgjengelege %s. Du kan velja nokon ved å markera dei i "
+"boksen under og so klikka på «Velg»-pila mellom dei to boksane."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Skriv i dette feltet for å filtrera ned lista av tilgjengelege %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Velg alle"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klikk for å velja alle %s samtidig."
+
+msgid "Choose"
+msgstr "Vel"
+
+msgid "Remove"
+msgstr "Slett"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Valde %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Dette er lista over valte %s. Du kan fjerna nokon ved å markera dei i boksen "
+"under og so klikka på «Fjern»-pila mellom dei to boksane."
+
+msgid "Remove all"
+msgstr "Fjern alle"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klikk for å fjerna alle valte %s samtidig."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s av %(cnt)s vald"
+msgstr[1] "%(sel)s av %(cnt)s valde"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Det er endringar som ikkje er lagra i individuelt redigerbare felt. "
+"Endringar som ikkje er lagra vil gå tapt."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Du har vald ei handling, men du har framleis ikkje lagra endringar for "
+"individuelle felt. Klikk OK for å lagre. Du må gjere handlinga på nytt."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Du har vald ei handling og du har ikkje gjort endringar i individuelle felt. "
+"Du ser sannsynlegvis etter Gå vidare-knappen - ikkje Lagre-knappen."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "No"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Velg eit klokkeslett"
+
+msgid "Midnight"
+msgstr "Midnatt"
+
+msgid "6 a.m."
+msgstr "06:00"
+
+msgid "Noon"
+msgstr "12:00"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Avbryt"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "I går"
+
+msgid "Tomorrow"
+msgstr "I morgon"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Mars April Mai Juni Juli August September Oktober November "
+"Desember"
+
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+msgid "Show"
+msgstr "Vis"
+
+msgid "Hide"
+msgstr "Skjul"
diff --git a/tbc/static/admin/locale/os/LC_MESSAGES/django.mo b/tbc/static/admin/locale/os/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a6b7363
--- /dev/null
+++ b/tbc/static/admin/locale/os/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/os/LC_MESSAGES/django.po b/tbc/static/admin/locale/os/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b8d16bc
--- /dev/null
+++ b/tbc/static/admin/locale/os/LC_MESSAGES/django.po
@@ -0,0 +1,660 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Soslan Khubulov <inactive+soslan@transifex.com>, 2013
+# Soslan Khubulov <inactive+soslan@transifex.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ossetic (http://www.transifex.com/django/django/language/"
+"os/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: os\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s хафт ӕрцыдысты."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Нӕ уайы схафын %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ӕцӕг дӕ фӕнды?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Схафын ӕвзӕрст %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Иууылдӕр"
+
+msgid "Yes"
+msgstr "О"
+
+msgid "No"
+msgstr "Нӕ"
+
+msgid "Unknown"
+msgstr "Ӕнӕбӕрӕг"
+
+msgid "Any date"
+msgstr "Цыфӕнды бон"
+
+msgid "Today"
+msgstr "Абон"
+
+msgid "Past 7 days"
+msgstr "Фӕстаг 7 бон"
+
+msgid "This month"
+msgstr "Ацы мӕй"
+
+msgid "This year"
+msgstr "Ацы аз"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Дӕ хорзӕхӕй, раст кусӕджы аккаунты %(username)s ӕмӕ пароль бафысс. Дӕ сӕры "
+"дар уый, ӕмӕ дыууӕ дӕр гӕнӕн ис стыр ӕмӕ гыццыл дамгъӕ ӕвзарой."
+
+msgid "Action:"
+msgstr "Ми:"
+
+msgid "action time"
+msgstr "мийы рӕстӕг"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "объекты бӕрӕггӕнӕн"
+
+msgid "object repr"
+msgstr "объекты хуыз"
+
+msgid "action flag"
+msgstr "мийы флаг"
+
+msgid "change message"
+msgstr "фыстӕг фӕивын"
+
+msgid "log entry"
+msgstr "логы иуӕг"
+
+msgid "log entries"
+msgstr "логы иуӕгтӕ"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Ӕфтыд ӕрцыд \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Ивд ӕрцыд \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Хафт ӕрцыд \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "ЛогыИуӕг Объект"
+
+msgid "None"
+msgstr "Никӕцы"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Ивд %s."
+
+msgid "and"
+msgstr "ӕмӕ"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Бафтыдта %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Changed %(name)s \"%(object)s\"-ы %(list)s."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Схафта %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ивд бынат нӕй."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" ӕфтыд ӕрцыд. Дӕ бон у бындӕр та йӕ ивай."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ӕфтыд ӕрцыд. Дӕ бон у ӕндӕр %(name)s бындӕр бафтауын."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" ӕфтыд ӕрцыд."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" ивд ӕрцыд. Дӕ бон у бындӕ ӕй ногӕй ивай."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" ивд ӕрцыд. Дӕ бон у ӕндӕр %(name)s бындӕр бафтауын."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ивд ӕрцыд."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Иуӕгтӕ хъуамӕ ӕвзӕрст уой, цӕмӕй цын исты ми бакӕнай. Ницы иуӕг ӕрцыд ивд."
+
+msgid "No action selected."
+msgstr "Ницы ми у ӕвзӕрст."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" хафт ӕрцыд."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r фыццаг амонӕнимӕ %(name)s-ы объект нӕй."
+
+#, python-format
+msgid "Add %s"
+msgstr "Бафтауын %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Фӕивын %s"
+
+msgid "Database error"
+msgstr "Бӕрӕгдоны рӕдыд"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ивд ӕрцыд."
+msgstr[1] "%(count)s %(name)s ивд ӕрцыдысты."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s у ӕвзӕрст"
+msgstr[1] "%(total_count)s дӕр иууылдӕр сты ӕвзӕрст"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s-ӕй 0 у ӕвзӕрст"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ивынты истори: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django сайты админ"
+
+msgid "Django administration"
+msgstr "Django администраци"
+
+msgid "Site administration"
+msgstr "Сайты администраци"
+
+msgid "Log in"
+msgstr "Бахизын"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Фарс нӕ зыны"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Хатыр, фӕлӕ домд фарс нӕ зыны."
+
+msgid "Home"
+msgstr "Хӕдзар"
+
+msgid "Server error"
+msgstr "Серверы рӕдыд"
+
+msgid "Server error (500)"
+msgstr "Серверы рӕдыд (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Серверы Рӕдыд <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Рӕдыд разынд. Уый тыххӕй сайты администратормӕ электрон фыстӕг ӕрвыст ӕрцыд "
+"ӕмӕ йӕ тагъд сраст кӕндзысты. Бузныг кӕй лӕууыс."
+
+msgid "Run the selected action"
+msgstr "Бакӕнын ӕвзӕрст ми"
+
+msgid "Go"
+msgstr "Бацӕуын"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Ам ныххӕц цӕмӕй алы фарсы объекттӕ равзарын"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Равзарын %(total_count)s %(module_name)s иууылдӕр"
+
+msgid "Clear selection"
+msgstr "Ӕвзӕрст асыгъдӕг кӕнын"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Фыццаг бафысс фӕсномыг ӕмӕ пароль. Стӕй дӕ бон уыдзӕн фылдӕр архайӕджы "
+"фадӕттӕ ивын."
+
+msgid "Enter a username and password."
+msgstr "Бафысс фӕсномыг ӕмӕ пароль."
+
+msgid "Change password"
+msgstr "Пароль фӕивын"
+
+msgid "Please correct the error below."
+msgstr "Дӕ хорзӕхӕй, бындӕр цы рӕдыдтытӕ ис, уыдон сраст кӕн."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Бафысс ног пароль архайӕг <strong>%(username)s</strong>-ӕн."
+
+msgid "Welcome,"
+msgstr "Ӕгас цу,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Документаци"
+
+msgid "Log out"
+msgstr "Рахизын"
+
+msgid "Add"
+msgstr "Бафтауын"
+
+msgid "History"
+msgstr "Истори"
+
+msgid "View on site"
+msgstr "Сайты фенын"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Бафтауын %(name)s"
+
+msgid "Filter"
+msgstr "Фӕрсудзӕн"
+
+msgid "Remove from sorting"
+msgstr "Радӕй айсын"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Рады приоритет: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Рад аивын"
+
+msgid "Delete"
+msgstr "Схафын"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' хафыны тыххӕй баст объекттӕ дӕр хафт "
+"ӕрцӕудзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' хафын домы ацы хъахъхъӕд баст объекттӕ "
+"хафын дӕр:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ӕцӕг дӕ фӕнды %(object_name)s \"%(escaped_object)s\" схафын? Ацы баст иуӕгтӕ "
+"иууылдӕр хафт ӕрцӕудзысты:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "О, ӕцӕг мӕ фӕнды"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Цалдӕр объекты схафын"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Ӕвзӕрст %(objects_name)s хафыны тыххӕй йемӕ баст объекттӕ дӕр схафт "
+"уыдзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Ӕвзӕрст %(objects_name)s хафын домы ацы хъахъхъӕд баст объекттӕ хафын дӕр:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ӕцӕг дӕ фӕнды ӕвзӕрст %(objects_name)s схафын? ацы объекттӕ иууылдӕр, ӕмӕ "
+"семӕ баст иуӕгтӕ хафт ӕрцӕудзысты:"
+
+msgid "Change"
+msgstr "Фӕивын"
+
+msgid "Remove"
+msgstr "Схафын"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Бафтауын ӕндӕр %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Хъӕуы схафын?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s-мӕ гӕсгӕ"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Моделтӕ %(name)s ӕфтуаны"
+
+msgid "You don't have permission to edit anything."
+msgstr "Нӕй дын бар исты ивын."
+
+msgid "Recent Actions"
+msgstr "Фӕстаг митӕ"
+
+msgid "My Actions"
+msgstr "Фылдӕр митӕ"
+
+msgid "None available"
+msgstr "Ницы ис"
+
+msgid "Unknown content"
+msgstr "Ӕнӕбӕрӕг мидис"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Дӕ бӕрӕгдоны цыдӕр раст ӕвӕрд нӕу. Сбӕрӕг кӕн, хъӕугӕ бӕрӕгдоны таблицӕтӕ "
+"конд кӕй сты ӕмӕ амынд архайӕгӕн бӕрӕгдон фӕрсыны бар кӕй ис, уый."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Дӕ пароль кӕнӕ дӕ фӕсномыг ферох кодтай?"
+
+msgid "Date/time"
+msgstr "Бон/рӕстӕг"
+
+msgid "User"
+msgstr "Архайӕг"
+
+msgid "Action"
+msgstr "Ми"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Ацы объектӕн ивдтыты истори нӕй. Уӕццӕгӕн ацы админӕй ӕфтыд нӕ уыд."
+
+msgid "Show all"
+msgstr "Иууылдӕр равдисын"
+
+msgid "Save"
+msgstr "Нывӕрын"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Агурын"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s фӕстиуӕг"
+msgstr[1] "%(counter)s фӕстиуӕджы"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s иумӕ"
+
+msgid "Save as new"
+msgstr "Нывӕрын куыд ног"
+
+msgid "Save and add another"
+msgstr "Нывӕрын ӕмӕ ног бафтауын"
+
+msgid "Save and continue editing"
+msgstr "Нывӕрын ӕмӕ дарддӕр ивын"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Бузныг дӕ рӕстӕг абон ацы веб сайтимӕ кӕй арвыстай."
+
+msgid "Log in again"
+msgstr "Ногӕй бахизын"
+
+msgid "Password change"
+msgstr "Пароль ивын"
+
+msgid "Your password was changed."
+msgstr "Дӕ пароль ивд ӕрцыд."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Дӕ хорзӕхӕй, ӕдасдзинады тыххӕй, бафысс дӕ зӕронд пароль ӕмӕ стӕй та дыууӕ "
+"хатт дӕ нӕуӕг пароль, цӕмӕй мах сбӕлвырд кӕнӕм раст ӕй кӕй ныффыстай, уый."
+
+msgid "Change my password"
+msgstr "Мӕ пароль фӕивын"
+
+msgid "Password reset"
+msgstr "Пароль рацаразын"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Дӕ пароль ӕвӕрд ӕрцыд. Дӕ бон у дарддӕр ацӕуын ӕмӕ бахизын."
+
+msgid "Password reset confirmation"
+msgstr "Пароль ӕвӕрыны бӕлвырдгӕнӕн"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Дӕ хорзӕхӕй, дӕ ног пароль дыууӕ хатт бафысс, цӕмӕй мах сбӕрӕг кӕнӕм раст ӕй "
+"кӕй ныффыстай, уый."
+
+msgid "New password:"
+msgstr "Ног пароль:"
+
+msgid "Confirm password:"
+msgstr "Бӕлвырд пароль:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Парол ӕвӕрыны ӕрвитӕн раст нӕ уыд. Уӕццӕгӕн уый тыххӕй, ӕмӕ нырид пайдагонд "
+"ӕрцыд. Дӕ хорзӕхӕй, ӕрдом ног пароль ӕвӕрын."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Кӕд ницы фыстӕг райстай, уӕд, дӕ хорзӕхӕй, сбӕрӕг кӕн цы электрон постимӕ "
+"срегистраци кодтай, уый бацамыдтай, ӕви нӕ, ӕмӕ абӕрӕг кӕн дӕ спамтӕ."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Ды райстай ацы фыстӕг, уымӕн ӕмӕ %(site_name)s-ы дӕ архайӕджы аккаунтӕн "
+"пароль сӕвӕрын ӕрдомдтай."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Дӕ хорзӕхӕй, ацу ацы фарсмӕ ӕмӕ равзар дӕ ног пароль:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Дӕ фӕсномыг, кӕд дӕ ферох ис:"
+
+msgid "Thanks for using our site!"
+msgstr "Бузныг нӕ сайтӕй нын кӕй пайда кӕныс!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s-ы бал"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Ферох дӕ ис дӕ пароль? Дӕ пароль бындӕр бафысс, ӕмӕ дӕм мах email-ӕй ног "
+"пароль сывӕрыны амынд арвитдзыстӕм."
+
+msgid "Email address:"
+msgstr "Email адрис:"
+
+msgid "Reset my password"
+msgstr "Мӕ пароль ногӕй сӕвӕрын"
+
+msgid "All dates"
+msgstr "Бонтӕ иууылдӕр"
+
+#, python-format
+msgid "Select %s"
+msgstr "Равзарын %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Равзарын %s ивынӕн"
+
+msgid "Date:"
+msgstr "Бон:"
+
+msgid "Time:"
+msgstr "Рӕстӕг:"
+
+msgid "Lookup"
+msgstr "Акӕсын"
+
+msgid "Currently:"
+msgstr "Нырыккон:"
+
+msgid "Change:"
+msgstr "Ивд:"
diff --git a/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..03287e9
--- /dev/null
+++ b/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..597be8b
--- /dev/null
+++ b/tbc/static/admin/locale/os/LC_MESSAGES/djangojs.po
@@ -0,0 +1,162 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Soslan Khubulov <inactive+soslan@transifex.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ossetic (http://www.transifex.com/django/django/language/"
+"os/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: os\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Уӕвӕг %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Уӕвӕг %s-ты номхыгъд. Дӕ бон у искӕцытӕ дзы рауӕлдай кӕнай, куы сӕ равзарай "
+"бындӕр къӕртты ӕмӕ дыууӕ къӕртты ӕхсӕн \"Равзарын\"-ы ӕгънӕгыл куы ныххӕцай, "
+"уӕд."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Бафысс ацы къӕртты, уӕвӕг %s-ты номхыгъд фӕрсудзынӕн."
+
+msgid "Filter"
+msgstr "Фӕрсудзӕн"
+
+msgid "Choose all"
+msgstr "Равзарын алкӕцыдӕр"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Ныххӕц, алы %s равзарынӕн."
+
+msgid "Choose"
+msgstr "Равзарын"
+
+msgid "Remove"
+msgstr "Схафын"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Ӕвзӕрст %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ай у ӕвзӕрст %s-ты номхыгъд. Сӕ хафынӕн сӕ дӕ бон у бындӕр къӕртты равзарын "
+"ӕмӕ дыууӕ ӕгънӕджы ӕхсӕн \"Схфын\"-ыл ныххӕцын."
+
+msgid "Remove all"
+msgstr "Схафын алкӕцыдӕр"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Ныххӕц, алы ӕвзӕрст %s схафынӕн."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s-ӕй %(sel)s ӕвзӕрст"
+msgstr[1] "%(cnt)s-ӕй %(sel)s ӕвзӕрст"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Ӕнӕвӕрд ивдтытӕ баззадысты ивыны бынӕтты. Кӕд исты ми саразай, уӕд дӕ "
+"ӕнӕвӕрд ивдтытӕ фесӕфдзысты."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ды равзӕрстай цыдӕр ми, фӕлӕ ивӕн бынӕтты цы фӕивтай, уыдон нӕ бавӕрдтай. Дӕ "
+"хорзӕхӕй, ныххӕц Хорзыл цӕмӕй бавӕрд уой. Стӕй дын хъӕудзӕн ацы ми ногӕй "
+"бакӕнын."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ды равзӕртай цыдӕр ми, фӕлӕ ивӕн бынӕтты ницы баивтай. Уӕццӕгӕн дӕ Ацӕуыны "
+"ӕгънӕг хъӕуы, Бавӕрыны нӕ фӕлӕ."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "Ныр"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Рӕстӕг равзарын"
+
+msgid "Midnight"
+msgstr "Ӕмбисӕхсӕв"
+
+msgid "6 a.m."
+msgstr "6 ӕ.р."
+
+msgid "Noon"
+msgstr "Ӕмбисбон"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Раздӕхын"
+
+msgid "Today"
+msgstr "Абон"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Знон"
+
+msgid "Tomorrow"
+msgstr "Сом"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Январь Февраль Мартъи Апрель Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь"
+
+msgid "S M T W T F S"
+msgstr "Х К Д Ӕ Ц М С"
+
+msgid "Show"
+msgstr "Равдисын"
+
+msgid "Hide"
+msgstr "Айсын"
diff --git a/tbc/static/admin/locale/pa/LC_MESSAGES/django.mo b/tbc/static/admin/locale/pa/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c7d6c59
--- /dev/null
+++ b/tbc/static/admin/locale/pa/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pa/LC_MESSAGES/django.po b/tbc/static/admin/locale/pa/LC_MESSAGES/django.po
new file mode 100644
index 0000000..92c2bdf
--- /dev/null
+++ b/tbc/static/admin/locale/pa/LC_MESSAGES/django.po
@@ -0,0 +1,630 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/"
+"language/pa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pa\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਈਆਂ ਗਈਆਂ।"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "ਚੁਣੇ %(verbose_name_plural)s ਹਟਾਓ"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "ਸਭ"
+
+msgid "Yes"
+msgstr "ਹਾਂ"
+
+msgid "No"
+msgstr "ਨਹੀਂ"
+
+msgid "Unknown"
+msgstr "ਅਣਜਾਣ"
+
+msgid "Any date"
+msgstr "ਕੋਈ ਵੀ ਮਿਤੀ"
+
+msgid "Today"
+msgstr "ਅੱਜ"
+
+msgid "Past 7 days"
+msgstr "ਪਿਛਲੇ ੭ ਦਿਨ"
+
+msgid "This month"
+msgstr "ਇਹ ਮਹੀਨੇ"
+
+msgid "This year"
+msgstr "ਇਹ ਸਾਲ"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "ਕਾਰਵਾਈ:"
+
+msgid "action time"
+msgstr "ਕਾਰਵਾਈ ਸਮਾਂ"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "ਆਬਜੈਕਟ id"
+
+msgid "object repr"
+msgstr "ਆਬਜੈਕਟ repr"
+
+msgid "action flag"
+msgstr "ਕਾਰਵਾਈ ਫਲੈਗ"
+
+msgid "change message"
+msgstr "ਸੁਨੇਹਾ ਬਦਲੋ"
+
+msgid "log entry"
+msgstr "ਲਾਗ ਐਂਟਰੀ"
+
+msgid "log entries"
+msgstr "ਲਾਗ ਐਂਟਰੀਆਂ"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s ਬਦਲਿਆ।"
+
+msgid "and"
+msgstr "ਅਤੇ"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ਸ਼ਾਮਲ ਕੀਤਾ।"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ਲਈ %(list)s ਨੂੰ ਬਦਲਿਆ"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" ਹਟਾਇਆ ਗਿਆ।"
+
+msgid "No fields changed."
+msgstr "ਕੋਈ ਖੇਤਰ ਨਹੀਂ ਬਦਲਿਆ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" ਠੀਕ ਤਰ੍ਹਾਂ ਜੋੜਿਆ ਗਿਆ ਸੀ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਹੇਠਾਂ ਸੋਧ ਸਕਦੇ ਹੋ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਇਆ ਗਿਆ ਹੈ।"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਗਿਆ ਸੀ।"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr "ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਚੁਣੀ ਗਈ।"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਇਆ ਗਿਆ ਹੈ।"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "%s ਸ਼ਾਮਲ"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s ਬਦਲੋ"
+
+msgid "Database error"
+msgstr "ਡਾਟਾਬੇਸ ਗਲਤੀ"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਗਿਆ।"
+msgstr[1] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲੇ ਗਏ ਹਨ।"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s ਚੁਣਿਆ।"
+msgstr[1] "%(total_count)s ਚੁਣੇ"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "ਅਤੀਤ ਬਦਲੋ: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "ਡੀਜਾਂਗੋ ਸਾਈਟ ਐਡਮਿਨ"
+
+msgid "Django administration"
+msgstr "ਡੀਜਾਂਗੋ ਪਰਸ਼ਾਸ਼ਨ"
+
+msgid "Site administration"
+msgstr "ਸਾਈਟ ਪਰਬੰਧ"
+
+msgid "Log in"
+msgstr "ਲਾਗ ਇਨ"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "ਸਫ਼ਾ ਨਹੀਂ ਲੱਭਿਆ"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਅਸੀਂ ਮੰਗਿਆ ਗਿਆ ਸਫ਼ਾ ਨਹੀਂ ਲੱਭ ਸਕੇ।"
+
+msgid "Home"
+msgstr "ਘਰ"
+
+msgid "Server error"
+msgstr "ਸਰਵਰ ਗਲਤੀ"
+
+msgid "Server error (500)"
+msgstr "ਸਰਵਰ ਗਲਤੀ (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "ਸਰਵਰ ਗਲਤੀ <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "ਚੁਣੀ ਕਾਰਵਾਈ ਕਰੋ"
+
+msgid "Go"
+msgstr "ਜਾਓ"
+
+msgid "Click here to select the objects across all pages"
+msgstr "ਸਭ ਸਫ਼ਿਆਂ ਵਿੱਚੋਂ ਆਬਜੈਕਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "ਸਭ %(total_count)s %(module_name)s ਚੁਣੋ"
+
+msgid "Clear selection"
+msgstr "ਚੋਣ ਸਾਫ਼ ਕਰੋ"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "ਪਹਿਲਾਂ ਆਪਣਾ ਯੂਜ਼ਰ ਨਾਂ ਤੇ ਪਾਸਵਰਡ ਦਿਉ। ਫੇਰ ਤੁਸੀਂ ਹੋਰ ਯੂਜ਼ਰ ਚੋਣਾਂ ਨੂੰ ਸੋਧ ਸਕਦੇ ਹੋ।"
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "ਪਾਸਵਰਡ ਬਦਲੋ"
+
+msgid "Please correct the error below."
+msgstr "ਹੇਠ ਦਿੱਤੀਆਂ ਗਲਤੀਆਂ ਠੀਕ ਕਰੋ ਜੀ।"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "ਯੂਜ਼ਰ <strong>%(username)s</strong> ਲਈ ਨਵਾਂ ਪਾਸਵਰਡ ਦਿਓ।"
+
+msgid "Welcome,"
+msgstr "ਜੀ ਆਇਆਂ ਨੂੰ, "
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "ਡੌਕੂਮੈਂਟੇਸ਼ਨ"
+
+msgid "Log out"
+msgstr "ਲਾਗ ਆਉਟ"
+
+msgid "Add"
+msgstr "ਸ਼ਾਮਲ"
+
+msgid "History"
+msgstr "ਅਤੀਤ"
+
+msgid "View on site"
+msgstr "ਸਾਈਟ ਉੱਤੇ ਜਾਓ"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ਸ਼ਾਮਲ"
+
+msgid "Filter"
+msgstr "ਫਿਲਟਰ"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "ਹਟਾਓ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ਹਾਂ, ਮੈਂ ਚਾਹੁੰਦਾ ਹਾਂ"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "ਕਈ ਆਬਜੈਕਟ ਹਟਾਓ"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "ਬਦਲੋ"
+
+msgid "Remove"
+msgstr "ਹਟਾਓ"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "%(verbose_name)s ਹੋਰ ਸ਼ਾਮਲ"
+
+msgid "Delete?"
+msgstr "ਹਟਾਉਣਾ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s ਵਲੋਂ "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "ਤੁਹਾਨੂੰ ਕੁਝ ਵੀ ਸੋਧਣ ਦਾ ਅਧਿਕਾਰ ਨਹੀਂ ਹੈ।"
+
+msgid "Recent Actions"
+msgstr "ਤਾਜ਼ਾ ਕਾਰਵਾਈਆਂ"
+
+msgid "My Actions"
+msgstr "ਮੇਰੀਆਂ ਕਾਰਵਾਈਆਂ"
+
+msgid "None available"
+msgstr "ਕੋਈ ਉਪਲੱਬਧ ਨਹੀਂ"
+
+msgid "Unknown content"
+msgstr "ਅਣਜਾਣ ਸਮੱਗਰੀ"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "ਮਿਤੀ/ਸਮਾਂ"
+
+msgid "User"
+msgstr "ਯੂਜ਼ਰ"
+
+msgid "Action"
+msgstr "ਕਾਰਵਾਈ"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr "ਸਭ ਵੇਖੋ"
+
+msgid "Save"
+msgstr "ਸੰਭਾਲੋ"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "ਖੋਜ"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s ਕੁੱਲ"
+
+msgid "Save as new"
+msgstr "ਨਵੇਂ ਵਜੋਂ ਵੇਖੋ"
+
+msgid "Save and add another"
+msgstr "ਸੰਭਾਲੋ ਤੇ ਹੋਰ ਸ਼ਾਮਲ"
+
+msgid "Save and continue editing"
+msgstr "ਸੰਭਾਲੋ ਤੇ ਸੋਧਣਾ ਜਾਰੀ ਰੱਖੋ"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ਅੱਜ ਵੈੱਬਸਾਈਟ ਨੂੰ ਕੁਝ ਚੰਗਾ ਸਮਾਂ ਦੇਣ ਲਈ ਧੰਨਵਾਦ ਹੈ।"
+
+msgid "Log in again"
+msgstr "ਫੇਰ ਲਾਗਇਨ ਕਰੋ"
+
+msgid "Password change"
+msgstr "ਪਾਸਵਰਡ ਬਦਲੋ"
+
+msgid "Your password was changed."
+msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਗਿਆ ਹੈ।"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"ਸੁਰੱਖਿਆ ਲਈ ਪਹਿਲਾਂ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਦਿਉ, ਅਤੇ ਫੇਰ ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦੋ ਵਰਾ ਦਿਉ ਤਾਂ ਕਿ "
+"ਅਸੀਂ ਜਾਂਚ ਸਕੀਏ ਕਿ ਤੁਸੀਂ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਹੈ।"
+
+msgid "Change my password"
+msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਬਦਲੋ"
+
+msgid "Password reset"
+msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਜਾਰੀ ਰੱਖ ਕੇ ਹੁਣੇ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ।"
+
+msgid "Password reset confirmation"
+msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਪੁਸ਼ਟੀ"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦੋ ਵਾਰ ਦਿਉ ਤਾਂ ਕਿ ਅਸੀਂ ਜਾਂਚ ਕਰ ਸਕੀਏ ਕਿ ਤੁਸੀਂ ਠੀਕ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਹੈ।"
+
+msgid "New password:"
+msgstr "ਨਵਾਂ ਪਾਸਵਰਡ:"
+
+msgid "Confirm password:"
+msgstr "ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"ਪਾਸਵਰਡ ਰੀ-ਸੈੱਟ ਲਿੰਕ ਗਲਤ ਹੈ, ਸੰਭਵ ਤੌਰ ਉੱਤੇ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ। ਨਵਾਂ ਪਾਸਵਰਡ ਰੀ-"
+"ਸੈੱਟ ਲਈ ਬੇਨਤੀ ਭੇਜੋ ਜੀ।"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "ਅੱਗੇ ਦਿੱਤੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਚੁਣੋ:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਨਾਂ, ਜੇ ਕਿਤੇ ਗਲਤੀ ਨਾਲ ਭੁੱਲ ਗਏ ਹੋਵੋ:"
+
+msgid "Thanks for using our site!"
+msgstr "ਸਾਡੀ ਸਾਈਟ ਵਰਤਣ ਲਈ ਧੰਨਵਾਦ ਜੀ!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ਟੀਮ"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ"
+
+msgid "All dates"
+msgstr "ਸਭ ਮਿਤੀਆਂ"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s ਚੁਣੋ"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "ਬਦਲਣ ਲਈ %s ਚੁਣੋ"
+
+msgid "Date:"
+msgstr "ਮਿਤੀ:"
+
+msgid "Time:"
+msgstr "ਸਮਾਂ:"
+
+msgid "Lookup"
+msgstr "ਖੋਜ"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..d73e925
--- /dev/null
+++ b/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c67be6f
--- /dev/null
+++ b/tbc/static/admin/locale/pa/LC_MESSAGES/djangojs.po
@@ -0,0 +1,149 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/"
+"language/pa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pa\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "ਉਪਲੱਬਧ %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "ਫਿਲਟਰ"
+
+msgid "Choose all"
+msgstr "ਸਭ ਚੁਣੋ"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "ਹਟਾਓ"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s ਚੁਣੋ"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "ਹੁਣੇ"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ਸਮਾਂ ਚੁਣੋ"
+
+msgid "Midnight"
+msgstr "ਅੱਧੀ-ਰਾਤ"
+
+msgid "6 a.m."
+msgstr "6 ਸਵੇਰ"
+
+msgid "Noon"
+msgstr "ਦੁਪਹਿਰ"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "ਰੱਦ ਕਰੋ"
+
+msgid "Today"
+msgstr "ਅੱਜ"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "ਕੱਲ੍ਹ"
+
+msgid "Tomorrow"
+msgstr "ਭਲਕੇ"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ਜਨਵਰੀ ਫਰਵਰੀ ਮਾਰਚ ਅਪਰੈਲ ਮਈ ਜੂਨ ਜੁਲਾਈ ਅਗਸਤ ਸਤੰਬਰ ਅਕਤੂਬਰ ਨਵੰਬਰ ਦਸੰਬਰ"
+
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+msgid "Show"
+msgstr "ਵੇਖੋ"
+
+msgid "Hide"
+msgstr "ਓਹਲੇ"
diff --git a/tbc/static/admin/locale/pl/LC_MESSAGES/django.mo b/tbc/static/admin/locale/pl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..44fee6e
--- /dev/null
+++ b/tbc/static/admin/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pl/LC_MESSAGES/django.po b/tbc/static/admin/locale/pl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..768ad3f
--- /dev/null
+++ b/tbc/static/admin/locale/pl/LC_MESSAGES/django.po
@@ -0,0 +1,693 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# angularcircle, 2011-2013
+# angularcircle, 2013-2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janusz Harkot <jh@blueice.pl>, 2014-2015
+# Karol <kfuks2@o2.pl>, 2012
+# konryd <inactive+konryd@transifex.com>, 2011
+# konryd <inactive+konryd@transifex.com>, 2011
+# Maciek Olko <maciej.olko@gmail.com>, 2015
+# Ola Sitarska <ola@sitarska.com>, 2013
+# Ola Sitarska <ola@sitarska.com>, 2013
+# Roman Barczyński <rombar@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-25 16:53+0000\n"
+"Last-Translator: Janusz Harkot <jh@blueice.pl>\n"
+"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Usunięto %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nie można usunąć %(name)s"
+
+msgid "Are you sure?"
+msgstr "Jesteś pewien?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Usuń wybrane %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administracja"
+
+msgid "All"
+msgstr "Wszystko"
+
+msgid "Yes"
+msgstr "Tak"
+
+msgid "No"
+msgstr "Nie"
+
+msgid "Unknown"
+msgstr "Nieznany"
+
+msgid "Any date"
+msgstr "Dowolna data"
+
+msgid "Today"
+msgstr "Dzisiaj"
+
+msgid "Past 7 days"
+msgstr "Ostatnie 7 dni"
+
+msgid "This month"
+msgstr "Ten miesiąc"
+
+msgid "This year"
+msgstr "Ten rok"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Wprowadź poprawne dane w polach \"%(username)s\" i \"hasło\" dla konta "
+"należącego do zespołu. Uwaga: wielkość liter może mieć znaczenie."
+
+msgid "Action:"
+msgstr "Akcja:"
+
+msgid "action time"
+msgstr "czas akcji"
+
+msgid "user"
+msgstr "użytkownik"
+
+msgid "content type"
+msgstr "typ zawartości"
+
+msgid "object id"
+msgstr "id obiektu"
+
+msgid "object repr"
+msgstr "reprezentacja obiektu"
+
+msgid "action flag"
+msgstr "flaga akcji"
+
+msgid "change message"
+msgstr "zmień wiadomość"
+
+msgid "log entry"
+msgstr "log"
+
+msgid "log entries"
+msgstr "logi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Dodano \" %(object)s \"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Zmieniono \" %(object)s \" - %(changes)s "
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Usunięto \" %(object)s \"."
+
+msgid "LogEntry Object"
+msgstr "Obiekt typu LogEntry"
+
+msgid "None"
+msgstr "brak"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Przytrzymaj wciśnięty klawisz \"Ctrl\" lub \"Command\" na Mac'u aby "
+"zaznaczyć więcej niż jeden wybór."
+
+msgid "Added."
+msgstr "Dodany."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Zmieniono %s"
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodano %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Zmieniono %(list)s w %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Usunięto %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Żadne pole nie zmienione."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Pomyślnie dodano %(name)s \"%(obj)s\". Poniżej możesz dodać dodać kolejny "
+"%(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Zmiany w %(name)s \"%(obj)s\" zostały zapisane. Poniżej możesz edytować go "
+"ponownie."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Zmiany w %(name)s \"%(obj)s\" zostały zapisane. Poniżej możesz dodać dodać "
+"kolejny %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Wykonanie akcji wymaga wybrania obiektów. Żaden obiekt nie został zmieniony."
+
+msgid "No action selected."
+msgstr "Nie wybrano akcji."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Obiekt %(name)s o kluczu głównym %(key)r nie istnieje."
+
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Zmień %s"
+
+msgid "Database error"
+msgstr "Błąd bazy danych"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s został pomyślnie zmieniony."
+msgstr[1] "%(count)s %(name)s zostały pomyślnie zmienione."
+msgstr[2] "%(count)s %(name)s zostało pomyślnie zmienionych."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s wybrany"
+msgstr[1] "%(total_count)s wybrane"
+msgstr[2] "%(total_count)s wybranych"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 z %(cnt)s wybranych"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia zmian: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Usunięcie %(class_name)s %(instance)s spowoduje usunięcia następujących "
+"chronionych obiektów pokrewnych: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Administracja stroną Django"
+
+msgid "Django administration"
+msgstr "Administracja Django"
+
+msgid "Site administration"
+msgstr "Administracja stroną"
+
+msgid "Log in"
+msgstr "Zaloguj się"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s - administracja"
+
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Niestety, żądana strona nie została znaleziona."
+
+msgid "Home"
+msgstr "Początek"
+
+msgid "Server error"
+msgstr "Błąd serwera"
+
+msgid "Server error (500)"
+msgstr "Błąd serwera (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Błąd Serwera <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Niestety wystąpił błąd. Administratorzy strony zostali o nim powiadomieni "
+"poprzez email i niebawem zaistniały problem powinien zostać rozwiązany. "
+"Dziękujemy za wyrozumiałość."
+
+msgid "Run the selected action"
+msgstr "Wykonaj wybraną akcję"
+
+msgid "Go"
+msgstr "Wykonaj"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliknij by wybrać obiekty na wszystkich stronach"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Wybierz wszystkie %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Wyczyść wybór"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować "
+"więcej opcji użytkownika."
+
+msgid "Enter a username and password."
+msgstr "Podaj nazwę użytkownika i hasło."
+
+msgid "Change password"
+msgstr "Zmiana hasła"
+
+msgid "Please correct the error below."
+msgstr "Proszę, popraw poniższe błędy."
+
+msgid "Please correct the errors below."
+msgstr "Proszę, popraw poniższe błędy."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Podaj nowe hasło dla użytkownika <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Witaj,"
+
+msgid "View site"
+msgstr "Pokaż stronę"
+
+msgid "Documentation"
+msgstr "Dokumentacja"
+
+msgid "Log out"
+msgstr "Wyloguj się"
+
+msgid "Add"
+msgstr "Dodaj"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Pokaż na stronie"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Remove from sorting"
+msgstr "Usuń z sortowania"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Priorytet sortowania: %(priority_number)s "
+
+msgid "Toggle sorting"
+msgstr "Zmień sortowanie"
+
+msgid "Delete"
+msgstr "Usuń"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Usunięcie %(object_name)s '%(escaped_object)s' spowoduje skasowanie "
+"obiektów, które są z nim powiązane. Niestety nie posiadasz uprawnień do "
+"usunięcia następujących typów obiektów:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Usunięcie %(object_name)s '%(escaped_object)s' wymaga skasowania "
+"następujących chronionych obiektów, które są z nim powiązane:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Czy chcesz skasować %(object_name)s \"%(escaped_object)s\"? Następujące "
+"zależne obiekty zostaną skasowane:"
+
+msgid "Objects"
+msgstr "Obiekty"
+
+msgid "Yes, I'm sure"
+msgstr "Tak, na pewno"
+
+msgid "No, take me back"
+msgstr "Nie, zabierz mnie stąd"
+
+msgid "Delete multiple objects"
+msgstr "Usuwanie wielu obiektów"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Usunięcie %(objects_name)s spowoduje skasowanie obiektów, które są z nim "
+"powiązane. Niestety nie posiadasz uprawnień do usunięcia następujących typów "
+"obiektów:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Usunięcie %(objects_name)s wymaga skasowania następujących chronionych "
+"obiektów, które są z nim powiązane:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Czy chcesz skasować zaznaczone %(objects_name)s? Następujące obiekty oraz "
+"obiekty od nich zależne zostaną skasowane:"
+
+msgid "Change"
+msgstr "Zmień"
+
+msgid "Remove"
+msgstr "Usuń"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Dodaj kolejne %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Usunąć?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Używając %(filter_title)s "
+
+msgid "Summary"
+msgstr "Podsumowanie"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modele w aplikacji %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nie masz uprawnień by edytować cokolwiek."
+
+msgid "Recent Actions"
+msgstr "Ostatnie akcje"
+
+msgid "My Actions"
+msgstr "Moje akcje"
+
+msgid "None available"
+msgstr "Brak"
+
+msgid "Unknown content"
+msgstr "Zawartość nieznana"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie "
+"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich "
+"odczytu."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Jesteś uwierzytelniony jako %(username)s, ale nie jesteś upoważniony do "
+"dostępu do tej strony. Czy chciałbyś zalogować się na inne konto?"
+
+msgid "Forgotten your password or username?"
+msgstr "Nie pamiętasz swojego hasła, bądź nazwy konta użytkownika?"
+
+msgid "Date/time"
+msgstr "Data/czas"
+
+msgid "User"
+msgstr "Użytkownik"
+
+msgid "Action"
+msgstr "Akcja"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis ten nie został "
+"dodany poprzez panel administracyjny."
+
+msgid "Show all"
+msgstr "Pokaż wszystko"
+
+msgid "Save"
+msgstr "Zapisz"
+
+msgid "Popup closing..."
+msgstr "Zamykanie okienka..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Zmień wybrane %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Dodaj kolejny %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Usuń wybrane %(model)s"
+
+msgid "Search"
+msgstr "Szukaj"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s wynik"
+msgstr[1] "%(counter)s wyniki"
+msgstr[2] "%(counter)s wyników"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s trafień"
+
+msgid "Save as new"
+msgstr "Zapisz jako nowe"
+
+msgid "Save and add another"
+msgstr "Zapisz i dodaj nowe"
+
+msgid "Save and continue editing"
+msgstr "Zapisz i kontynuuj edycję"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dziękujemy za odwiedzenie serwisu."
+
+msgid "Log in again"
+msgstr "Zaloguj się ponownie"
+
+msgid "Password change"
+msgstr "Zmiana hasła"
+
+msgid "Your password was changed."
+msgstr "Twoje hasło zostało zmienione."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Podaj swoje stare hasło i dwa razy nowe."
+
+msgid "Change my password"
+msgstr "Zmień hasło"
+
+msgid "Password reset"
+msgstr "Zresetuj hasło"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Twoje hasło zostało ustawione. Możesz się teraz zalogować."
+
+msgid "Password reset confirmation"
+msgstr "Potwierdzenie zresetowania hasła"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Podaj dwukrotnie nowe hasło, by można było zweryfikować, czy zostało wpisane "
+"poprawnie."
+
+msgid "New password:"
+msgstr "Nowe hasło:"
+
+msgid "Confirm password:"
+msgstr "Potwierdź hasło:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Link pozwalający na reset hasła jest niepoprawny - być może dlatego, że "
+"został już raz użyty. Możesz ponownie zażądać zresetowania hasła."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Instrukcja pozwalająca ustawić nowe hasło dla podanego adresu email została "
+"wysłana. Niebawem powinna się pojawić na Twoim koncie pocztowym."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"W przypadku nieotrzymania wiadomości email: upewnij się czy adres "
+"wprowadzony jest zgodny z tym podanym podczas rejestracji i sprawdź "
+"zawartość folderu SPAM na swoim koncie."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Otrzymujesz tę wiadomość, gdyż skorzystano z opcji resetu hasła dla Twojego "
+"konta na stronie %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Aby wprowadzić nowe hasło, proszę przejść na stronę, której adres widnieje "
+"poniżej:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Twoja nazwa użytkownika:"
+
+msgid "Thanks for using our site!"
+msgstr "Dziękujemy za skorzystanie naszej strony."
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Zespół %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Nie pamiętasz swojego hasła? Wprowadź w poniższym polu swój adres email, a "
+"wyślemy Ci instrukcję opisującą sposób ustawienia nowego hasła."
+
+msgid "Email address:"
+msgstr "Adres email:"
+
+msgid "Reset my password"
+msgstr "Zresetuj moje hasło"
+
+msgid "All dates"
+msgstr "Wszystkie daty"
+
+#, python-format
+msgid "Select %s"
+msgstr "Zaznacz %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Zaznacz %s aby zmienić"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Czas:"
+
+msgid "Lookup"
+msgstr "Szukaj"
+
+msgid "Currently:"
+msgstr "Aktualny:"
+
+msgid "Change:"
+msgstr "Zmień:"
diff --git a/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..3c57532
--- /dev/null
+++ b/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f347b5f
--- /dev/null
+++ b/tbc/static/admin/locale/pl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,176 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# angularcircle, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janusz Harkot <jh@blueice.pl>, 2014-2015
+# konryd <inactive+konryd@transifex.com>, 2011
+# Roman Barczyński <rombar@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-25 17:02+0000\n"
+"Last-Translator: Janusz Harkot <jh@blueice.pl>\n"
+"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostępne %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"To jest lista dostępnych %s. Aby wybrać pozycje zaznacz je i kliknij "
+"strzałkę \"Wybierz\" pomiędzy listami."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Pisz tutaj aby wyfiltrować listę dostępnych %s."
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Choose all"
+msgstr "Wybierz wszystko"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kliknij aby wybrać wszystkie %s na raz."
+
+msgid "Choose"
+msgstr "Wybierz"
+
+msgid "Remove"
+msgstr "Usuń"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Wybrano %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"To jest lista wybranych %s. Aby usunąć zaznacz pozycje wybrane do usunięcia "
+"i kliknij strzałkę \"Usuń\" pomiędzy listami."
+
+msgid "Remove all"
+msgstr "Usuń wszystkie"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kliknij aby usunąć wszystkie wybrane %s na raz."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Zaznaczono %(sel)s z %(cnt)s"
+msgstr[1] "Zaznaczono %(sel)s z %(cnt)s"
+msgstr[2] "Zaznaczono %(sel)s z %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Zmiany w niektórych polach nie zostały zachowane. Po wykonaniu akcji zmiany "
+"te zostaną utracone."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Wybrano akcję, lecz część zmian w polach nie została zachowana. Kliknij OK "
+"aby zapisać. Aby wykonać akcję, należy ją ponownie uruchomić."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Wybrano akcję, lecz nie dokonano żadnych zmian. Prawdopodobnie szukasz "
+"przycisku \"Wykonaj\" (a nie \"Zapisz\")"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"Uwaga: Czas lokalny jest przesunięty %s godzinę w stosunku do czasu serwera."
+msgstr[1] ""
+"Uwaga: Czas lokalny jest przesunięty %s godziny w stosunku do czasu serwera."
+msgstr[2] ""
+"Uwaga: Czas lokalny jest przesunięty %s godzin w stosunku do czasu serwera."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Uwaga: Czas lokalny jest przesunięty o %s godzinę w stosunku do czasu "
+"serwera."
+msgstr[1] ""
+"Uwaga: Czas lokalny jest przesunięty o %s godziny w stosunku do czasu "
+"serwera."
+msgstr[2] ""
+"Uwaga: Czas lokalny jest przesunięty o %s godzin w stosunku do czasu serwera."
+
+msgid "Now"
+msgstr "Teraz"
+
+msgid "Choose a Time"
+msgstr "Wybierz czas"
+
+msgid "Choose a time"
+msgstr "Wybierz czas"
+
+msgid "Midnight"
+msgstr "Północ"
+
+msgid "6 a.m."
+msgstr "6 rano"
+
+msgid "Noon"
+msgstr "Południe"
+
+msgid "6 p.m."
+msgstr "6 po południu"
+
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgid "Today"
+msgstr "Dzisiaj"
+
+msgid "Choose a Date"
+msgstr "Wybierz datę"
+
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+msgid "Tomorrow"
+msgstr "Jutro"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień "
+"Październik Listopad Grudzień"
+
+msgid "S M T W T F S"
+msgstr "N Pn Wt Śr Cz Pt So"
+
+msgid "Show"
+msgstr "Pokaż"
+
+msgid "Hide"
+msgstr "Ukryj"
diff --git a/tbc/static/admin/locale/pt/LC_MESSAGES/django.mo b/tbc/static/admin/locale/pt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..17b4acd
--- /dev/null
+++ b/tbc/static/admin/locale/pt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pt/LC_MESSAGES/django.po b/tbc/static/admin/locale/pt/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e19173c
--- /dev/null
+++ b/tbc/static/admin/locale/pt/LC_MESSAGES/django.po
@@ -0,0 +1,690 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# jorgecarleitao <jorgecarleitao@gmail.com>, 2015
+# Nuno Mariz <nmariz@gmail.com>, 2013,2015
+# Paulo Köch <paulo.koch@gmail.com>, 2011
+# Raúl Pedro Fernandes Santos, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-24 18:27+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: Portuguese (http://www.transifex.com/django/django/language/"
+"pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Foram removidos com sucesso %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Não é possível remover %(name)s "
+
+msgid "Are you sure?"
+msgstr "Tem a certeza?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Remover %(verbose_name_plural)s selecionados"
+
+msgid "Administration"
+msgstr "Administração"
+
+msgid "All"
+msgstr "Todos"
+
+msgid "Yes"
+msgstr "Sim"
+
+msgid "No"
+msgstr "Não"
+
+msgid "Unknown"
+msgstr "Desconhecido"
+
+msgid "Any date"
+msgstr "Qualquer data"
+
+msgid "Today"
+msgstr "Hoje"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+msgid "This month"
+msgstr "Este mês"
+
+msgid "This year"
+msgstr "Este ano"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor introduza o %(username)s e password corretos para a conta de "
+"equipa. Tenha em atenção às maiúsculas e minúsculas."
+
+msgid "Action:"
+msgstr "Ação:"
+
+msgid "action time"
+msgstr "hora da ação"
+
+msgid "user"
+msgstr "utilizador"
+
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+msgid "object id"
+msgstr "id do objeto"
+
+msgid "object repr"
+msgstr "repr do objeto"
+
+msgid "action flag"
+msgstr "flag de ação"
+
+msgid "change message"
+msgstr "modificar mensagem"
+
+msgid "log entry"
+msgstr "entrada de log"
+
+msgid "log entries"
+msgstr "entradas de log"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Adicionado \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Foram modificados \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Foram removidos \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto LogEntry"
+
+msgid "None"
+msgstr "Nenhum"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenha pressionado o \"Control\", ou \"Command\" no Mac, para selecionar "
+"mais do que um."
+
+msgid "Added."
+msgstr "Adicionado."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Foi modificado %s."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Foram adicionados %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Foram modificados %(list)s para %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Foram removidos %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nenhum campo foi modificado."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso. Pode voltar a "
+"editar novamente abaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"O %(name)s \"%(obj)s\" foi adicionado corretamente. Pode adicionar um novo "
+"%(name)s abaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"O %(name)s \"%(obj)s\" foi modificado corretamente. Pode editá-lo novamente "
+"abaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"O %(name)s \"%(obj)s\" foi modificado corretamente. Pode adicionar um novo "
+"%(name)s abaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado(a) com sucesso."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Os itens devem ser selecionados de forma a efectuar ações sobre eles. Nenhum "
+"item foi modificado."
+
+msgid "No action selected."
+msgstr "Nenhuma ação selecionada."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "O object %(name)s com a chave primária %(key)r não existe."
+
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Erro de base de dados"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s foi modificado com sucesso."
+msgstr[1] "%(count)s %(name)s foram modificados com sucesso."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selecionado"
+msgstr[1] "Todos %(total_count)s selecionados"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s selecionados"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificações: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Remover %(class_name)s %(instance)s exigiria a remoção dos seguintes objetos "
+"relacionados protegidos: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+msgid "Django administration"
+msgstr "Administração do Django"
+
+msgid "Site administration"
+msgstr "Administração do site"
+
+msgid "Log in"
+msgstr "Entrar"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administração de %(app)s"
+
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pedimos desculpa, mas a página solicitada não foi encontrada."
+
+msgid "Home"
+msgstr "Início"
+
+msgid "Server error"
+msgstr "Erro do servidor"
+
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ocorreu um erro. Foi enviada uma notificação para os administradores do "
+"site, devendo o mesmo ser corrigido em breve. Obrigado pela atenção."
+
+msgid "Run the selected action"
+msgstr "Executar a acção selecionada"
+
+msgid "Go"
+msgstr "Ir"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Clique aqui para selecionar os objetos em todas as páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Selecionar todos %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Remover seleção"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá "
+"editar mais opções do utilizador."
+
+msgid "Enter a username and password."
+msgstr "Introduza o utilizador e palavra-passe."
+
+msgid "Change password"
+msgstr "Modificar palavra-passe"
+
+msgid "Please correct the error below."
+msgstr "Por favor corrija os erros abaixo."
+
+msgid "Please correct the errors below."
+msgstr "Por favor corrija os erros abaixo."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduza uma nova palavra-passe para o utilizador <strong>%(username)s</"
+"strong>."
+
+msgid "Welcome,"
+msgstr "Bem-vindo,"
+
+msgid "View site"
+msgstr "Ver site"
+
+msgid "Documentation"
+msgstr "Documentação"
+
+msgid "Log out"
+msgstr "Sair"
+
+msgid "Add"
+msgstr "Adicionar"
+
+msgid "History"
+msgstr "História"
+
+msgid "View on site"
+msgstr "Ver no site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Remover da ordenação"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridade de ordenação: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Altenar ordenação"
+
+msgid "Delete"
+msgstr "Remover"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"A remoção de %(object_name)s '%(escaped_object)s' resultará na remoção dos "
+"objetos relacionados, mas a sua conta não tem permissão de remoção dos "
+"seguintes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Remover o %(object_name)s ' %(escaped_object)s ' exigiria a remoção dos "
+"seguintes objetos protegidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? "
+"Todos os items relacionados seguintes irão ser removidos:"
+
+msgid "Objects"
+msgstr "Objectos"
+
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho a certeza"
+
+msgid "No, take me back"
+msgstr "Não, retrocede"
+
+msgid "Delete multiple objects"
+msgstr "Remover múltiplos objetos."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Remover o %(objects_name)s selecionado poderia resultar na remoção de "
+"objetos relacionados, mas a sua conta não tem permissão para remover os "
+"seguintes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos "
+"protegidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Tem certeza de que deseja remover %(objects_name)s selecionado? Todos os "
+"objetos seguintes e seus itens relacionados serão removidos:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Adicionar outro %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Remover?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+msgid "Summary"
+msgstr "Sumário"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos na aplicação %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Não tem permissão para modificar nada."
+
+msgid "Recent Actions"
+msgstr "Ações Recentes"
+
+msgid "My Actions"
+msgstr "As minhas Ações"
+
+msgid "None available"
+msgstr "Nenhum disponível"
+
+msgid "Unknown content"
+msgstr "Conteúdo desconhecido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Passa-se algo de errado com a instalação da sua base de dados. Verifique se "
+"as tabelas da base de dados foram criadas apropriadamente e verifique se a "
+"base de dados pode ser lida pelo utilizador definido."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Está autenticado como %(username)s, mas não está autorizado a aceder a esta "
+"página. Deseja autenticar-se com uma conta diferente?"
+
+msgid "Forgotten your password or username?"
+msgstr "Esqueceu-se da sua palavra-passe ou utilizador?"
+
+msgid "Date/time"
+msgstr "Data/hora"
+
+msgid "User"
+msgstr "Utilizador"
+
+msgid "Action"
+msgstr "Ação"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto não tem histórico de modificações. Provavelmente não foi "
+"modificado via site de administração."
+
+msgid "Show all"
+msgstr "Mostrar todos"
+
+msgid "Save"
+msgstr "Gravar"
+
+msgid "Popup closing..."
+msgstr "Fechando o popup..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Alterar %(model)s selecionado."
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Adicionar outro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Remover %(model)s seleccionado"
+
+msgid "Search"
+msgstr "Pesquisar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s no total"
+
+msgid "Save as new"
+msgstr "Gravar como novo"
+
+msgid "Save and add another"
+msgstr "Gravar e adicionar outro"
+
+msgid "Save and continue editing"
+msgstr "Gravar e continuar a editar"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado pela sua visita."
+
+msgid "Log in again"
+msgstr "Entrar novamente"
+
+msgid "Password change"
+msgstr "Modificação da palavra-passe"
+
+msgid "Your password was changed."
+msgstr "A sua palavra-passe foi modificada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por razões de segurança, por favor introduza a sua palavra-passe antiga e "
+"depois introduza a nova duas vezes para que possamos verificar se introduziu "
+"corretamente."
+
+msgid "Change my password"
+msgstr "Modificar a minha palavra-passe"
+
+msgid "Password reset"
+msgstr "Palavra-passe de reinicialização"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "A sua palavra-passe foi atribuída. Pode entrar agora."
+
+msgid "Password reset confirmation"
+msgstr "Confirmação da reinicialização da palavra-passe"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor, introduza a sua nova palavra-passe duas vezes para verificarmos "
+"se está correcta."
+
+msgid "New password:"
+msgstr "Nova palavra-passe:"
+
+msgid "Confirm password:"
+msgstr "Confirmação da palavra-passe:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"O endereço de reinicialização da palavra-passe é inválido, possivelmente "
+"porque já foi usado. Por favor requisite uma nova reinicialização da palavra-"
+"passe."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Foram enviadas para o email indicado as instruções de configuração da "
+"palavra-passe, se existir uma conta com o email que indicou. Deverá recebê-"
+"las brevemente."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Se não receber um email, por favor assegure-se de que introduziu o endereço "
+"com o qual se registou e verifique a sua pasta de correio electrónico não "
+"solicitado."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Está a receber este email porque pediu para redefinir a palavra-chave para o "
+"seu utilizador no site %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Por favor siga a seguinte página e escolha a sua nova palavra-passe:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "O seu nome de utilizador, no caso de se ter esquecido:"
+
+msgid "Thanks for using our site!"
+msgstr "Obrigado pela sua visita ao nosso site!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "A equipa do %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Esqueceu-se da sua palavra-chave? Introduza o seu endereço de email e enviar-"
+"lhe-emos instruções para definir uma nova."
+
+msgid "Email address:"
+msgstr "Endereço de email:"
+
+msgid "Reset my password"
+msgstr "Reinicializar a minha palavra-passe"
+
+msgid "All dates"
+msgstr "Todas as datas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selecionar %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecione %s para modificar"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Procurar"
+
+msgid "Currently:"
+msgstr "Atualmente:"
+
+msgid "Change:"
+msgstr "Modificar:"
diff --git a/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..96c87dc
--- /dev/null
+++ b/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..5d34971
--- /dev/null
+++ b/tbc/static/admin/locale/pt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,168 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Nuno Mariz <nmariz@gmail.com>, 2011-2012,2015
+# Paulo Köch <paulo.koch@gmail.com>, 2011
+# Raúl Pedro Fernandes Santos, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-24 18:04+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: Portuguese (http://www.transifex.com/django/django/language/"
+"pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Disponível %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta é a lista de %s disponíveis. Poderá escolher alguns, selecionando-os na "
+"caixa abaixo e clicando na seta \"Escolher\" entre as duas caixas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Digite nesta caixa para filtrar a lista de %s disponíveis."
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Clique para escolher todos os %s de uma vez."
+
+msgid "Choose"
+msgstr "Escolher"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Escolhido %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta é a lista de %s escolhidos. Poderá remover alguns, selecionando-os na "
+"caixa abaixo e clicando na seta \"Remover\" entre as duas caixas."
+
+msgid "Remove all"
+msgstr "Remover todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Clique para remover todos os %s escolhidos de uma vez."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s selecionado"
+msgstr[1] "%(sel)s de %(cnt)s selecionados"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Tem mudanças por guardar nos campos individuais. Se usar uma ação, as suas "
+"mudanças por guardar serão perdidas."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Selecionou uma ação mas ainda não guardou as mudanças dos campos "
+"individuais. Carregue em OK para gravar. Precisará de correr de novo a ação."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Selecionou uma ação mas ainda não guardou as mudanças dos campos "
+"individuais. Provavelmente quererá o botão Ir ao invés do botão Guardar."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"Nota: O seu fuso horário está %s hora adiantado em relação ao servidor."
+msgstr[1] ""
+"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Nota: O use fuso horário está %s hora atrasado em relação ao servidor."
+msgstr[1] ""
+"Nota: O use fuso horário está %s horas atrasado em relação ao servidor."
+
+msgid "Now"
+msgstr "Agora"
+
+msgid "Choose a Time"
+msgstr "Escolha a Hora"
+
+msgid "Choose a time"
+msgstr "Escolha a hora"
+
+msgid "Midnight"
+msgstr "Meia-noite"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Meio-dia"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoje"
+
+msgid "Choose a Date"
+msgstr "Escolha a Data"
+
+msgid "Yesterday"
+msgstr "Ontem"
+
+msgid "Tomorrow"
+msgstr "Amanhã"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro "
+"Novembro Dezembro"
+
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Ocultar"
diff --git a/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.mo b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c2c13b5
--- /dev/null
+++ b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.po b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..bc020ec
--- /dev/null
+++ b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/django.po
@@ -0,0 +1,689 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Allisson Azevedo <allisson@gmail.com>, 2014
+# bruno.devpod <bruno.devpod@gmail.com>, 2014
+# dudanogueira <dudanogueira@gmail.com>, 2012
+# Elyézer Rezende <elyezermr@gmail.com>, 2013
+# Fábio C. Barrionuevo da Luz <bnafta@gmail.com>, 2015
+# Gladson <gladsonbrito@gmail.com>, 2013
+# Guilherme Gondim, 2012-2013
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Lucas Infante <maccinza@gmail.com>, 2015
+# Marco Rougeth <marco@rougeth.com>, 2015
+# Sergio Garcia <sergio@ginx.com.br>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-27 19:20+0000\n"
+"Last-Translator: Sergio Garcia <sergio@ginx.com.br>\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/"
+"language/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Removido %(count)d %(items)s com sucesso."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Não é possível excluir %(name)s "
+
+msgid "Are you sure?"
+msgstr "Tem certeza?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Remover %(verbose_name_plural)s selecionados"
+
+msgid "Administration"
+msgstr "Administração"
+
+msgid "All"
+msgstr "Todos"
+
+msgid "Yes"
+msgstr "Sim"
+
+msgid "No"
+msgstr "Não"
+
+msgid "Unknown"
+msgstr "Desconhecido"
+
+msgid "Any date"
+msgstr "Qualquer data"
+
+msgid "Today"
+msgstr "Hoje"
+
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+msgid "This month"
+msgstr "Este mês"
+
+msgid "This year"
+msgstr "Este ano"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Por favor, insira um %(username)s e senha corretos para uma conta de equipe. "
+"Note que ambos campos são sensíveis a maiúsculas e minúsculas."
+
+msgid "Action:"
+msgstr "Ação:"
+
+msgid "action time"
+msgstr "hora da ação"
+
+msgid "user"
+msgstr "usuário"
+
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+msgid "object id"
+msgstr "id do objeto"
+
+msgid "object repr"
+msgstr "repr do objeto"
+
+msgid "action flag"
+msgstr "flag de ação"
+
+msgid "change message"
+msgstr "modificar mensagem"
+
+msgid "log entry"
+msgstr "entrada de log"
+
+msgid "log entries"
+msgstr "entradas de log"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Adicionado \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Modificado \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Removido \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objeto LogEntry"
+
+msgid "None"
+msgstr "Nenhum"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenha pressionado o \"Control\", ou \"Command\" no Mac, para selecionar "
+"mais de uma opção."
+
+msgid "Added."
+msgstr "Adicionado."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado %s."
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Adicionado %(name)s \"%(object)s\""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificado %(list)s para %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Deletado %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nenhum campo modificado."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s adicionado com sucesso. Você pode editar novamente abaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s adicionado com sucesso. Você pode adicionar um outro "
+"%(name)s abaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" foi adicionado com sucesso."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" modificado com sucesso. Você pode editá-lo novamente "
+"abaixo."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" alterado com sucesso. Você pode adicionar um outro "
+"%(name)s abaixo."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" modificado com sucesso."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Os itens devem ser selecionados a fim de executar ações sobre eles. Nenhum "
+"item foi modificado."
+
+msgid "No action selected."
+msgstr "Nenhuma ação selecionada."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\": excluído com sucesso."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objeto %(name)s com chave primária %(key)r não existe."
+
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+msgid "Database error"
+msgstr "Erro no banco de dados"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s modificado com sucesso."
+msgstr[1] "%(count)s %(name)s modificados com sucesso."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selecionado"
+msgstr[1] "Todos %(total_count)s selecionados"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 de %(cnt)s selecionados"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificações: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Excluir o %(class_name)s %(instance)s exigiria excluir os seguintes objetos "
+"protegidos relacionados: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+msgid "Django administration"
+msgstr "Administração do Django"
+
+msgid "Site administration"
+msgstr "Administração do Site"
+
+msgid "Log in"
+msgstr "Acessar"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s administração"
+
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página requisitada não pode ser encontrada."
+
+msgid "Home"
+msgstr "Início"
+
+msgid "Server error"
+msgstr "Erro no servidor"
+
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro no Servidor <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houve um erro, que já foi reportado aos administradores do site por email e "
+"deverá ser consertado em breve. Obrigado pela sua paciência."
+
+msgid "Run the selected action"
+msgstr "Executar ação selecionada"
+
+msgid "Go"
+msgstr "Fazer"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Clique aqui para selecionar os objetos de todas as páginas"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Selecionar todos %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Limpar seleção"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primeiro, informe um nome de usuário e senha. Depois você será capaz de "
+"editar mais opções do usuário."
+
+msgid "Enter a username and password."
+msgstr "Digite um nome de usuário e senha."
+
+msgid "Change password"
+msgstr "Alterar senha"
+
+msgid "Please correct the error below."
+msgstr "Por favor, corrija o erro abaixo."
+
+msgid "Please correct the errors below."
+msgstr "Por favor, corrija os erros abaixo."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Informe uma nova senha para o usuário <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Bem-vindo(a),"
+
+msgid "View site"
+msgstr "Ver o site"
+
+msgid "Documentation"
+msgstr "Documentação"
+
+msgid "Log out"
+msgstr "Encerrar sessão"
+
+msgid "Add"
+msgstr "Adicionar"
+
+msgid "History"
+msgstr "Histórico"
+
+msgid "View on site"
+msgstr "Ver no site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Remove from sorting"
+msgstr "Remover da ordenação"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioridade da ordenação: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Alternar ordenção"
+
+msgid "Delete"
+msgstr "Apagar"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"A remoção de '%(object_name)s' %(escaped_object)s pode resultar na remoção "
+"de objetos relacionados, mas sua conta não tem a permissão para remoção dos "
+"seguintes tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Excluir o %(object_name)s ' %(escaped_object)s ' exigiria excluir os "
+"seguintes objetos protegidos relacionados:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Você tem certeza que quer remover %(object_name)s \"%(escaped_object)s\"? "
+"Todos os seguintes itens relacionados serão removidos:"
+
+msgid "Objects"
+msgstr "Objetos"
+
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho certeza"
+
+msgid "No, take me back"
+msgstr "Não, me leve de volta"
+
+msgid "Delete multiple objects"
+msgstr "Remover múltiplos objetos"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Excluir o %(objects_name)s selecionado pode resultar na remoção de objetos "
+"relacionados, mas sua conta não tem permissão para excluir os seguintes "
+"tipos de objetos:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Excluir o %(objects_name)s selecionado exigiria excluir os seguintes objetos "
+"relacionados protegidos:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Tem certeza de que deseja apagar o %(objects_name)s selecionado? Todos os "
+"seguintes objetos e seus itens relacionados serão removidos:"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Adicionar outro(a) %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Apagar?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Por %(filter_title)s "
+
+msgid "Summary"
+msgstr "Resumo"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modelos na aplicação %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Você não tem permissão para edição."
+
+msgid "Recent Actions"
+msgstr "Ações Recentes"
+
+msgid "My Actions"
+msgstr "Minhas Ações"
+
+msgid "None available"
+msgstr "Nenhum disponível"
+
+msgid "Unknown content"
+msgstr "Conteúdo desconhecido"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Alguma coisa está errada com a instalação do banco de dados. Certifique-se "
+"que as tabelas necessárias foram criadas e que o banco de dados pode ser "
+"acessado pelo usuário apropriado."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Você está autenticado como %(username)s, mas não está autorizado a acessar "
+"esta página. Você gostaria de realizar login com uma conta diferente?"
+
+msgid "Forgotten your password or username?"
+msgstr "Esqueceu sua senha ou nome de usuário?"
+
+msgid "Date/time"
+msgstr "Data/hora"
+
+msgid "User"
+msgstr "Usuário"
+
+msgid "Action"
+msgstr "Ação"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto não tem um histórico de alterações. Ele provavelmente não foi "
+"adicionado por este site de administração."
+
+msgid "Show all"
+msgstr "Mostrar tudo"
+
+msgid "Save"
+msgstr "Salvar"
+
+msgid "Popup closing..."
+msgstr "Fechando popup..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Alterar %(model)s selecionado"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Adicionar outro %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Excluir %(model)s selecionado"
+
+msgid "Search"
+msgstr "Pesquisar"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultado"
+msgstr[1] "%(counter)s resultados"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+msgid "Save as new"
+msgstr "Salvar como novo"
+
+msgid "Save and add another"
+msgstr "Salvar e adicionar outro(a)"
+
+msgid "Save and continue editing"
+msgstr "Salvar e continuar editando"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por visitar nosso Web site hoje."
+
+msgid "Log in again"
+msgstr "Acessar novamente"
+
+msgid "Password change"
+msgstr "Alterar senha"
+
+msgid "Your password was changed."
+msgstr "Sua senha foi alterada."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, informe sua senha antiga, por segurança, e então informe sua nova "
+"senha duas vezes para que possamos verificar se você digitou corretamente."
+
+msgid "Change my password"
+msgstr "Alterar minha senha"
+
+msgid "Password reset"
+msgstr "Recuperar senha"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Sua senha foi definida. Você pode prosseguir e se autenticar agora."
+
+msgid "Password reset confirmation"
+msgstr "Confirmação de recuperação de senha"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor, informe sua nova senha duas vezes para que possamos verificar se "
+"você a digitou corretamente."
+
+msgid "New password:"
+msgstr "Nova senha:"
+
+msgid "Confirm password:"
+msgstr "Confirme a senha:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"O link para a recuperação de senha era inválido, possivelmente porque jã foi "
+"utilizado. Por favor, solicite uma nova recuperação de senha."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Nós te enviamos as instruções para redefinição de sua senha, se existir uma "
+"conta com o e-mail que você forneceu. Você receberá a mensagem em breve."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Se você não receber um e-mail, por favor verifique se você digitou o "
+"endereço que você usou para se registrar, e verificar a sua pasta de spam."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Você está recebendo este email porque solicitou a redefinição da senha da "
+"sua conta em %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Por favor, acesse a seguinte página e escolha uma nova senha:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Seu nome de usuário, caso tenha esquecido:"
+
+msgid "Thanks for using our site!"
+msgstr "Obrigado por usar nosso site!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Equipe %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Esqueceu a senha? Forneça o seu endereço de email abaixo e te enviaremos "
+"instruções para definir uma nova."
+
+msgid "Email address:"
+msgstr "Endereço de email:"
+
+msgid "Reset my password"
+msgstr "Reinicializar minha senha"
+
+msgid "All dates"
+msgstr "Todas as datas"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selecione %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecione %s para modificar"
+
+msgid "Date:"
+msgstr "Data:"
+
+msgid "Time:"
+msgstr "Hora:"
+
+msgid "Lookup"
+msgstr "Olhar"
+
+msgid "Currently:"
+msgstr "Atualmente:"
+
+msgid "Change:"
+msgstr "Alterar:"
diff --git a/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b2be497
--- /dev/null
+++ b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..8ee966a
--- /dev/null
+++ b/tbc/static/admin/locale/pt_BR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,165 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Allisson Azevedo <allisson@gmail.com>, 2014
+# Eduardo Carvalho <eduardocereto@gmail.com>, 2011
+# Guilherme Gondim, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Lucas Infante <maccinza@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-27 17:27+0000\n"
+"Last-Translator: Lucas Infante <maccinza@gmail.com>\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/"
+"language/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponíveis"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Esta é a lista de %s disponíveis. Você pode escolhê-los(as) selecionando-"
+"os(as) abaixo e clicando na seta \"Escolher\" entre as duas caixas."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Digite nessa caixa para filtrar a lista de %s disponíveis."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Clique para escolher todos os %s de uma só vez"
+
+msgid "Choose"
+msgstr "Escolher"
+
+msgid "Remove"
+msgstr "Remover"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s escolhido(s)"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Esta é a lista de %s disponíveis. Você pode removê-los(as) selecionando-"
+"os(as) abaixo e clicando na seta \"Remover\" entre as duas caixas."
+
+msgid "Remove all"
+msgstr "Remover todos"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Clique para remover de uma só vez todos os %s escolhidos."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s de %(cnt)s selecionado"
+msgstr[1] "%(sel)s de %(cnt)s selecionados"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Você tem alterações não salvas em campos editáveis individuais. Se você "
+"executar uma ação suas alterações não salvas serão perdidas."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Você selecionou uma ação, mas você não salvou as alterações de cada campo "
+"ainda. Clique em OK para salvar. Você vai precisar executar novamente a ação."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Você selecionou uma ação, e você não fez alterações em campos individuais. "
+"Você provavelmente está procurando o botão Ir ao invés do botão \"Salvar\"."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Nota: Você está %s hora à frente do horário do servidor."
+msgstr[1] "Nota: Você está %s horas à frente do horário do servidor."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Nota: Você está %s hora atrás do tempo do servidor."
+msgstr[1] "Nota: Você está %s horas atrás do tempo do servidor."
+
+msgid "Now"
+msgstr "Agora"
+
+msgid "Choose a Time"
+msgstr "Escolha um Horário"
+
+msgid "Choose a time"
+msgstr "Escolha uma hora"
+
+msgid "Midnight"
+msgstr "Meia-noite"
+
+msgid "6 a.m."
+msgstr "6 da manhã"
+
+msgid "Noon"
+msgstr "Meio-dia"
+
+msgid "6 p.m."
+msgstr "6 da tarde"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Today"
+msgstr "Hoje"
+
+msgid "Choose a Date"
+msgstr "Escolha uma Data"
+
+msgid "Yesterday"
+msgstr "Ontem"
+
+msgid "Tomorrow"
+msgstr "Amanhã"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro "
+"Novembro Dezembro"
+
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Hide"
+msgstr "Esconder"
diff --git a/tbc/static/admin/locale/ro/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ro/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..aceaead
--- /dev/null
+++ b/tbc/static/admin/locale/ro/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ro/LC_MESSAGES/django.po b/tbc/static/admin/locale/ro/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4aca578
--- /dev/null
+++ b/tbc/static/admin/locale/ro/LC_MESSAGES/django.po
@@ -0,0 +1,678 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Daniel Ursache-Dogariu <contact@danniel.net>, 2011
+# Denis Darii <denis.darii@gmail.com>, 2011,2014
+# Ionel Cristian Mărieș <ionel.mc@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Razvan Stefanescu <razvan.stefanescu@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-27 12:24+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Romanian (http://www.transifex.com/django/django/language/"
+"ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
+"2:1));\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s eliminate cu succes."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nu se poate șterge %(name)s"
+
+msgid "Are you sure?"
+msgstr "Sigur?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Elimină %(verbose_name_plural)s selectate"
+
+msgid "Administration"
+msgstr "Administrare"
+
+msgid "All"
+msgstr "Toate"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Nu"
+
+msgid "Unknown"
+msgstr "Necunoscut"
+
+msgid "Any date"
+msgstr "Orice dată"
+
+msgid "Today"
+msgstr "Astăzi"
+
+msgid "Past 7 days"
+msgstr "Ultimele 7 zile"
+
+msgid "This month"
+msgstr "Luna aceasta"
+
+msgid "This year"
+msgstr "Anul acesta"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Acțiune:"
+
+msgid "action time"
+msgstr "timp acțiune"
+
+msgid "user"
+msgstr "utilizator"
+
+msgid "content type"
+msgstr "tip de conținut"
+
+msgid "object id"
+msgstr "id obiect"
+
+msgid "object repr"
+msgstr "repr obiect"
+
+msgid "action flag"
+msgstr "marcaj acțiune"
+
+msgid "change message"
+msgstr "schimbă mesaj"
+
+msgid "log entry"
+msgstr "intrare jurnal"
+
+msgid "log entries"
+msgstr "intrări jurnal"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "S-au adăugat \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "S-au schimbat \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "S-au șters \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Obiect LogEntry"
+
+msgid "None"
+msgstr "Nimic"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Ține apăsat \"Control\", sau \"Command\" pe un Mac, pentru a selecta mai "
+"mult de unul."
+
+msgid "Added."
+msgstr "Adăugat."
+
+#, python-format
+msgid "Changed %s."
+msgstr "S-a schimbat %s."
+
+msgid "and"
+msgstr "și"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "S-a adăugat %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "S-a schimbat %(list)s în %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "S-a șters %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Niciun câmp modificat."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" a fost adăugat(ă) cu succes. Puteți edita din nou mai "
+"jos."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" a fost adăugat cu succes. Poți adăuga alt %(name)s mai "
+"jos."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" a fost adăugat cu succes."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" a fost modificat cu succes. Il poți edita mai jos."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" a fost modificat cu succes. Poți adăuga un alt %(name)s "
+"mai jos."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" a fost modificat(ă) cu succes."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Itemii trebuie selectați pentru a putea îndeplini sarcini asupra lor. Niciun "
+"item nu a fost modificat."
+
+msgid "No action selected."
+msgstr "Nicio acțiune selectată."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" eliminat(ă) cu succes."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Obiectul %(name)s ce are cheie primară %(key)r nu există."
+
+#, python-format
+msgid "Add %s"
+msgstr "Adaugă %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Schimbă %s"
+
+msgid "Database error"
+msgstr "Eroare de bază de date"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s s-a modificat cu succes."
+msgstr[1] "%(count)s %(name)s s-au modificat cu succes."
+msgstr[2] "%(count)s de %(name)s s-au modificat cu succes."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s selectat(ă)"
+msgstr[1] "Toate %(total_count)s selectate"
+msgstr[2] "Toate %(total_count)s selectate"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 din %(cnt)s selectat"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Istoric schimbări: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Ștergerea %(class_name)s %(instance)s ar necesita ștergerea următoarelor "
+"obiecte asociate protejate: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Administrare site Django"
+
+msgid "Django administration"
+msgstr "Administrare Django"
+
+msgid "Site administration"
+msgstr "Administrare site"
+
+msgid "Log in"
+msgstr "Autentificare"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "administrare %(app)s"
+
+msgid "Page not found"
+msgstr "Pagină inexistentă"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ne pare rău, dar pagina solicitată nu a putut fi găsită."
+
+msgid "Home"
+msgstr "Acasă"
+
+msgid "Server error"
+msgstr "Eroare de server"
+
+msgid "Server error (500)"
+msgstr "Eroare de server (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Eroare server <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"A apărut o eroare. A fost raportată către administratorii site-ului prin "
+"email și ar trebui să fie reparată în scurt timp. Mulțumesc pentru răbdare."
+
+msgid "Run the selected action"
+msgstr "Pornește acțiunea selectată"
+
+msgid "Go"
+msgstr "Start"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Clic aici pentru a selecta obiectele la nivelul tuturor paginilor"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Selectați toate %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Deselectați"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Introduceți mai întâi un nume de utilizator și o parolă. Apoi veți putea "
+"modifica mai multe opțiuni ale utilizatorului."
+
+msgid "Enter a username and password."
+msgstr "Introduceți un nume de utilizator și o parolă."
+
+msgid "Change password"
+msgstr "Schimbă parola"
+
+msgid "Please correct the error below."
+msgstr "Corectați erorile de mai jos"
+
+msgid "Please correct the errors below."
+msgstr "Corectați erorile de mai jos."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduceți o parolă nouă pentru utilizatorul <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Bun venit,"
+
+msgid "View site"
+msgstr "Vizualizare site"
+
+msgid "Documentation"
+msgstr "Documentație"
+
+msgid "Log out"
+msgstr "Deautentificare"
+
+msgid "Add"
+msgstr "Adaugă"
+
+msgid "History"
+msgstr "Istoric"
+
+msgid "View on site"
+msgstr "Vizualizează pe site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adaugă %(name)s"
+
+msgid "Filter"
+msgstr "Filtru"
+
+msgid "Remove from sorting"
+msgstr "Elimină din sortare"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritate sortare: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Alternează sortarea"
+
+msgid "Delete"
+msgstr "Șterge"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Ștergerea %(object_name)s '%(escaped_object)s' va duce și la ștergerea "
+"obiectelor asociate, însă contul dumneavoastră nu are permisiunea de a "
+"șterge următoarele tipuri de obiecte:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Ștergerea %(object_name)s '%(escaped_object)s' ar putea necesita și "
+"ștergerea următoarelor obiecte protejate asociate:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sigur doriți ștergerea %(object_name)s \"%(escaped_object)s\"? Următoarele "
+"itemuri asociate vor fi șterse:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Da, cu siguranță"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Ștergeți obiecte multiple"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Ștergerea %(objects_name)s conform selecției ar putea duce la ștergerea "
+"obiectelor asociate, însă contul dvs. de utilizator nu are permisiunea de a "
+"șterge următoarele tipuri de obiecte:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Ştergerea %(objects_name)s conform selecției ar necesita și ștergerea "
+"următoarelor obiecte protejate asociate:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Sigur doriţi să ștergeți %(objects_name)s conform selecției? Toate obiectele "
+"următoare alături de cele asociate lor vor fi șterse:"
+
+msgid "Change"
+msgstr "Schimbă"
+
+msgid "Remove"
+msgstr "Elimină"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Adăugati încă un/o %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Elimină?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "După %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Nu nicio permisiune de editare."
+
+msgid "Recent Actions"
+msgstr "Acțiuni recente"
+
+msgid "My Actions"
+msgstr "Acțiunile mele"
+
+msgid "None available"
+msgstr "Niciuna"
+
+msgid "Unknown content"
+msgstr "Conținut necunoscut"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Există o problema cu baza de date. Verificați dacă tabelele necesare din "
+"baza de date au fost create și verificați dacă baza de date poate fi citită "
+"de utilizatorul potrivit."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Ați uitat parola sau utilizatorul ?"
+
+msgid "Date/time"
+msgstr "Dată/oră"
+
+msgid "User"
+msgstr "Utilizator"
+
+msgid "Action"
+msgstr "Acțiune"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Acest obiect nu are un istoric al schimbărilor. Probabil nu a fost adăugat "
+"prin intermediul acestui sit de administrare."
+
+msgid "Show all"
+msgstr "Arată totul"
+
+msgid "Save"
+msgstr "Salvează"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Caută"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s rezultat"
+msgstr[1] "%(counter)s rezultate"
+msgstr[2] "%(counter)s de rezultate"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s în total"
+
+msgid "Save as new"
+msgstr "Salvați ca nou"
+
+msgid "Save and add another"
+msgstr "Salvați și mai adăugați"
+
+msgid "Save and continue editing"
+msgstr "Salvați și continuați editarea"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Mulţumiri pentru timpul petrecut astăzi pe sit."
+
+msgid "Log in again"
+msgstr "Reautentificare"
+
+msgid "Password change"
+msgstr "Schimbare parolă"
+
+msgid "Your password was changed."
+msgstr "Parola a fost schimbată."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Din motive de securitate, introduceți parola veche, apoi de două ori parola "
+"nouă, pentru a putea verifica dacă ați scris-o corect. "
+
+msgid "Change my password"
+msgstr "Schimbă-mi parola"
+
+msgid "Password reset"
+msgstr "Resetare parolă"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Parola dumneavoastră a fost stabilită. Acum puteți continua să vă "
+"autentificați."
+
+msgid "Password reset confirmation"
+msgstr "Confirmare resetare parolă"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Introduceți parola de două ori, pentru a putea verifica dacă ați scris-o "
+"corect."
+
+msgid "New password:"
+msgstr "Parolă nouă:"
+
+msgid "Confirm password:"
+msgstr "Confirmare parolă:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Link-ul de resetare a parolei a fost nevalid, probabil din cauză că acesta a "
+"fost deja utilizat. Solicitați o nouă resetare a parolei."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Mergeți la următoarea pagină și alegeți o parolă nouă:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Numele de utilizator, în caz că l-ați uitat:"
+
+msgid "Thanks for using our site!"
+msgstr "Mulțumiri pentru utilizarea sitului nostru!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Echipa %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr "Adresă e-mail:"
+
+msgid "Reset my password"
+msgstr "Resetează-mi parola"
+
+msgid "All dates"
+msgstr "Toate datele"
+
+#, python-format
+msgid "Select %s"
+msgstr "Selectează %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Selectează %s pentru schimbare"
+
+msgid "Date:"
+msgstr "Dată:"
+
+msgid "Time:"
+msgstr "Oră:"
+
+msgid "Lookup"
+msgstr "Căutare"
+
+msgid "Currently:"
+msgstr "În prezent:"
+
+msgid "Change:"
+msgstr "Schimbă:"
diff --git a/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ebd91d5
--- /dev/null
+++ b/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f31849e
--- /dev/null
+++ b/tbc/static/admin/locale/ro/LC_MESSAGES/djangojs.po
@@ -0,0 +1,172 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Daniel Ursache-Dogariu <contact@danniel.net>, 2011
+# Denis Darii <denis.darii@gmail.com>, 2011
+# Ionel Cristian Mărieș <ionel.mc@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Răzvan Ionescu <ionescu77@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-27 12:13+0000\n"
+"Last-Translator: Răzvan Ionescu <ionescu77@gmail.com>\n"
+"Language-Team: Romanian (http://www.transifex.com/django/django/language/"
+"ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
+"2:1));\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s disponibil"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Aceasta este o listă cu %s disponibile. Le puteți alege selectând mai multe "
+"in chenarul de mai jos și apăsând pe săgeata \"Alege\" dintre cele două "
+"chenare."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Scrie în acest chenar pentru a filtra lista de %s disponibile."
+
+msgid "Filter"
+msgstr "Filtru"
+
+msgid "Choose all"
+msgstr "Alege toate"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Click pentru a alege toate %s."
+
+msgid "Choose"
+msgstr "Alege"
+
+msgid "Remove"
+msgstr "Elimină"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s alese"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Aceasta este lista de %s alese. Puteți elimina din ele selectându-le in "
+"chenarul de mai jos și apasand pe săgeata \"Elimină\" dintre cele două "
+"chenare."
+
+msgid "Remove all"
+msgstr "Elimină toate"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Click pentru a elimina toate %s alese."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s din %(cnt)s selectate"
+msgstr[1] "%(sel)s din %(cnt)s selectate"
+msgstr[2] "de %(sel)s din %(cnt)s selectate"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Aveţi modificări nesalvate în cîmpuri individuale editabile. Dacă executaţi "
+"o acțiune, modificările nesalvate vor fi pierdute."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Aţi selectat o acţiune, dar nu aţi salvat încă modificările la câmpuri "
+"individuale. Faceţi clic pe OK pentru a salva. Va trebui să executați "
+"acțiunea din nou."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ați selectat o acţiune și nu ațţi făcut modificări în cîmpuri individuale. "
+"Probabil căutați butonul Go, în loc de Salvează."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr "Acum"
+
+msgid "Choose a Time"
+msgstr "Alege o oră"
+
+msgid "Choose a time"
+msgstr "Alege o oră"
+
+msgid "Midnight"
+msgstr "Miezul nopții"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Amiază"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Anulează"
+
+msgid "Today"
+msgstr "Astăzi"
+
+msgid "Choose a Date"
+msgstr "Alege a dată"
+
+msgid "Yesterday"
+msgstr "Ieri"
+
+msgid "Tomorrow"
+msgstr "Mâine"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ianuarie Februare Martie Aprilie Mai Iunie Iulie August Septembrie Octombrie "
+"Noiembrie Decembrie"
+
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+msgid "Show"
+msgstr "Arată"
+
+msgid "Hide"
+msgstr "Ascunde"
diff --git a/tbc/static/admin/locale/ru/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d89b356
--- /dev/null
+++ b/tbc/static/admin/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ru/LC_MESSAGES/django.po b/tbc/static/admin/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000..61a465b
--- /dev/null
+++ b/tbc/static/admin/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,691 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ivan Ivaschenko <defuz.net@gmail.com>, 2013
+# Denis Darii <denis.darii@gmail.com>, 2011
+# Dimmus <dmitri.chudinov@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Алексей Борискин <sun.void@gmail.com>, 2012-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-26 10:17+0000\n"
+"Last-Translator: Алексей Борискин <sun.void@gmail.com>\n"
+"Language-Team: Russian (http://www.transifex.com/django/django/language/"
+"ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Успешно удалены %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Не удается удалить %(name)s"
+
+msgid "Are you sure?"
+msgstr "Вы уверены?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Удалить выбранные %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Администрирование"
+
+msgid "All"
+msgstr "Все"
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Нет"
+
+msgid "Unknown"
+msgstr "Неизвестно"
+
+msgid "Any date"
+msgstr "Любая дата"
+
+msgid "Today"
+msgstr "Сегодня"
+
+msgid "Past 7 days"
+msgstr "Последние 7 дней"
+
+msgid "This month"
+msgstr "Этот месяц"
+
+msgid "This year"
+msgstr "Этот год"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Пожалуйста, введите корректные %(username)s и пароль учётной записи. Оба "
+"поля могут быть чувствительны к регистру."
+
+msgid "Action:"
+msgstr "Действие:"
+
+msgid "action time"
+msgstr "время действия"
+
+msgid "user"
+msgstr "пользователь"
+
+msgid "content type"
+msgstr "тип содержимого"
+
+msgid "object id"
+msgstr "идентификатор объекта"
+
+msgid "object repr"
+msgstr "представление объекта"
+
+msgid "action flag"
+msgstr "тип действия"
+
+msgid "change message"
+msgstr "сообщение об изменении"
+
+msgid "log entry"
+msgstr "запись в журнале"
+
+msgid "log entries"
+msgstr "записи в журнале"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Добавлено \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Изменено \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Удалено \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Запись в журнале"
+
+msgid "None"
+msgstr "Нет"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Удерживайте \"Control\" (или \"Command\" на Mac), чтобы выбрать несколько "
+"значений."
+
+msgid "Added."
+msgstr "Добавлено."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Изменен %s."
+
+msgid "and"
+msgstr "и"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Добавлен %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Изменены %(list)s для %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Удален %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Ни одно поле не изменено."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" был успешно добавлен. Ниже вы можете снова его "
+"отредактировать."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" успешно добавлен. Ниже вы можете добавить еще %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно добавлен."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" успешно изменен. Ниже вы можете редактировать снова."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" успешно изменен. Ниже вы можете добавить еще %(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно изменен."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Чтобы произвести действия над объектами, необходимо их выбрать. Объекты не "
+"были изменены."
+
+msgid "No action selected."
+msgstr "Действие не выбрано."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно удален."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s с первичным ключом %(key)r не существует."
+
+#, python-format
+msgid "Add %s"
+msgstr "Добавить %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Изменить %s"
+
+msgid "Database error"
+msgstr "Ошибка базы данных"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s был успешно изменен."
+msgstr[1] "%(count)s %(name)s были успешно изменены."
+msgstr[2] "%(count)s %(name)s были успешно изменены."
+msgstr[3] "%(count)s %(name)s были успешно изменены."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Выбран %(total_count)s"
+msgstr[1] "Выбраны все %(total_count)s"
+msgstr[2] "Выбраны все %(total_count)s"
+msgstr[3] "Выбраны все %(total_count)s"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Выбрано 0 объектов из %(cnt)s "
+
+#, python-format
+msgid "Change history: %s"
+msgstr "История изменений: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Удаление объекта %(instance)s типа %(class_name)s будет требовать удаления "
+"следующих связанных объектов: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Административный сайт Django"
+
+msgid "Django administration"
+msgstr "Администрирование Django"
+
+msgid "Site administration"
+msgstr "Администрирование сайта"
+
+msgid "Log in"
+msgstr "Войти"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Администрирование приложения «%(app)s»"
+
+msgid "Page not found"
+msgstr "Страница не найдена"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "К сожалению, запрашиваемая вами страница не найдена."
+
+msgid "Home"
+msgstr "Начало"
+
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+msgid "Server error (500)"
+msgstr "Ошибка сервера (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Ошибка сервера <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Произошла ошибка. О ней сообщено администраторам сайта по электронной почте, "
+"ошибка должна быть вскоре исправлена. Благодарим вас за терпение."
+
+msgid "Run the selected action"
+msgstr "Выполнить выбранное действие"
+
+msgid "Go"
+msgstr "Выполнить"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Выбрать все %(module_name)s (%(total_count)s)"
+
+msgid "Clear selection"
+msgstr "Снять выделение"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Сначала введите имя пользователя и пароль. Затем вы сможете ввести больше "
+"информации о пользователе."
+
+msgid "Enter a username and password."
+msgstr "Введите имя пользователя и пароль."
+
+msgid "Change password"
+msgstr "Изменить пароль"
+
+msgid "Please correct the error below."
+msgstr "Пожалуйста, исправьте ошибки ниже."
+
+msgid "Please correct the errors below."
+msgstr "Пожалуйста, исправьте ошибки ниже."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Введите новый пароль для пользователя <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Добро пожаловать,"
+
+msgid "View site"
+msgstr "Открыть сайт"
+
+msgid "Documentation"
+msgstr "Документация"
+
+msgid "Log out"
+msgstr "Выйти"
+
+msgid "Add"
+msgstr "Добавить"
+
+msgid "History"
+msgstr "История"
+
+msgid "View on site"
+msgstr "Смотреть на сайте"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добавить %(name)s"
+
+msgid "Filter"
+msgstr "Фильтр"
+
+msgid "Remove from sorting"
+msgstr "Удалить из сортировки"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Приоритет сортировки: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Сортировать в другом направлении"
+
+msgid "Delete"
+msgstr "Удалить"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Удаление %(object_name)s '%(escaped_object)s' приведет к удалению связанных "
+"объектов, но ваша учетная запись не имеет прав для удаления следующих типов "
+"объектов:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Удаление %(object_name)s '%(escaped_object)s' потребует удаления следующих "
+"связанных защищенных объектов:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Вы уверены, что хотите удалить %(object_name)s \"%(escaped_object)s\"? Все "
+"следующие связанные объекты также будут удалены:"
+
+msgid "Objects"
+msgstr "Объекты"
+
+msgid "Yes, I'm sure"
+msgstr "Да, я уверен"
+
+msgid "No, take me back"
+msgstr "Нет, отменить и вернуться к выбору"
+
+msgid "Delete multiple objects"
+msgstr "Удалить несколько объектов"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Удаление выбранной %(objects_name)s приведет к удалению связанных объектов, "
+"но ваша учетная запись не имеет прав на удаление следующих типов объектов:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Удаление %(objects_name)s потребует удаления следующих связанных защищенных "
+"объектов:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Вы уверены, что хотите удалить %(objects_name)s? Все следующие объекты и "
+"связанные с ними элементы будут удалены:"
+
+msgid "Change"
+msgstr "Изменить"
+
+msgid "Remove"
+msgstr "Удалить"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Добавить еще один %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Удалить?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s"
+
+msgid "Summary"
+msgstr "Краткая статистика"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Модели в приложении %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "У вас недостаточно прав для редактирования."
+
+msgid "Recent Actions"
+msgstr "Последние действия"
+
+msgid "My Actions"
+msgstr "Мои действия"
+
+msgid "None available"
+msgstr "Недоступно"
+
+msgid "Unknown content"
+msgstr "Неизвестный тип"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Ваша база данных неправильно настроена. Убедитесь, что соответствующие "
+"таблицы были созданы, и что соответствующему пользователю разрешен к ним "
+"доступ."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Вы вошли в систему как %(username)s, однако у вас недостаточно прав для "
+"просмотра данной страницы. Возможно, вы хотели бы войти в систему, используя "
+"другую учётную запись?"
+
+msgid "Forgotten your password or username?"
+msgstr "Забыли свой пароль или имя пользователя?"
+
+msgid "Date/time"
+msgstr "Дата и время"
+
+msgid "User"
+msgstr "Пользователь"
+
+msgid "Action"
+msgstr "Действие"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Данный объект не имеет истории изменений. Возможно, он был добавлен не через "
+"данный административный сайт."
+
+msgid "Show all"
+msgstr "Показать все"
+
+msgid "Save"
+msgstr "Сохранить"
+
+msgid "Popup closing..."
+msgstr "Всплывающее окно закрывается..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Изменить выбранный объект типа \"%(model)s\""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Добавить ещё один объект типа \"%(model)s\""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Удалить выбранный объект типа \"%(model)s\""
+
+msgid "Search"
+msgstr "Найти"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s результат"
+msgstr[1] "%(counter)s результата"
+msgstr[2] "%(counter)s результатов"
+msgstr[3] "%(counter)s результатов"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s всего"
+
+msgid "Save as new"
+msgstr "Сохранить как новый объект"
+
+msgid "Save and add another"
+msgstr "Сохранить и добавить другой объект"
+
+msgid "Save and continue editing"
+msgstr "Сохранить и продолжить редактирование"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим вас за время, проведенное на этом сайте."
+
+msgid "Log in again"
+msgstr "Войти снова"
+
+msgid "Password change"
+msgstr "Изменение пароля"
+
+msgid "Your password was changed."
+msgstr "Ваш пароль был изменен."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"В целях безопасности, пожалуйста, введите свой старый пароль, затем введите "
+"новый пароль дважды, чтобы мы могли убедиться в правильности написания."
+
+msgid "Change my password"
+msgstr "Изменить мой пароль"
+
+msgid "Password reset"
+msgstr "Восстановление пароля"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Ваш пароль был сохранен. Теперь вы можете войти."
+
+msgid "Password reset confirmation"
+msgstr "Подтверждение восстановления пароля"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Пожалуйста, введите новый пароль дважды, чтобы мы могли убедиться в "
+"правильности написания."
+
+msgid "New password:"
+msgstr "Новый пароль:"
+
+msgid "Confirm password:"
+msgstr "Подтвердите пароль:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Неверная ссылка для восстановления пароля. Возможно, ей уже воспользовались. "
+"Пожалуйста, попробуйте восстановить пароль еще раз."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Мы отправили вам инструкцию по установке нового пароля на указанный адрес "
+"электронной почты (если в нашей базе данных есть такой адрес). Вы должны "
+"получить ее в ближайшее время."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Если вы не получили письмо, пожалуйста, убедитесь, что вы ввели адрес с "
+"которым Вы зарегистрировались, и проверьте папку со спамом."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Вы получили это письмо, потому что вы (или кто-то другой) запросили "
+"восстановление пароля от учётной записи на сайте %(site_name)s, которая "
+"связана с этим адресом электронной почты."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Ваше имя пользователя (на случай, если вы его забыли):"
+
+msgid "Thanks for using our site!"
+msgstr "Спасибо, что используете наш сайт!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Команда сайта %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Забыли пароль? Введите свой адрес электронной почты ниже, и мы вышлем вам "
+"инструкцию, как установить новый пароль."
+
+msgid "Email address:"
+msgstr "Адрес электронной почты:"
+
+msgid "Reset my password"
+msgstr "Восстановить мой пароль"
+
+msgid "All dates"
+msgstr "Все даты"
+
+#, python-format
+msgid "Select %s"
+msgstr "Выберите %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Выберите %s для изменения"
+
+msgid "Date:"
+msgstr "Дата:"
+
+msgid "Time:"
+msgstr "Время:"
+
+msgid "Lookup"
+msgstr "Поиск"
+
+msgid "Currently:"
+msgstr "Сейчас:"
+
+msgid "Change:"
+msgstr "Изменить:"
diff --git a/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0e4ad97
--- /dev/null
+++ b/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..7cd2251
--- /dev/null
+++ b/tbc/static/admin/locale/ru/LC_MESSAGES/djangojs.po
@@ -0,0 +1,180 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Denis Darii <denis.darii@gmail.com>, 2011
+# Dimmus <dmitri.chudinov@gmail.com>, 2011
+# Eugene MechanisM <contact@mechanism.name>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Алексей Борискин <sun.void@gmail.com>, 2012,2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-22 13:33+0000\n"
+"Last-Translator: Алексей Борискин <sun.void@gmail.com>\n"
+"Language-Team: Russian (http://www.transifex.com/django/django/language/"
+"ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Доступные %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Это список всех доступных %s. Вы можете выбрать некоторые из них, выделив их "
+"в поле ниже и кликнув \"Выбрать\", либо двойным щелчком."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Начните вводить текст в этом поле, чтобы отфитровать список доступных %s."
+
+msgid "Filter"
+msgstr "Фильтр"
+
+msgid "Choose all"
+msgstr "Выбрать все"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Нажмите, чтобы выбрать все %s сразу."
+
+msgid "Choose"
+msgstr "Выбрать"
+
+msgid "Remove"
+msgstr "Удалить"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Выбранные %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Это список выбранных %s. Вы можете удалить некоторые из них, выделив их в "
+"поле ниже и кликнув \"Удалить\", либо двойным щелчком."
+
+msgid "Remove all"
+msgstr "Удалить все"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Нажмите чтобы удалить все %s сразу."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Выбран %(sel)s из %(cnt)s"
+msgstr[1] "Выбрано %(sel)s из %(cnt)s"
+msgstr[2] "Выбрано %(sel)s из %(cnt)s"
+msgstr[3] "Выбрано %(sel)s из %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Имеются несохраненные изменения в отдельных полях для редактирования. Если "
+"вы запустите действие, несохраненные изменения будут потеряны."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Вы выбрали действие, но еще не сохранили изменения, внесенные в некоторых "
+"полях для редактирования. Нажмите OK, чтобы сохранить изменения. После "
+"сохранения вам придется запустить действие еще раз."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Вы выбрали действие и не внесли изменений в данные. Возможно, вы хотели "
+"воспользоваться кнопкой \"Выполнить\", а не кнопкой \"Сохранить\". Если это "
+"так, то нажмите \"Отмена\", чтобы вернуться в интерфейс редактирования. "
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Внимание: Ваше локальное время опережает время сервера на %s час."
+msgstr[1] "Внимание: Ваше локальное время опережает время сервера на %s часа."
+msgstr[2] "Внимание: Ваше локальное время опережает время сервера на %s часов."
+msgstr[3] "Внимание: Ваше локальное время опережает время сервера на %s часов."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Внимание: Ваше локальное время отстаёт от времени сервера на %s час."
+msgstr[1] ""
+"Внимание: Ваше локальное время отстаёт от времени сервера на %s часа."
+msgstr[2] ""
+"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов."
+msgstr[3] ""
+"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов."
+
+msgid "Now"
+msgstr "Сейчас"
+
+msgid "Choose a Time"
+msgstr "Выберите время"
+
+msgid "Choose a time"
+msgstr "Выберите время"
+
+msgid "Midnight"
+msgstr "Полночь"
+
+msgid "6 a.m."
+msgstr "6 утра"
+
+msgid "Noon"
+msgstr "Полдень"
+
+msgid "6 p.m."
+msgstr "6 вечера"
+
+msgid "Cancel"
+msgstr "Отмена"
+
+msgid "Today"
+msgstr "Сегодня"
+
+msgid "Choose a Date"
+msgstr "Выберите дату"
+
+msgid "Yesterday"
+msgstr "Вчера"
+
+msgid "Tomorrow"
+msgstr "Завтра"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь "
+"Декабрь"
+
+msgid "S M T W T F S"
+msgstr "В П В С Ч П С"
+
+msgid "Show"
+msgstr "Показать"
+
+msgid "Hide"
+msgstr "Скрыть"
diff --git a/tbc/static/admin/locale/sk/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..603334a
--- /dev/null
+++ b/tbc/static/admin/locale/sk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sk/LC_MESSAGES/django.po b/tbc/static/admin/locale/sk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..83f7c89
--- /dev/null
+++ b/tbc/static/admin/locale/sk/LC_MESSAGES/django.po
@@ -0,0 +1,679 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Juraj Bubniak <translations@jbub.eu>, 2012-2013
+# Marian Andre <marian@andre.sk>, 2013-2015
+# Martin Kosír, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Slovak (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Úspešne zmazaných %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nedá sa vymazať %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ste si istý?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Zmazať označené %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Správa"
+
+msgid "All"
+msgstr "Všetko"
+
+msgid "Yes"
+msgstr "Áno"
+
+msgid "No"
+msgstr "Nie"
+
+msgid "Unknown"
+msgstr "Neznámy"
+
+msgid "Any date"
+msgstr "Ľubovoľný dátum"
+
+msgid "Today"
+msgstr "Dnes"
+
+msgid "Past 7 days"
+msgstr "Posledných 7 dní"
+
+msgid "This month"
+msgstr "Tento mesiac"
+
+msgid "This year"
+msgstr "Tento rok"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Zadajte prosím správne %(username)s a heslo pre účet personálu - \"staff "
+"account\". Obe polia môžu obsahovať veľké a malé písmená."
+
+msgid "Action:"
+msgstr "Akcia:"
+
+msgid "action time"
+msgstr "čas akcie"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "identifikátor objektu"
+
+msgid "object repr"
+msgstr "reprezentácia objektu"
+
+msgid "action flag"
+msgstr "príznak akcie"
+
+msgid "change message"
+msgstr "zmeniť správu"
+
+msgid "log entry"
+msgstr "položka záznamu"
+
+msgid "log entries"
+msgstr "položky záznamu"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Pridané \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Zmenené \" %(object)s \" - %(changes)s "
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Odstránené \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objekt LogEntry"
+
+msgid "None"
+msgstr "Žiadne"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Zmenené %s."
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Pridaný %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Zmenený %(list)s pre %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Zmazaný %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Polia nezmenené."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Objekt %(name)s \"%(obj)s\" bol úspešne pridaný. Ďalšie zmeny môžete urobiť "
+"nižšie."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" bol úspešne pridaný. Môžete pridať ďaľší %(name)s "
+"nižšie."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne pridaný."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" bol úspešne zmenený. Môžete ho znovu upraviť nižšie."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" bol úspešne zmenený. Môžete pridať ďaľšie %(name)s "
+"nižšie."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne zmenený."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Položky musia byť vybrané, ak chcete na nich vykonať akcie. Neboli vybrané "
+"žiadne položky."
+
+msgid "No action selected."
+msgstr "Nebola vybraná žiadna akcia."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objekt %(name)s s primárnym kľúčom %(key)r neexistuje."
+
+#, python-format
+msgid "Add %s"
+msgstr "Pridať %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Zmeniť %s"
+
+msgid "Database error"
+msgstr "Chyba databázy"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s bola úspešne zmenená."
+msgstr[1] "%(count)s %(name)s boli úspešne zmenené."
+msgstr[2] "%(count)s %(name)s bolo úspešne zmenených."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s vybraná"
+msgstr[1] "Všetky %(total_count)s vybrané"
+msgstr[2] "Všetkých %(total_count)s vybraných"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 z %(cnt)s vybraných"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Zoznam zmien: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Vymazanie %(class_name)s %(instance)s vyžaduje vymazanie nasledovných "
+"súvisiacich chránených objektov: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Správa Django stránky"
+
+msgid "Django administration"
+msgstr "Správa Django"
+
+msgid "Site administration"
+msgstr "Správa stránky"
+
+msgid "Log in"
+msgstr "Prihlásenie"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s správa"
+
+msgid "Page not found"
+msgstr "Stránka nenájdená"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ľutujeme, ale požadovanú stránku nie je možné nájsť."
+
+msgid "Home"
+msgstr "Domov"
+
+msgid "Server error"
+msgstr "Chyba servera"
+
+msgid "Server error (500)"
+msgstr "Chyba servera (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba servera <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Došlo k chybe. Chyba bola nahlásená správcovi webu prostredníctvom e-mailu a "
+"zanedlho by mala byť odstránená. Ďakujeme za vašu trpezlivosť."
+
+msgid "Run the selected action"
+msgstr "Vykonať vybranú akciu"
+
+msgid "Go"
+msgstr "Vykonať"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliknite sem pre výber objektov na všetkých stránkach"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Vybrať všetkých %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Zrušiť výber"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Najskôr zadajte používateľské meno a heslo. Potom budete môcť upraviť viac "
+"používateľských nastavení."
+
+msgid "Enter a username and password."
+msgstr "Zadajte používateľské meno a heslo."
+
+msgid "Change password"
+msgstr "Zmeniť heslo"
+
+msgid "Please correct the error below."
+msgstr "Prosím, opravte chyby uvedené nižšie."
+
+msgid "Please correct the errors below."
+msgstr "Prosím, opravte chyby uvedené nižšie."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Zadajte nové heslo pre používateľa <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Vitajte,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentácia"
+
+msgid "Log out"
+msgstr "Odhlásiť"
+
+msgid "Add"
+msgstr "Pridať"
+
+msgid "History"
+msgstr "Zmeny"
+
+msgid "View on site"
+msgstr "Pozrieť na stránke"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pridať %(name)s"
+
+msgid "Filter"
+msgstr "Filtrovať"
+
+msgid "Remove from sorting"
+msgstr "Odstrániť z triedenia"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Triedenie priority: %(priority_number)s "
+
+msgid "Toggle sorting"
+msgstr "Prepnúť triedenie"
+
+msgid "Delete"
+msgstr "Odstrániť"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Odstránenie objektu %(object_name)s '%(escaped_object)s' by malo za následok "
+"aj odstránenie súvisiacich objektov. Váš účet však nemá oprávnenie na "
+"odstránenie nasledujúcich typov objektov:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Vymazanie %(object_name)s '%(escaped_object)s' vyžaduje vymazanie "
+"nasledovných súvisiacich chránených objektov:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ste si istý, že chcete odstrániť objekt %(object_name)s \"%(escaped_object)s"
+"\"? Všetky nasledujúce súvisiace objekty budú odstránené:"
+
+msgid "Objects"
+msgstr "Objekty"
+
+msgid "Yes, I'm sure"
+msgstr "Áno, som si istý"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Zmazať viacero objektov"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Vymazanie označených %(objects_name)s by spôsobilo vymazanie súvisiacich "
+"objektov, ale váš účet nemá oprávnenie na vymazanie nasledujúcich typov "
+"objektov:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Vymazanie označených %(objects_name)s vyžaduje vymazanie nasledujúcich "
+"chránených súvisiacich objektov:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ste si isty, že chcete vymazať označené %(objects_name)s? Vymažú sa všetky "
+"nasledujúce objekty a ich súvisiace položky:"
+
+msgid "Change"
+msgstr "Zmeniť"
+
+msgid "Remove"
+msgstr "Odstrániť"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Pridať ďalší %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Zmazať?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Podľa %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modely v %(name)s aplikácii"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte právo na vykonávanie zmien."
+
+msgid "Recent Actions"
+msgstr "Posledné akcie"
+
+msgid "My Actions"
+msgstr "Moje akcie"
+
+msgid "None available"
+msgstr "Nedostupné"
+
+msgid "Unknown content"
+msgstr "Neznámy obsah"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Niečo nie je v poriadku s vašou inštaláciou databázy. Uistite sa, že boli "
+"vytvorené potrebné databázové tabuľky a taktiež skontrolujte, či príslušný "
+"používateľ môže databázu čítať."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Zabudli ste heslo alebo používateľské meno?"
+
+msgid "Date/time"
+msgstr "Dátum a čas"
+
+msgid "User"
+msgstr "Používateľ"
+
+msgid "Action"
+msgstr "Akcia"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tento objekt nemá zoznam zmien. Pravdepodobne nebol pridaný prostredníctvom "
+"tejto správcovskej stránky."
+
+msgid "Show all"
+msgstr "Zobraziť všetky"
+
+msgid "Save"
+msgstr "Uložiť"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Zmeniť vybrané %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Zmazať vybrané %(model)s"
+
+msgid "Search"
+msgstr "Vyhľadávanie"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s výsledok"
+msgstr[1] "%(counter)s výsledky"
+msgstr[2] "%(counter)s výsledkov"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s spolu"
+
+msgid "Save as new"
+msgstr "Uložiť ako nový"
+
+msgid "Save and add another"
+msgstr "Uložiť a pridať ďalší"
+
+msgid "Save and continue editing"
+msgstr "Uložiť a pokračovať v úpravách"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ďakujeme za čas strávený na našich stránkach."
+
+msgid "Log in again"
+msgstr "Znova sa prihlásiť"
+
+msgid "Password change"
+msgstr "Zmena hesla"
+
+msgid "Your password was changed."
+msgstr "Vaše heslo bolo zmenené."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Z bezpečnostných dôvodov zadajte staré heslo a potom nové heslo dvakrát, aby "
+"sme mohli overiť, že ste ho zadali správne."
+
+msgid "Change my password"
+msgstr "Zmeniť moje heslo"
+
+msgid "Password reset"
+msgstr "Obnovenie hesla"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaše heslo bolo nastavené. Môžete pokračovať a prihlásiť sa."
+
+msgid "Password reset confirmation"
+msgstr "Potvrdenie obnovenia hesla"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Zadajte nové heslo dvakrát, aby sme mohli overiť, že ste ho zadali správne."
+
+msgid "New password:"
+msgstr "Nové heslo:"
+
+msgid "Confirm password:"
+msgstr "Potvrdenie hesla:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Odkaz na obnovenie hesla je neplatný, pretože už bol pravdepodobne raz "
+"použitý. Prosím, požiadajte znovu o obnovu hesla."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Čoskoro by ste mali dostať inštrukcie pre nastavenie hesla, ak existuje "
+"konto s emailom, ktorý ste zadali. "
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ak ste nedostali email, uistite sa, že ste zadali adresu, s ktorou ste sa "
+"registrovali a skontrolujte svoj spamový priečinok."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Tento e-mail ste dostali preto, lebo ste požiadali o obnovenie hesla pre "
+"užívateľský účet na %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Prosím, choďte na túto stránku a zvoľte si nové heslo:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše používateľské meno, pre prípad, že ste ho zabudli:"
+
+msgid "Thanks for using our site!"
+msgstr "Ďakujeme, že používate našu stránku!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tím %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Zabudli ste heslo? Zadajte svoju e-mailovú adresu a my vám pošleme "
+"inštrukcie pre nastavenie nového hesla."
+
+msgid "Email address:"
+msgstr "E-mailová adresa:"
+
+msgid "Reset my password"
+msgstr "Obnova môjho hesla"
+
+msgid "All dates"
+msgstr "Všetky dátumy"
+
+#, python-format
+msgid "Select %s"
+msgstr "Vybrať %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Vybrať \"%s\" na úpravu"
+
+msgid "Date:"
+msgstr "Dátum:"
+
+msgid "Time:"
+msgstr "Čas:"
+
+msgid "Lookup"
+msgstr "Vyhľadanie"
+
+msgid "Currently:"
+msgstr "Aktuálne:"
+
+msgid "Change:"
+msgstr "Zmeniť:"
diff --git a/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..940b0be
--- /dev/null
+++ b/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9fdf09c
--- /dev/null
+++ b/tbc/static/admin/locale/sk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,167 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Dimitris Glezos <glezos@transifex.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Juraj Bubniak <translations@jbub.eu>, 2012
+# Marian Andre <marian@andre.sk>, 2012,2015
+# Martin Kosír, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Slovak (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostupné %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Toto je zoznam dostupných %s. Pre výber je potrebné označiť ich v poli a "
+"následne kliknutím na šípku \"Vybrať\" presunúť."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Píšte do tohto poľa pre vyfiltrovanie dostupných %s."
+
+msgid "Filter"
+msgstr "Filtrovať"
+
+msgid "Choose all"
+msgstr "Vybrať všetko"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kliknite sem pre vybratie všetkých %s naraz."
+
+msgid "Choose"
+msgstr "Vybrať"
+
+msgid "Remove"
+msgstr "Odstrániť"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Vybrané %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Toto je zoznam dostupných %s. Pre vymazanie je potrebné označiť ich v poli a "
+"následne kliknutím na šípku \"Vymazať\" vymazať."
+
+msgid "Remove all"
+msgstr "Odstrániť všetky"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kliknite sem pre vymazanie vybratých %s naraz."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s z %(cnt)s vybrané"
+msgstr[1] "%(sel)s z %(cnt)s vybrané"
+msgstr[2] "%(sel)s z %(cnt)s vybraných"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Vrámci jednotlivých editovateľných polí máte neuložené zmeny. Ak vykonáte "
+"akciu, vaše zmeny budú stratené."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Vybrali ste akciu, ale neuložili ste jednotlivé polia. Prosím, uložte zmeny "
+"kliknutím na OK. Akciu budete musieť vykonať znova."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Vybrali ste akciu, ale neurobili ste žiadne zmeny v jednotlivých poliach. "
+"Pravdepodobne ste chceli použiť tlačidlo vykonať namiesto uložiť."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Poznámka: Ste %s hodinu pred časom servera."
+msgstr[1] "Poznámka: Ste %s hodiny pred časom servera."
+msgstr[2] "Poznámka: Ste %s hodín pred časom servera."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Poznámka: Ste %s hodinu za časom servera."
+msgstr[1] "Poznámka: Ste %s hodiny za časom servera."
+msgstr[2] "Poznámka: Ste %s hodín za časom servera."
+
+msgid "Now"
+msgstr "Teraz"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Vybrať čas"
+
+msgid "Midnight"
+msgstr "Polnoc"
+
+msgid "6 a.m."
+msgstr "6:00"
+
+msgid "Noon"
+msgstr "Poludnie"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Zrušiť"
+
+msgid "Today"
+msgstr "Dnes"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Včera"
+
+msgid "Tomorrow"
+msgstr "Zajtra"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"január február marec apríl máj jún júl august september október november "
+"december"
+
+msgid "S M T W T F S"
+msgstr "N P U S Š P S"
+
+msgid "Show"
+msgstr "Zobraziť"
+
+msgid "Hide"
+msgstr "Skryť"
diff --git a/tbc/static/admin/locale/sl/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c0ebbee
--- /dev/null
+++ b/tbc/static/admin/locale/sl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sl/LC_MESSAGES/django.po b/tbc/static/admin/locale/sl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8ffa8b6
--- /dev/null
+++ b/tbc/static/admin/locale/sl/LC_MESSAGES/django.po
@@ -0,0 +1,677 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# zejn <zejn@kiberpipa.org>, 2013
+# zejn <zejn@kiberpipa.org>, 2011-2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Slovenian (http://www.transifex.com/django/django/language/"
+"sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Uspešno izbrisano %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Ni mogoče izbrisati %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ste prepričani?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Izbriši izbrano: %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Vse"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Neznano"
+
+msgid "Any date"
+msgstr "Kadarkoli"
+
+msgid "Today"
+msgstr "Danes"
+
+msgid "Past 7 days"
+msgstr "Zadnjih 7 dni"
+
+msgid "This month"
+msgstr "Ta mesec"
+
+msgid "This year"
+msgstr "Letos"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Vnesite veljavno %(username)s in geslo za račun osebja. Opomba: obe polji "
+"upoštevata velikost črk."
+
+msgid "Action:"
+msgstr "Dejanje:"
+
+msgid "action time"
+msgstr "čas dejanja"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id objekta"
+
+msgid "object repr"
+msgstr "predstavitev objekta"
+
+msgid "action flag"
+msgstr "zastavica dejanja"
+
+msgid "change message"
+msgstr "spremeni sporočilo"
+
+msgid "log entry"
+msgstr "dnevniški vnos"
+
+msgid "log entries"
+msgstr "dnevniški vnosi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Dodan \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Spremenjen \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Izbrisan \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Dnevniški vnos"
+
+msgid "None"
+msgstr "Brez vrednosti"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Spremenjen %s."
+
+msgid "and"
+msgstr "in"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodal %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Spremenjeno %(list)s za %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Izbrisan %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nobeno polje ni bilo spremenjeno."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" je bil uspešno dodan. Ponovno ga lahko uredite spodaj."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" je bil uspešno dodan. Spodaj lahko dodate še kak "
+"%(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno dodan."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" je bil uspešno posodobljen. Spodaj ga lahko urejate še "
+"dalje."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" je bil uspešno posodobljen. Spodaj lahko dodate še kak "
+"%(name)s."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno spremenjen."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Izbrati morate vnose, nad katerimi želite izvesti operacijo. Noben vnos ni "
+"bil spremenjen."
+
+msgid "No action selected."
+msgstr "Brez dejanja."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno izbrisan."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objekt %(name)s z glavnim ključem %(key)r ne obstaja."
+
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Spremeni %s"
+
+msgid "Database error"
+msgstr "Napaka v podatkovni bazi"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s je bil uspešno spremenjen."
+msgstr[1] "%(count)s %(name)s sta bila uspešno spremenjena."
+msgstr[2] "%(count)s %(name)s so bili uspešno spremenjeni."
+msgstr[3] "%(count)s %(name)s je bilo uspešno spremenjenih."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s izbran"
+msgstr[1] "%(total_count)s izbrana"
+msgstr[2] "%(total_count)s izbrani"
+msgstr[3] "%(total_count)s izbranih"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 od %(cnt)s izbranih"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Zgodovina sprememb: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django administrativni vmesnik"
+
+msgid "Django administration"
+msgstr "Django administracija"
+
+msgid "Site administration"
+msgstr "Administracija strani"
+
+msgid "Log in"
+msgstr "Prijavite se"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Strani ni mogoče najti"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Opravičujemo se, a zahtevane strani ni mogoče najti."
+
+msgid "Home"
+msgstr "Domov"
+
+msgid "Server error"
+msgstr "Napaka na strežniku"
+
+msgid "Server error (500)"
+msgstr "Napaka na strežniku (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Napaka na strežniku <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Prišlo je do nepričakovane napake. Napaka je bila javljena administratorjem "
+"spletne strani in naj bi jo v kratkem odpravili. Hvala za potrpljenje."
+
+msgid "Run the selected action"
+msgstr "Izvedi izbrano dejanje"
+
+msgid "Go"
+msgstr "Pojdi"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Kliknite tu za izbiro vseh vnosov na vseh straneh"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Izberi vse %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Počisti izbiro"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Najprej vpišite uporabniško ime in geslo, nato boste lahko urejali druge "
+"lastnosti uporabnika."
+
+msgid "Enter a username and password."
+msgstr "Vnesite uporabniško ime in geslo."
+
+msgid "Change password"
+msgstr "Spremeni geslo"
+
+msgid "Please correct the error below."
+msgstr "Prosimo, odpravite sledeče napake."
+
+msgid "Please correct the errors below."
+msgstr "Prosimo popravite spodnje napake."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Vpišite novo geslo za uporabnika <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+msgid "Log out"
+msgstr "Odjava"
+
+msgid "Add"
+msgstr "Dodaj"
+
+msgid "History"
+msgstr "Zgodovina"
+
+msgid "View on site"
+msgstr "Poglej na strani"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Odstrani iz razvrščanja"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioriteta razvrščanja: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Preklopi razvrščanje"
+
+msgid "Delete"
+msgstr "Izbriši"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Izbris %(object_name)s '%(escaped_object)s' bi pomenil izbris povezanih "
+"objektov, vendar nimate dovoljenja za izbris naslednjih tipov objektov:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Brisanje %(object_name)s '%(escaped_object)s' bi zahtevalo brisanje "
+"naslednjih zaščitenih povezanih objektov:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ste prepričani, da želite izbrisati %(object_name)s \"%(escaped_object)s\"? "
+"Vsi naslednji povezani elementi bodo izbrisani:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ja, prepričan sem"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Izbriši več objektov"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Brisanje naslendjih %(objects_name)s bi imelo za posledico izbris naslednjih "
+"povezanih objektov, vendar vaš račun nima pravic za izbris naslednjih tipov "
+"objektov:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Brisanje izbranih %(objects_name)s zahteva brisanje naslednjih zaščitenih "
+"povezanih objektov:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ali res želite izbrisati izbrane %(objects_name)s? Vsi naslednji objekti in "
+"njihovi povezani vnosi bodo izbrisani:"
+
+msgid "Change"
+msgstr "Spremeni"
+
+msgid "Remove"
+msgstr "Odstrani"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Dodaj še en %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Izbrišem?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Po %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Model v %(name)s aplikaciji"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nimate dovoljenja za urejanje."
+
+msgid "Recent Actions"
+msgstr "Zadnja dejanja"
+
+msgid "My Actions"
+msgstr "Moja dejanja"
+
+msgid "None available"
+msgstr "Ni na voljo"
+
+msgid "Unknown content"
+msgstr "Neznana vsebina"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Nekaj je narobe z namestitvijo vaše podatkovne baze. Preverite, da so bile "
+"ustvarjene prave tabele v podatkovni bazi in da je dostop do branja baze "
+"omogočen pravemu uporabniku."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Ste pozabili geslo ali uporabniško ime?"
+
+msgid "Date/time"
+msgstr "Datum/čas"
+
+msgid "User"
+msgstr "Uporabnik"
+
+msgid "Action"
+msgstr "Dejanje"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ta objekt nima zgodovine sprememb. Verjetno ni bil dodan preko te strani za "
+"administracijo."
+
+msgid "Show all"
+msgstr "Prikaži vse"
+
+msgid "Save"
+msgstr "Shrani"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Išči"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s zadetkov"
+msgstr[1] "%(counter)s zadetek"
+msgstr[2] "%(counter)s zadetka"
+msgstr[3] "%(counter)s zadetki"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s skupno"
+
+msgid "Save as new"
+msgstr "Shrani kot novo"
+
+msgid "Save and add another"
+msgstr "Shrani in dodaj še eno"
+
+msgid "Save and continue editing"
+msgstr "Shrani in nadaljuj z urejanjem"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala, ker ste si danes vzeli nekaj časa za to spletno stran."
+
+msgid "Log in again"
+msgstr "Ponovna prijava"
+
+msgid "Password change"
+msgstr "Sprememba gesla"
+
+msgid "Your password was changed."
+msgstr "Vaše geslo je bilo spremenjeno."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo, da se "
+"izognete tipkarskim napakam."
+
+msgid "Change my password"
+msgstr "Spremeni moje geslo"
+
+msgid "Password reset"
+msgstr "Ponastavitev gesla"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaše geslo je bilo nastavljeno. Zdaj se lahko prijavite."
+
+msgid "Password reset confirmation"
+msgstr "Potrdite ponastavitev gesla"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Vnesite vaše novo geslo dvakrat, da se izognete tipkarskim napakam."
+
+msgid "New password:"
+msgstr "Novo geslo:"
+
+msgid "Confirm password:"
+msgstr "Potrditev gesla:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Povezava za ponastavitev gesla ni bila veljavna, morda je bila že "
+"uporabljena. Prosimo zahtevajte novo ponastavitev gesla."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Če e-pošte niste prejeli, prosimo preverite, da ste vnesli pravilen e-poštni "
+"naslov in preverite nezaželeno pošto."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"To e-pošto ste prejeli, ker je ste zahtevali ponastavitev gesla za vaš "
+"uporabniški račun na %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Prosimo pojdite na sledečo stran in izberite novo geslo:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uporabniško ime (za vsak primer):"
+
+msgid "Thanks for using our site!"
+msgstr "Hvala, ker uporabljate našo stran!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Ekipa strani %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Ste pozabili geslo? Vnesite vaš e-poštni naslov in poslali vam bomo navodila "
+"za ponastavitev gesla."
+
+msgid "Email address:"
+msgstr "E-poštni naslov:"
+
+msgid "Reset my password"
+msgstr "Ponastavi moje geslo"
+
+msgid "All dates"
+msgstr "Vsi datumi"
+
+#, python-format
+msgid "Select %s"
+msgstr "Izberite %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Izberite %s, ki ga želite spremeniti"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Ura:"
+
+msgid "Lookup"
+msgstr "Poizvedba"
+
+msgid "Currently:"
+msgstr "Trenutno:"
+
+msgid "Change:"
+msgstr "Spremembe:"
diff --git a/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..bee4c2c
--- /dev/null
+++ b/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..23ee566
--- /dev/null
+++ b/tbc/static/admin/locale/sl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,170 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# zejn <zejn@kiberpipa.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Slovenian (http://www.transifex.com/django/django/language/"
+"sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Možne %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"To je seznam možnih %s. Izbrane lahko izberete z izbiro v spodnjem okvirju "
+"in s klikom na puščico \"Izberi\" med okvirjema."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Z vpisom niza v to polje, zožite izbor %s."
+
+msgid "Filter"
+msgstr "Filtriraj"
+
+msgid "Choose all"
+msgstr "Izberi vse"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Kliknite za izbor vseh %s hkrati."
+
+msgid "Choose"
+msgstr "Izberi"
+
+msgid "Remove"
+msgstr "Odstrani"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Izbran %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"To je seznam možnih %s. Odvečne lahko odstranite z izbiro v okvirju in "
+"klikom na puščico \"Odstrani\" med okvirjema."
+
+msgid "Remove all"
+msgstr "Odstrani vse"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Kliknite za odstranitev vseh %s hkrati."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s od %(cnt)s izbranih"
+msgstr[1] "%(sel)s od %(cnt)s izbran"
+msgstr[2] "%(sel)s od %(cnt)s izbrana"
+msgstr[3] "%(sel)s od %(cnt)s izbrani"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Na nekaterih poljih, kjer je omogočeno urejanje, so neshranjene spremembe. V "
+"primeru nadaljevanja bodo neshranjene spremembe trajno izgubljene."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Izbrali ste dejanje, vendar niste shranili sprememb na posameznih poljih. "
+"Kliknite na 'V redu', da boste shranili. Dejanje boste morali ponovno "
+"izvesti."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Izbrali ste dejanje, vendar niste naredili nobenih sprememb na posameznih "
+"poljih. Verjetno iščete gumb Pojdi namesto Shrani."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Now"
+msgstr "Takoj"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Izbor časa"
+
+msgid "Midnight"
+msgstr "Polnoč"
+
+msgid "6 a.m."
+msgstr "Ob 6h"
+
+msgid "Noon"
+msgstr "Opoldne"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgid "Today"
+msgstr "Danes"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Včeraj"
+
+msgid "Tomorrow"
+msgstr "Jutri"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Marec April Maj Junij Julij Avgust September Oktober November "
+"December"
+
+msgid "S M T W T F S"
+msgstr "N P T S Č P S"
+
+msgid "Show"
+msgstr "Prikaži"
+
+msgid "Hide"
+msgstr "Skrij"
diff --git a/tbc/static/admin/locale/sq/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sq/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c743f82
--- /dev/null
+++ b/tbc/static/admin/locale/sq/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sq/LC_MESSAGES/django.po b/tbc/static/admin/locale/sq/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f0e0b8e
--- /dev/null
+++ b/tbc/static/admin/locale/sq/LC_MESSAGES/django.po
@@ -0,0 +1,684 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Besnik <besnik@programeshqip.org>, 2011
+# Besnik <besnik@programeshqip.org>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-25 15:35+0000\n"
+"Last-Translator: Besnik <besnik@programeshqip.org>\n"
+"Language-Team: Albanian (http://www.transifex.com/django/django/language/"
+"sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "U fshinë me sukses %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "S'mund të fshijë %(name)s"
+
+msgid "Are you sure?"
+msgstr "Jeni i sigurt?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Fshiji %(verbose_name_plural)s e përzgjdhur"
+
+msgid "Administration"
+msgstr "Administrim"
+
+msgid "All"
+msgstr "Krejt"
+
+msgid "Yes"
+msgstr "Po"
+
+msgid "No"
+msgstr "Jo"
+
+msgid "Unknown"
+msgstr "E panjohur"
+
+msgid "Any date"
+msgstr "Çfarëdo date"
+
+msgid "Today"
+msgstr "Sot"
+
+msgid "Past 7 days"
+msgstr "7 ditët e shkuara"
+
+msgid "This month"
+msgstr "Këtë muaj"
+
+msgid "This year"
+msgstr "Këtë vit"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Ju lutemi, jepni %(username)s dhe fjalëkalimin e saktë për një llogari "
+"ekipi. Kini parasysh se që të dyja fushat mund të jenë të ndjeshme ndaj "
+"shkrimit me shkronja të mëdha ose të vogla."
+
+msgid "Action:"
+msgstr "Veprim:"
+
+msgid "action time"
+msgstr "kohë veprimi"
+
+msgid "user"
+msgstr "përdorues"
+
+msgid "content type"
+msgstr "lloj lënde"
+
+msgid "object id"
+msgstr "id objekti"
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr "shenjë veprimi"
+
+msgid "change message"
+msgstr "mesazh ndryshimi"
+
+msgid "log entry"
+msgstr "zë regjistrimi"
+
+msgid "log entries"
+msgstr "zëra regjistrimi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "U shtua \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "U ndryshua \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "U fshi \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Objekt LogEntry"
+
+msgid "None"
+msgstr "Asnjë"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Për të përzgjedhur më shumë se një, mbani të shtypur \"Control\", ose "
+"\"Command\" në Mac, ."
+
+msgid "Added."
+msgstr "U shtua."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Ndryshoi %s."
+
+msgid "and"
+msgstr " dhe "
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "U shtua %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "U ndryshua %(list)s për %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "U fshi %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Nuk u ndryshuan fusha."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" u shtua me sukses. Mund ta përpunoni sërish më poshtë."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" u shtua me sukses. Mund të shtoni një tjetër %(name)s "
+"më poshtë."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" u shtua me sukses."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" u shtua me sukses. Mund ta përpunoni sërish më poshtë."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" u ndryshua me sukses. Mund të shtoni një tjetër "
+"%(name)s më poshtë."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" u ndryshua me sukses."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Duhen përzgjedhur objekte që të kryhen veprime mbi ta. Nuk u ndryshua ndonjë "
+"objekt."
+
+msgid "No action selected."
+msgstr "Pa përzgjedhje veprimi."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" u fshi me sukses."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objekti %(name)s me kyç parësor %(key)r nuk ekziston."
+
+#, python-format
+msgid "Add %s"
+msgstr "Shtoni %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Ndrysho %s"
+
+msgid "Database error"
+msgstr "Gabimi baze të dhënash"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s u ndryshua me sukses."
+msgstr[1] "%(count)s %(name)s u ndryshuan me sukses."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s të përzgjedhur"
+msgstr[1] "Krejt %(total_count)s të përzgjedhurat"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 nga %(cnt)s të përzgjedhur"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ndryshoni historikun: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Fshirja e %(class_name)s %(instance)s do të lypte fshirjen e objekteve "
+"vijuese të mbrojtura që kanë lidhje me ta: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Përgjegjësi i site-it Django"
+
+msgid "Django administration"
+msgstr "Administrim i Django-s"
+
+msgid "Site administration"
+msgstr "Administrim site-i"
+
+msgid "Log in"
+msgstr "Hyni"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administrim %(app)s"
+
+msgid "Page not found"
+msgstr "Nuk u gjet faqe"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Na ndjeni, por faqja e kërkuar nuk gjendet dot."
+
+msgid "Home"
+msgstr "Hyrje"
+
+msgid "Server error"
+msgstr "Gabim shërbyesi"
+
+msgid "Server error (500)"
+msgstr "Gabim shërbyesi (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Gabim Shërbyesi <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Pati një gabim. Iu është njoftuar përgjegjësve të site-it përmes email-it "
+"dhe do të duhej të ndreqej shpejt. Faleminderit për durimin."
+
+msgid "Run the selected action"
+msgstr "Xhironi veprimin e përzgjedhur"
+
+msgid "Go"
+msgstr "Shko tek"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klikoni këtu që të përzgjidhni objektet nëpër krejt faqet"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Përzgjidhni krejt %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Pastroje përzgjedhjen"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Së pari, jepni një emër përdoruesi dhe fjalëkalim. Mandej, do të jeni në "
+"gjendje të përpunoni më tepër mundësi përdoruesi."
+
+msgid "Enter a username and password."
+msgstr "Jepni emër përdoruesi dhe fjalëkalim."
+
+msgid "Change password"
+msgstr "Ndryshoni fjalëkalimin"
+
+msgid "Please correct the error below."
+msgstr "Ju lutemi, ndreqini gabimet e mëposhtme."
+
+msgid "Please correct the errors below."
+msgstr "Ju lutemi, ndreqni gabimet më poshtë."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Jepni një fjalëkalim të ri për përdoruesin <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Mirë se vini,"
+
+msgid "View site"
+msgstr "Shihni sajtin"
+
+msgid "Documentation"
+msgstr "Dokumentim"
+
+msgid "Log out"
+msgstr "Dilni"
+
+msgid "Add"
+msgstr "Shtoni"
+
+msgid "History"
+msgstr "Historik"
+
+msgid "View on site"
+msgstr "Shiheni në site"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Shto %(name)s"
+
+msgid "Filter"
+msgstr "Filtër"
+
+msgid "Remove from sorting"
+msgstr "Hiqe prej renditjeje"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Përparësi renditjesh: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Këmbe renditjen"
+
+msgid "Delete"
+msgstr "Fshije"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Fshirja e %(object_name)s '%(escaped_object)s' do të shpinte në fshirjen e "
+"objekteve të lidhur me të, por llogaria juaj nuk ka leje për fshirje të "
+"objekteve të llojeve të mëposhtëm:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Fshirja e %(object_name)s '%(escaped_object)s' do të kërkonte fshirjen e "
+"objekteve vijues, të mbrojtur, të lidhur me të:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Jeni i sigurt se doni të fshihet %(object_name)s \"%(escaped_object)s\"? "
+"Krejt objektet vijues të lidhur me të do të fshihen:"
+
+msgid "Objects"
+msgstr "Objekte"
+
+msgid "Yes, I'm sure"
+msgstr "Po, jam i sigurt"
+
+msgid "No, take me back"
+msgstr "Jo, kthemëni mbrapsht"
+
+msgid "Delete multiple objects"
+msgstr "Fshini disa objekte njëherësh"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Fshirja e %(objects_name)s të përzgjedhur do të shpjerë në fshirjen e "
+"objekteve të lidhur me të, por llogaria juaj nuk ka leje të fshijë llojet "
+"vijuese të objekteve:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Fshirja e %(objects_name)s të përzgjedhur do të kërkonte fshirjen e "
+"objekteve vijues, të mbrojtur, të lidhur me të:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Jeni i sigurt se doni të fshihen e %(objects_name)s përzgjedhur? Krejt "
+"objektet vijues dhe gjëra të lidhura me ta do të fshihen:"
+
+msgid "Change"
+msgstr "Ndryshoje"
+
+msgid "Remove"
+msgstr "Hiqe"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Shtoni një tjetër %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Të fshihet?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Nga %(filter_title)s "
+
+msgid "Summary"
+msgstr "Përmbledhje"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modele te zbatimi %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Nuk keni leje për të përpunuar ndonjë gjë."
+
+msgid "Recent Actions"
+msgstr "Veprime Së Fundi"
+
+msgid "My Actions"
+msgstr "Veprimet e Mia"
+
+msgid "None available"
+msgstr "Asnjë i passhëm"
+
+msgid "Unknown content"
+msgstr "Lëndë e panjohur"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Ka diçka që nuk shkon me instalimin e bazës suaj të të dhënave. Sigurohuni "
+"që janë krijuar tabelat e duhura të bazës së të dhënave, dhe që baza e të "
+"dhënave është e lexueshme nga përdoruesi i duhur."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Jeni mirëfilltësuar si %(username)s, por s’jeni i autorizuar të hyni në këtë "
+"faqe. Do të donit të hyni në një llogari tjetër?"
+
+msgid "Forgotten your password or username?"
+msgstr "Harruat fjalëkalimin ose emrin tuaj të përdoruesit?"
+
+msgid "Date/time"
+msgstr "Datë/kohë"
+
+msgid "User"
+msgstr "Përdorues"
+
+msgid "Action"
+msgstr "Veprim"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ky objekt nuk ka historik ndryshimesh. Ndoshta nuk qe shtuar përmes këtij "
+"site-i administrimi."
+
+msgid "Show all"
+msgstr "Shfaqi krejt"
+
+msgid "Save"
+msgstr "Ruaje"
+
+msgid "Popup closing..."
+msgstr "Flluska po mbyllet..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Nryshoni %(model)s e përzgjedhur"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Shtoni një %(model)s tjetër"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Fshije %(model)s e përzgjedhur"
+
+msgid "Search"
+msgstr "Kërko"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s përfundim"
+msgstr[1] "%(counter)s përfundime"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s gjithsej"
+
+msgid "Save as new"
+msgstr "Ruaje si të ri"
+
+msgid "Save and add another"
+msgstr "Ruajeni dhe shtoni një tjetër"
+
+msgid "Save and continue editing"
+msgstr "Ruajeni dhe vazhdoni përpunimin"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Faleminderit që shpenzoni pak kohë të çmuar me site-in Web sot."
+
+msgid "Log in again"
+msgstr "Hyni sërish"
+
+msgid "Password change"
+msgstr "Ndryshim fjalëkalimi"
+
+msgid "Your password was changed."
+msgstr "Fjalëkalimi juaj u ndryshua."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Ju lutem, jepni fjalëkalimin tuaj të vjetër, për hir të sigurisë, dhe mandej "
+"jepni dy herë fjalëkalimin tuaj të ri, që kështu të mund të verifikojmë se e "
+"shtypët saktë."
+
+msgid "Change my password"
+msgstr "Ndrysho fjalëkalimin tim"
+
+msgid "Password reset"
+msgstr "Ricaktim fjalëkalimi"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"Fjakalimi juaj u caktua. Mund të vazhdoni më tej dhe të bëni hyrjen tani."
+
+msgid "Password reset confirmation"
+msgstr "Ripohim ricaktimi fjalëkalimi"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Ju lutem, jepeni fjalëkalimin tuaj dy herë, që kështu të mund të verifikojmë "
+"që e shtypët saktë."
+
+msgid "New password:"
+msgstr "Fjalëkalim i ri:"
+
+msgid "Confirm password:"
+msgstr "Ripohoni fjalëkalimin:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Lidhja për ricaktimin e fjalëkalimit qe e pavlefshme, ndoshta ngaqë është "
+"përdorur tashmë një herë. Ju lutem, kërkoni një ricaktim të ri fjalëkalimi."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Ju kemi dërguar me email udhëzime për caktimin e fjalëkalimit tuaj, nëse ka "
+"një llogari me email-in që dhatë. Do të duhej t'ju vinin pas pak."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Nëse nuk merrni një email, ju lutemi, sigurohuni që keni dhënë adresën e "
+"saktë me të cilën u regjistruat, dhe kontrolloni dosjen tuaj të mesazheve "
+"hedhurinë."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Këtë email po e merrni ngaqë kërkuat ricaktim fjalëkalimi për llogarinë tuaj "
+"si përdorues te %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Ju lutem, shkoni te faqja vijuese dhe zgjidhni një fjalëkalim të ri:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Emri juaj i përdoruesit, në rast se e keni harruar:"
+
+msgid "Thanks for using our site!"
+msgstr "Faleminderit që përdorni site-in tonë!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Ekipi i %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Harruat fjalëkalimin tuaj? Jepni më poshtë adresën tuaj email, dhe do t'ju "
+"dërgojmë udhëzimet për të caktuar një të ri."
+
+msgid "Email address:"
+msgstr "Adresë email:"
+
+msgid "Reset my password"
+msgstr "Ricakto fjalëkalimin tim"
+
+msgid "All dates"
+msgstr "Krejt datat"
+
+#, python-format
+msgid "Select %s"
+msgstr "Përzgjidhni %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Përzgjidhni %s për ta ndryshuar"
+
+msgid "Date:"
+msgstr "Datë:"
+
+msgid "Time:"
+msgstr "Kohë:"
+
+msgid "Lookup"
+msgstr "Kërkim"
+
+msgid "Currently:"
+msgstr "Tani:"
+
+msgid "Change:"
+msgstr "Ndryshim:"
diff --git a/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f084865
--- /dev/null
+++ b/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c68532a
--- /dev/null
+++ b/tbc/static/admin/locale/sq/LC_MESSAGES/djangojs.po
@@ -0,0 +1,165 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Besnik <besnik@programeshqip.org>, 2011-2012
+# Besnik <besnik@programeshqip.org>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-11-25 08:55+0000\n"
+"Last-Translator: Besnik <besnik@programeshqip.org>\n"
+"Language-Team: Albanian (http://www.transifex.com/django/django/language/"
+"sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s i gatshëm"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Kjo është lista e %s të gatshëm. Mund të zgjidhni disa duke i përzgjedhur te "
+"kutiza më poshtë dhe mandej duke klikuar mbi shigjetën \"Zgjidhe\" mes dy "
+"kutizave."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Shkruani brenda kutizës që të filtrohet lista e %s të passhme."
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Choose all"
+msgstr "Zgjidheni krejt"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klikoni që të zgjidhen krejt %s njëherësh."
+
+msgid "Choose"
+msgstr "Zgjidhni"
+
+msgid "Remove"
+msgstr "Hiqe"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "U zgjodh %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Kjo është lista e %s të gatshme. Mund të hiqni disa duke i përzgjedhur te "
+"kutiza më poshtë e mandej duke klikuar mbi shigjetën \"Hiqe\" mes dy "
+"kutizave."
+
+msgid "Remove all"
+msgstr "Hiqi krejt"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klikoni që të hiqen krejt %s e zgjedhura njëherësh."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "U përzgjodh %(sel)s nga %(cnt)s"
+msgstr[1] "U përzgjodhën %(sel)s nga %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Keni ndryshime të paruajtura te fusha individuale të ndryshueshme. Nëse "
+"kryeni një veprim, ndryshimet e paruajtura do të humbin."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Keni përzgjedhur një veprim, por nuk keni ruajtur ende ndryshimet që bëtë te "
+"fusha individuale. Ju lutemi, klikoni OK që të bëhet ruajtja. Do t’ju duhet "
+"ta ribëni veprimin."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Keni përzgjedhur një veprim, dhe nuk keni bërë ndonjë ndryshim te fusha "
+"individuale. Ndoshta po kërkonit për butonin Shko, në vend se për butonin "
+"Ruaje."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Shënim: Jeni %s orë para kohës së shërbyesit."
+msgstr[1] "Shënim: Jeni %s orë para kohës së shërbyesit."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Shënim: Jeni %s orë pas kohës së shërbyesit."
+msgstr[1] "Shënim: Jeni %s orë pas kohës së shërbyesit."
+
+msgid "Now"
+msgstr "Tani"
+
+msgid "Choose a Time"
+msgstr "Zgjidhni një Kohë"
+
+msgid "Choose a time"
+msgstr "Zgjidhni një kohë"
+
+msgid "Midnight"
+msgstr "Mesnatë"
+
+msgid "6 a.m."
+msgstr "6 a.m."
+
+msgid "Noon"
+msgstr "Mesditë"
+
+msgid "6 p.m."
+msgstr "6 p.m."
+
+msgid "Cancel"
+msgstr "Anuloje"
+
+msgid "Today"
+msgstr "Sot"
+
+msgid "Choose a Date"
+msgstr "Zgjidhni një Datë"
+
+msgid "Yesterday"
+msgstr "Dje"
+
+msgid "Tomorrow"
+msgstr "Nesër"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janar Shkurt Mars Prill Maj Qershor Korrik Gusht Shtator Tetor Nëntor Dhjetor"
+
+msgid "S M T W T F S"
+msgstr "D H M M E P S"
+
+msgid "Show"
+msgstr "Shfaqe"
+
+msgid "Hide"
+msgstr "Fshihe"
diff --git a/tbc/static/admin/locale/sr/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..04893ad
--- /dev/null
+++ b/tbc/static/admin/locale/sr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sr/LC_MESSAGES/django.po b/tbc/static/admin/locale/sr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..023fde3
--- /dev/null
+++ b/tbc/static/admin/locale/sr/LC_MESSAGES/django.po
@@ -0,0 +1,660 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janos Guljas <janos@resenje.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Serbian (http://www.transifex.com/django/django/language/"
+"sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr\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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Успешно обрисано: %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Несуспело брисање %(name)s"
+
+msgid "Are you sure?"
+msgstr "Да ли сте сигурни?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Бриши означене објекте класе %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Сви"
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Не"
+
+msgid "Unknown"
+msgstr "Непознато"
+
+msgid "Any date"
+msgstr "Сви датуми"
+
+msgid "Today"
+msgstr "Данас"
+
+msgid "Past 7 days"
+msgstr "Последњих 7 дана"
+
+msgid "This month"
+msgstr "Овај месец"
+
+msgid "This year"
+msgstr "Ова година"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Радња:"
+
+msgid "action time"
+msgstr "време радње"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id објекта"
+
+msgid "object repr"
+msgstr "опис објекта"
+
+msgid "action flag"
+msgstr "ознака радње"
+
+msgid "change message"
+msgstr "опис измене"
+
+msgid "log entry"
+msgstr "запис у логовима"
+
+msgid "log entries"
+msgstr "записи у логовима"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Додат објекат класе „%(object)s“."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Промењен објекат класе „%(object)s“ - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Уклоњен објекат класе „%(object)s“."
+
+msgid "LogEntry Object"
+msgstr "Објекат уноса лога"
+
+msgid "None"
+msgstr "Ништа"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Измењена поља %s"
+
+msgid "and"
+msgstr "и"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Сачуван објекат „%(object)s“ класе %(name)s."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Измењена поља %(list)s објеката „%(object)s“ класе %(name)s ."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Обрисан објекат „%(object)s“ класе %(name)s."
+
+msgid "No fields changed."
+msgstr "Без измена у пољима."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Објекат „%(obj)s“ класе %(name)s додат је успешно. Доле можете унети додатне "
+"измене."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Објекат „%(obj)s“ класе %(name)s сачуван је успешно."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Објекат „%(obj)s“ класе %(name)s измењен је успешно."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Потребно је изабрати објекте да би се извршила акција над њима. Ниједан "
+"објекат није промењен."
+
+msgid "No action selected."
+msgstr "Није изабрана ниједна акција."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Објекат „%(obj)s“ класе %(name)s успешно је обрисан."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Објекат класе %(name)s са примарним кључем %(key)r не постоји."
+
+#, python-format
+msgid "Add %s"
+msgstr "Додај објекат класе %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Измени објекат класе %s"
+
+msgid "Database error"
+msgstr "Грешка у бази података"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Успешно промењен %(count)s %(name)s."
+msgstr[1] "Успешно промењена %(count)s %(name)s."
+msgstr[2] "Успешно промењених %(count)s %(name)s."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s изабран"
+msgstr[1] "Сва %(total_count)s изабрана"
+msgstr[2] "Свих %(total_count)s изабраних"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 од %(cnt)s изабрано"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Историјат измена: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django администрација сајта"
+
+msgid "Django administration"
+msgstr "Django администрација"
+
+msgid "Site administration"
+msgstr "Администрација система"
+
+msgid "Log in"
+msgstr "Пријава"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Страница није пронађена"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Жао нам је, тражена страница није пронађена."
+
+msgid "Home"
+msgstr "Почетна"
+
+msgid "Server error"
+msgstr "Грешка на серверу"
+
+msgid "Server error (500)"
+msgstr "Грешка на серверу (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Грешка на серверу <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Покрени одабрану радњу"
+
+msgid "Go"
+msgstr "Почни"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Изабери све објекте на овој страници."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Изабери све %(module_name)s од %(total_count)s укупно."
+
+msgid "Clear selection"
+msgstr "Поништи избор"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још "
+"корисничких подешавања."
+
+msgid "Enter a username and password."
+msgstr "Унесите корисничко име и лозинку"
+
+msgid "Change password"
+msgstr "Промена лозинке"
+
+msgid "Please correct the error below."
+msgstr "Исправите наведене грешке."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Унесите нову лозинку за корисника <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Добродошли,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Документација"
+
+msgid "Log out"
+msgstr "Одјава"
+
+msgid "Add"
+msgstr "Додај"
+
+msgid "History"
+msgstr "Историјат"
+
+msgid "View on site"
+msgstr "Преглед на сајту"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додај објекат класе %(name)s"
+
+msgid "Filter"
+msgstr "Филтер"
+
+msgid "Remove from sorting"
+msgstr "Избаци из сортирања"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Приоритет сортирања: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Укључи/искључи сортирање"
+
+msgid "Delete"
+msgstr "Обриши"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Уклањање %(object_name)s „%(escaped_object)s“ повлачи уклањање свих објеката "
+"који су повезани са овим објектом, али ваш налог нема дозволе за брисање "
+"следећих типова објеката:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Да би избрисали изабран %(object_name)s „%(escaped_object)s“ потребно је "
+"брисати и следеће заштићене повезане објекте:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Да сигурни да желите да обришете %(object_name)s „%(escaped_object)s“? "
+"Следећи објекти који су у вези са овим објектом ће такође бити обрисани:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Да, сигуран сам"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Брисање више објеката"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Да би избрисали изабране %(objects_name)s потребно је брисати и заштићене "
+"повезане објекте, међутим ваш налог нема дозволе за брисање следећих типова "
+"објеката:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Да би избрисали изабране %(objects_name)s потребно је брисати и следеће "
+"заштићене повезане објекте:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Да ли сте сигурни да желите да избришете изабране %(objects_name)s? Сви "
+"следећи објекти и објекти са њима повезани ће бити избрисани:"
+
+msgid "Change"
+msgstr "Измени"
+
+msgid "Remove"
+msgstr "Обриши"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Додај још један објекат класе %(verbose_name)s."
+
+msgid "Delete?"
+msgstr "Брисање?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Немате дозволе да уносите било какве измене."
+
+msgid "Recent Actions"
+msgstr "Последње радње"
+
+msgid "My Actions"
+msgstr "Моје радње"
+
+msgid "None available"
+msgstr "Нема података"
+
+msgid "Unknown content"
+msgstr "Непознат садржај"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Нешто није уреду са вашом базом података. Проверите да ли постоје "
+"одговарајуће табеле и да ли одговарајући корисник има приступ бази."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Заборавили сте лозинку или корисничко име?"
+
+msgid "Date/time"
+msgstr "Датум/време"
+
+msgid "User"
+msgstr "Корисник"
+
+msgid "Action"
+msgstr "Радња"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Овај објекат нема забележен историјат измена. Вероватно није додат кроз овај "
+"сајт за администрацију."
+
+msgid "Show all"
+msgstr "Прикажи све"
+
+msgid "Save"
+msgstr "Сачувај"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Претрага"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s резултат"
+msgstr[1] "%(counter)s резултата"
+msgstr[2] "%(counter)s резултата"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "укупно %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Сачувај као нови"
+
+msgid "Save and add another"
+msgstr "Сачувај и додај следећи"
+
+msgid "Save and continue editing"
+msgstr "Сачувај и настави са изменама"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Хвала што сте данас провели време на овом сајту."
+
+msgid "Log in again"
+msgstr "Поновна пријава"
+
+msgid "Password change"
+msgstr "Измена лозинке"
+
+msgid "Your password was changed."
+msgstr "Ваша лозинка је измењена."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Из безбедносних разлога прво унесите своју стару лозинку, а нову затим "
+"унесите два пута да бисмо могли да проверимо да ли сте је правилно унели."
+
+msgid "Change my password"
+msgstr "Измени моју лозинку"
+
+msgid "Password reset"
+msgstr "Ресетовање лозинке"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Ваша лозинка је постављена. Можете се пријавити."
+
+msgid "Password reset confirmation"
+msgstr "Потврда ресетовања лозинке"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Унесите нову лозинку два пута како бисмо могли да проверимо да ли сте је "
+"правилно унели."
+
+msgid "New password:"
+msgstr "Нова лозинка:"
+
+msgid "Confirm password:"
+msgstr "Потврда лозинке:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Линк за ресетовање лозинке није важећи, вероватно зато што је већ "
+"искоришћен. Поново затражите ресетовање лозинке."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Идите на следећу страницу и поставите нову лозинку."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Уколико сте заборавили, ваше корисничко име:"
+
+msgid "Thanks for using our site!"
+msgstr "Хвала што користите наш сајт!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Екипа сајта %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Ресетуј моју лозинку"
+
+msgid "All dates"
+msgstr "Сви датуми"
+
+#, python-format
+msgid "Select %s"
+msgstr "Одабери објекат класе %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Одабери објекат класе %s за измену"
+
+msgid "Date:"
+msgstr "Датум:"
+
+msgid "Time:"
+msgstr "Време:"
+
+msgid "Lookup"
+msgstr "Претражи"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..bc9705f
--- /dev/null
+++ b/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..ea06795
--- /dev/null
+++ b/tbc/static/admin/locale/sr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janos Guljas <janos@resenje.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Serbian (http://www.transifex.com/django/django/language/"
+"sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr\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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Доступни %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ово је листа доступних „%s“. Можете изабрати елементе тако што ћете их "
+"изабрати у листи и кликнути на „Изабери“."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Филтрирајте листу доступних елемената „%s“."
+
+msgid "Filter"
+msgstr "Филтер"
+
+msgid "Choose all"
+msgstr "Изабери све"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Изаберите све „%s“ одједном."
+
+msgid "Choose"
+msgstr "Изабери"
+
+msgid "Remove"
+msgstr "Уклони"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Изабрано „%s“"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ово је листа изабраних „%s“. Можете уклонити елементе тако што ћете их "
+"изабрати у листи и кликнути на „Уклони“."
+
+msgid "Remove all"
+msgstr "Уклони све"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Уклоните све изабране „%s“ одједном."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s од %(cnt)s изабран"
+msgstr[1] "%(sel)s од %(cnt)s изабрана"
+msgstr[2] "%(sel)s од %(cnt)s изабраних"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Имате несачиване измене. Ако покренете акцију, измене ће бити изгубљене."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr "Изабрали сте акцију али нисте сачували промене поља."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr "Изабрали сте акцију али нисте изменили ни једно поље."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr "Тренутно време"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Одабир времена"
+
+msgid "Midnight"
+msgstr "Поноћ"
+
+msgid "6 a.m."
+msgstr "18ч"
+
+msgid "Noon"
+msgstr "Подне"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Поништи"
+
+msgid "Today"
+msgstr "Данас"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Јуче"
+
+msgid "Tomorrow"
+msgstr "Сутра"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"јануар фебруар март април мај јун јул август септембар октобар новембар "
+"децембар"
+
+msgid "S M T W T F S"
+msgstr "Н П У С Ч П С"
+
+msgid "Show"
+msgstr "Покажи"
+
+msgid "Hide"
+msgstr "Сакриј"
diff --git a/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..83ff009
--- /dev/null
+++ b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.po b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..a1e2d62
--- /dev/null
+++ b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/django.po
@@ -0,0 +1,660 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janos Guljas <janos@resenje.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/"
+"language/sr@latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr@latin\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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Uspešno obrisano: %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Nesuspelo brisanje %(name)s"
+
+msgid "Are you sure?"
+msgstr "Da li ste sigurni?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Briši označene objekte klase %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Svi"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "Unknown"
+msgstr "Nepoznato"
+
+msgid "Any date"
+msgstr "Svi datumi"
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Past 7 days"
+msgstr "Poslednjih 7 dana"
+
+msgid "This month"
+msgstr "Ovaj mesec"
+
+msgid "This year"
+msgstr "Ova godina"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Radnja:"
+
+msgid "action time"
+msgstr "vreme radnje"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "id objekta"
+
+msgid "object repr"
+msgstr "opis objekta"
+
+msgid "action flag"
+msgstr "oznaka radnje"
+
+msgid "change message"
+msgstr "opis izmene"
+
+msgid "log entry"
+msgstr "zapis u logovima"
+
+msgid "log entries"
+msgstr "zapisi u logovima"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Dodat objekat klase „%(object)s“."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Promenjen objekat klase „%(object)s“ - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Uklonjen objekat klase „%(object)s“."
+
+msgid "LogEntry Object"
+msgstr "Objekat unosa loga"
+
+msgid "None"
+msgstr "Ništa"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Izmenjena polja %s"
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Sačuvan objekat „%(object)s“ klase %(name)s."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Izmenjena polja %(list)s objekata „%(object)s“ klase %(name)s ."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Obrisan objekat „%(object)s“ klase %(name)s."
+
+msgid "No fields changed."
+msgstr "Bez izmena u poljima."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Objekat „%(obj)s“ klase %(name)s dodat je uspešno. Dole možete uneti dodatne "
+"izmene."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s sačuvan je uspešno."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s izmenjen je uspešno."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan "
+"objekat nije promenjen."
+
+msgid "No action selected."
+msgstr "Nije izabrana nijedna akcija."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekat „%(obj)s“ klase %(name)s uspešno je obrisan."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Objekat klase %(name)s sa primarnim ključem %(key)r ne postoji."
+
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj objekat klase %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Izmeni objekat klase %s"
+
+msgid "Database error"
+msgstr "Greška u bazi podataka"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "Uspešno promenjen %(count)s %(name)s."
+msgstr[1] "Uspešno promenjena %(count)s %(name)s."
+msgstr[2] "Uspešno promenjenih %(count)s %(name)s."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s izabran"
+msgstr[1] "Sva %(total_count)s izabrana"
+msgstr[2] "Svih %(total_count)s izabranih"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 od %(cnt)s izabrano"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Istorijat izmena: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django administracija sajta"
+
+msgid "Django administration"
+msgstr "Django administracija"
+
+msgid "Site administration"
+msgstr "Administracija sistema"
+
+msgid "Log in"
+msgstr "Prijava"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Stranica nije pronađena"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Žao nam je, tražena stranica nije pronađena."
+
+msgid "Home"
+msgstr "Početna"
+
+msgid "Server error"
+msgstr "Greška na serveru"
+
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Pokreni odabranu radnju"
+
+msgid "Go"
+msgstr "Počni"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Izaberi sve objekte na ovoj stranici."
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Izaberi sve %(module_name)s od %(total_count)s ukupno."
+
+msgid "Clear selection"
+msgstr "Poništi izbor"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Prvo unesite korisničko ime i lozinku. Potom ćete moći da menjate još "
+"korisničkih podešavanja."
+
+msgid "Enter a username and password."
+msgstr "Unesite korisničko ime i lozinku"
+
+msgid "Change password"
+msgstr "Promena lozinke"
+
+msgid "Please correct the error below."
+msgstr "Ispravite navedene greške."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Unesite novu lozinku za korisnika <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+msgid "Log out"
+msgstr "Odjava"
+
+msgid "Add"
+msgstr "Dodaj"
+
+msgid "History"
+msgstr "Istorijat"
+
+msgid "View on site"
+msgstr "Pregled na sajtu"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj objekat klase %(name)s"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Remove from sorting"
+msgstr "Izbaci iz sortiranja"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Prioritet sortiranja: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Uključi/isključi sortiranje"
+
+msgid "Delete"
+msgstr "Obriši"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih "
+"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za "
+"brisanje sledećih tipova objekata:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Da bi izbrisali izabran %(object_name)s „%(escaped_object)s“ potrebno je "
+"brisati i sledeće zaštićene povezane objekte:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? "
+"Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Brisanje više objekata"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i zaštićene "
+"povezane objekte, međutim vaš nalog nema dozvole za brisanje sledećih tipova "
+"objekata:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i sledeće "
+"zaštićene povezane objekte:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Da li ste sigurni da želite da izbrišete izabrane %(objects_name)s? Svi "
+"sledeći objekti i objekti sa njima povezani će biti izbrisani:"
+
+msgid "Change"
+msgstr "Izmeni"
+
+msgid "Remove"
+msgstr "Obriši"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Dodaj još jedan objekat klase %(verbose_name)s."
+
+msgid "Delete?"
+msgstr "Brisanje?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Nemate dozvole da unosite bilo kakve izmene."
+
+msgid "Recent Actions"
+msgstr "Poslednje radnje"
+
+msgid "My Actions"
+msgstr "Moje radnje"
+
+msgid "None available"
+msgstr "Nema podataka"
+
+msgid "Unknown content"
+msgstr "Nepoznat sadržaj"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje "
+"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Zaboravili ste lozinku ili korisničko ime?"
+
+msgid "Date/time"
+msgstr "Datum/vreme"
+
+msgid "User"
+msgstr "Korisnik"
+
+msgid "Action"
+msgstr "Radnja"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj "
+"sajt za administraciju."
+
+msgid "Show all"
+msgstr "Prikaži sve"
+
+msgid "Save"
+msgstr "Sačuvaj"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Pretraga"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s rezultat"
+msgstr[1] "%(counter)s rezultata"
+msgstr[2] "%(counter)s rezultata"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "ukupno %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Sačuvaj kao novi"
+
+msgid "Save and add another"
+msgstr "Sačuvaj i dodaj sledeći"
+
+msgid "Save and continue editing"
+msgstr "Sačuvaj i nastavi sa izmenama"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala što ste danas proveli vreme na ovom sajtu."
+
+msgid "Log in again"
+msgstr "Ponovna prijava"
+
+msgid "Password change"
+msgstr "Izmena lozinke"
+
+msgid "Your password was changed."
+msgstr "Vaša lozinka je izmenjena."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim "
+"unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli."
+
+msgid "Change my password"
+msgstr "Izmeni moju lozinku"
+
+msgid "Password reset"
+msgstr "Resetovanje lozinke"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Vaša lozinka je postavljena. Možete se prijaviti."
+
+msgid "Password reset confirmation"
+msgstr "Potvrda resetovanja lozinke"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je "
+"pravilno uneli."
+
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+msgid "Confirm password:"
+msgstr "Potvrda lozinke:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Link za resetovanje lozinke nije važeći, verovatno zato što je već "
+"iskorišćen. Ponovo zatražite resetovanje lozinke."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Idite na sledeću stranicu i postavite novu lozinku."
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Ukoliko ste zaboravili, vaše korisničko ime:"
+
+msgid "Thanks for using our site!"
+msgstr "Hvala što koristite naš sajt!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Ekipa sajta %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "Resetuj moju lozinku"
+
+msgid "All dates"
+msgstr "Svi datumi"
+
+#, python-format
+msgid "Select %s"
+msgstr "Odaberi objekat klase %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Odaberi objekat klase %s za izmenu"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Vreme:"
+
+msgid "Lookup"
+msgstr "Pretraži"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..e1a5dcf
--- /dev/null
+++ b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..82166cc
--- /dev/null
+++ b/tbc/static/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,161 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Janos Guljas <janos@resenje.org>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/"
+"language/sr@latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr@latin\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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Dostupni %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Ovo je lista dostupnih „%s“. Možete izabrati elemente tako što ćete ih "
+"izabrati u listi i kliknuti na „Izaberi“."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Filtrirajte listu dostupnih elemenata „%s“."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Izaberi sve"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Izaberite sve „%s“ odjednom."
+
+msgid "Choose"
+msgstr "Izaberi"
+
+msgid "Remove"
+msgstr "Ukloni"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Izabrano „%s“"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Ovo je lista izabranih „%s“. Možete ukloniti elemente tako što ćete ih "
+"izabrati u listi i kliknuti na „Ukloni“."
+
+msgid "Remove all"
+msgstr "Ukloni sve"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Uklonite sve izabrane „%s“ odjednom."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s od %(cnt)s izabran"
+msgstr[1] "%(sel)s od %(cnt)s izabrana"
+msgstr[2] "%(sel)s od %(cnt)s izabranih"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Imate nesačivane izmene. Ako pokrenete akciju, izmene će biti izgubljene."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr "Izabrali ste akciju ali niste sačuvali promene polja."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr "Izabrali ste akciju ali niste izmenili ni jedno polje."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Now"
+msgstr "Trenutno vreme"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Odabir vremena"
+
+msgid "Midnight"
+msgstr "Ponoć"
+
+msgid "6 a.m."
+msgstr "18č"
+
+msgid "Noon"
+msgstr "Podne"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Poništi"
+
+msgid "Today"
+msgstr "Danas"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Juče"
+
+msgid "Tomorrow"
+msgstr "Sutra"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"januar februar mart april maj jun jul avgust septembar oktobar novembar "
+"decembar"
+
+msgid "S M T W T F S"
+msgstr "N P U S Č P S"
+
+msgid "Show"
+msgstr "Pokaži"
+
+msgid "Hide"
+msgstr "Sakrij"
diff --git a/tbc/static/admin/locale/sv/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sv/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a5dc843
--- /dev/null
+++ b/tbc/static/admin/locale/sv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sv/LC_MESSAGES/django.po b/tbc/static/admin/locale/sv/LC_MESSAGES/django.po
new file mode 100644
index 0000000..dbae2b2
--- /dev/null
+++ b/tbc/static/admin/locale/sv/LC_MESSAGES/django.po
@@ -0,0 +1,682 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Alexander Nordlund <deep.alexander@gmail.com>, 2012
+# Andreas Pelme <andreas@pelme.se>, 2014
+# cvitan <tome@cvitan.com>, 2011
+# Cybjit <cybjit@gmail.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jonathan Lindén, 2015
+# Jonathan Lindén, 2014
+# sorl <mikko@aino.se>, 2011
+# Thomas Lundqvist <thomas@biljettshop.se>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Swedish (http://www.transifex.com/django/django/language/"
+"sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Tog bort %(count)d %(items)s"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Kan inte ta bort %(name)s"
+
+msgid "Are you sure?"
+msgstr "Är du säker?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Ta bort markerade %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "All"
+msgstr "Alla"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Unknown"
+msgstr "Okänt"
+
+msgid "Any date"
+msgstr "Alla datum"
+
+msgid "Today"
+msgstr "Idag"
+
+msgid "Past 7 days"
+msgstr "Senaste 7 dagarna"
+
+msgid "This month"
+msgstr "Denna månad"
+
+msgid "This year"
+msgstr "Detta år"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Ange %(username)s och lösenord för ett personalkonto. Notera att båda fälten "
+"är skiftlägeskänsliga."
+
+msgid "Action:"
+msgstr "Åtgärd:"
+
+msgid "action time"
+msgstr "händelsetid"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "objektets id"
+
+msgid "object repr"
+msgstr "objektets beskrivning"
+
+msgid "action flag"
+msgstr "händelseflagga"
+
+msgid "change message"
+msgstr "ändra meddelande"
+
+msgid "log entry"
+msgstr "loggpost"
+
+msgid "log entries"
+msgstr "loggposter"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Lade till \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Ändrade \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Tog bort \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry-Objekt"
+
+msgid "None"
+msgstr "Inget"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Håll ner \"Control\", eller \"Command\" på en Mac, för att välja fler än en."
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Ändrade %s."
+
+msgid "and"
+msgstr "och"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lade till %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Ändrade %(list)s på %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Tog bort %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Inga fält ändrade."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" lades till. Du kan redigera objektet igen nedanför."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" lades till. Du kan lägga till ytterligare %(name)s "
+"nedan."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" lades till."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" ändrades. Du kan ändra det igen nedan."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ändrades."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Poster måste väljas för att genomföra åtgärder. Inga poster har ändrats."
+
+msgid "No action selected."
+msgstr "Inga åtgärder valda."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" togs bort."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s-objekt med primärnyckel %(key)r finns inte."
+
+#, python-format
+msgid "Add %s"
+msgstr "Lägg till %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Ändra %s"
+
+msgid "Database error"
+msgstr "Databasfel"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s ändrades."
+msgstr[1] "%(count)s %(name)s ändrades."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s vald"
+msgstr[1] "Alla %(total_count)s valda"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 av %(cnt)s valda"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Ändringshistorik: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Borttagning av %(class_name)s %(instance)s kräver borttagning av följande "
+"skyddade relaterade objekt: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django webbplatsadministration"
+
+msgid "Django administration"
+msgstr "Django-administration"
+
+msgid "Site administration"
+msgstr "Webbplatsadministration"
+
+msgid "Log in"
+msgstr "Logga in"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Administration av %(app)s"
+
+msgid "Page not found"
+msgstr "Sidan kunde inte hittas"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi beklagar men den begärda sidan hittades inte."
+
+msgid "Home"
+msgstr "Hem"
+
+msgid "Server error"
+msgstr "Serverfel"
+
+msgid "Server error (500)"
+msgstr "Serverfel (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfel <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Det har uppstått ett fel. Det har rapporterats till "
+"webbplatsadministratörerna via e-post och bör bli rättat omgående. Tack för "
+"ditt tålamod."
+
+msgid "Run the selected action"
+msgstr "Kör markerade operationer"
+
+msgid "Go"
+msgstr "Utför"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Klicka här för att välja alla objekt från alla sidor"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Välj alla %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Rensa urval"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Ange först ett användarnamn och ett lösenord. Efter det kommer du att få "
+"fler användaralternativ."
+
+msgid "Enter a username and password."
+msgstr "Mata in användarnamn och lösenord."
+
+msgid "Change password"
+msgstr "Ändra lösenord"
+
+msgid "Please correct the error below."
+msgstr "Rätta till felen nedan."
+
+msgid "Please correct the errors below."
+msgstr "Vänligen rätta till felen nedan."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Ange nytt lösenord för användare <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Välkommen,"
+
+msgid "View site"
+msgstr "Visa sida"
+
+msgid "Documentation"
+msgstr "Dokumentation"
+
+msgid "Log out"
+msgstr "Logga ut"
+
+msgid "Add"
+msgstr "Lägg till"
+
+msgid "History"
+msgstr "Historik"
+
+msgid "View on site"
+msgstr "Visa på webbplats"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lägg till %(name)s"
+
+msgid "Filter"
+msgstr "Filtrera"
+
+msgid "Remove from sorting"
+msgstr "Ta bort från sortering"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sorteringsprioritet: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Ändra sorteringsordning"
+
+msgid "Delete"
+msgstr "Radera"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att "
+"relaterade objekt togs bort, men ditt konto har inte rättigheter att ta bort "
+"följande objekttyper:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Borttagning av %(object_name)s '%(escaped_object)s' kräver borttagning av "
+"följande skyddade relaterade objekt:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? "
+"Följande relaterade objekt kommer att tas bort:"
+
+msgid "Objects"
+msgstr "Objekt"
+
+msgid "Yes, I'm sure"
+msgstr "Ja, jag är säker"
+
+msgid "No, take me back"
+msgstr "Nej, ta mig tillbaka"
+
+msgid "Delete multiple objects"
+msgstr "Ta bort flera objekt"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Borttagning av valda %(objects_name)s skulle resultera i borttagning av "
+"relaterade objekt, men ditt konto har inte behörighet att ta bort följande "
+"typer av objekt:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Borttagning av valda %(objects_name)s skulle kräva borttagning av följande "
+"skyddade objekt:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Är du säker på att du vill ta bort valda %(objects_name)s? Alla följande "
+"objekt samt relaterade objekt kommer att tas bort: "
+
+msgid "Change"
+msgstr "Ändra"
+
+msgid "Remove"
+msgstr "Ta bort"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Lägg till ytterligare %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Radera?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " På %(filter_title)s "
+
+msgid "Summary"
+msgstr "Översikt"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Modeller i applikationen %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Du har inte rättigheter att redigera något."
+
+msgid "Recent Actions"
+msgstr "Senaste Händelser"
+
+msgid "My Actions"
+msgstr "Mina händelser"
+
+msgid "None available"
+msgstr "Inga tillgängliga"
+
+msgid "Unknown content"
+msgstr "Okänt innehåll"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Någonting är fel med din databasinstallation. Se till att de rätta "
+"databastabellerna har skapats och att databasen är läsbar av rätt användare."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Har du glömt lösenordet eller användarnamnet?"
+
+msgid "Date/time"
+msgstr "Datum tid"
+
+msgid "User"
+msgstr "Användare"
+
+msgid "Action"
+msgstr "Händelse"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Detta objekt har ingen ändringshistorik. Det lades antagligen inte till via "
+"denna administrationssida."
+
+msgid "Show all"
+msgstr "Visa alla"
+
+msgid "Save"
+msgstr "Spara"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Ändra markerade %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Lägg till %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Ta bort markerade %(model)s"
+
+msgid "Search"
+msgstr "Sök"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s resultat"
+msgstr[1] "%(counter)s resultat"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+msgid "Save as new"
+msgstr "Spara som ny"
+
+msgid "Save and add another"
+msgstr "Spara och lägg till ny"
+
+msgid "Save and continue editing"
+msgstr "Spara och fortsätt redigera"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tack för att du spenderade lite kvalitetstid med webbplatsen idag."
+
+msgid "Log in again"
+msgstr "Logga in igen"
+
+msgid "Password change"
+msgstr "Ändra lösenord"
+
+msgid "Your password was changed."
+msgstr "Ditt lösenord har ändrats."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Var god fyll i ditt gamla lösenord för säkerhets skull och skriv sedan in "
+"ditt nya lösenord två gånger så vi kan kontrollera att du skrev det rätt."
+
+msgid "Change my password"
+msgstr "Ändra mitt lösenord"
+
+msgid "Password reset"
+msgstr "Nollställ lösenord"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Ditt lösenord har ändrats. Du kan nu logga in."
+
+msgid "Password reset confirmation"
+msgstr "Bekräftelse av lösenordsnollställning"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Var god fyll i ditt nya lösenord två gånger så vi kan kontrollera att du "
+"skrev det rätt."
+
+msgid "New password:"
+msgstr "Nytt lösenord:"
+
+msgid "Confirm password:"
+msgstr "Bekräfta lösenord:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Länken för lösenordsnollställning var felaktig, möjligen därför att den "
+"redan använts. Var god skicka en ny nollställningsförfrågan."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Vi har skickat ett email till dig med instruktioner hur du återställer ditt "
+"lösenord om ett konto med mailadressen du fyllt i existerar. Det borde dyka "
+"upp i din inkorg inom kort."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Om ni inte får ett e-brev, vänligen kontrollera att du har skrivit in "
+"adressen du registrerade dig med och kolla din skräppostmapp."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Du får detta e-postmeddelande för att du har begärt återställning av ditt "
+"lösenord av ditt konto på %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Var god gå till följande sida och välj ett nytt lösenord:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Ditt användarnamn (i fall du skulle ha glömt det):"
+
+msgid "Thanks for using our site!"
+msgstr "Tack för att du använder vår webbplats!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s-teamet"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Glömt ditt lösenord? Fyll i din e-postadress nedan så skickar vi ett e-"
+"postmeddelande med instruktioner för hur du ställer in ett nytt."
+
+msgid "Email address:"
+msgstr "E-postadress:"
+
+msgid "Reset my password"
+msgstr "Nollställ mitt lösenord"
+
+msgid "All dates"
+msgstr "Alla datum"
+
+#, python-format
+msgid "Select %s"
+msgstr "Välj %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Välj %s att ändra"
+
+msgid "Date:"
+msgstr "Datum:"
+
+msgid "Time:"
+msgstr "Tid:"
+
+msgid "Lookup"
+msgstr "Uppslag"
+
+msgid "Currently:"
+msgstr "Nuvarande:"
+
+msgid "Change:"
+msgstr "Ändra:"
diff --git a/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1328688
--- /dev/null
+++ b/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e722707
--- /dev/null
+++ b/tbc/static/admin/locale/sv/LC_MESSAGES/djangojs.po
@@ -0,0 +1,167 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Andreas Pelme <andreas@pelme.se>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Jonathan Lindén, 2014
+# Mattias Jansson <mattias@colourandcode.se>, 2011
+# Samuel Linde <samuel@linde.im>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Swedish (http://www.transifex.com/django/django/language/"
+"sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Tillgängliga %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Detta är listan med tillgängliga %s. Du kan välja ut vissa genom att markera "
+"dem i rutan nedan och sedan klicka på \"Välj\"-knapparna mellan de två "
+"rutorna."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s."
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Choose all"
+msgstr "Välj alla"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Klicka för att välja alla %s på en gång."
+
+msgid "Choose"
+msgstr "Välj"
+
+msgid "Remove"
+msgstr "Ta bort"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Välj %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Detta är listan med utvalda %s. Du kan ta bort vissa genom att markera dem i "
+"rutan nedan och sedan klicka på \"Ta bort\"-pilen mellan de två rutorna."
+
+msgid "Remove all"
+msgstr "Ta bort alla"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Klicka för att ta bort alla valda %s på en gång."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s av %(cnt)s markerade"
+msgstr[1] "%(sel)s av %(cnt)s markerade"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Du har ändringar som inte sparats i enskilda redigerbara fält. Om du kör en "
+"operation kommer de ändringar som inte sparats att gå förlorade."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Du har markerat en operation, men du har inte sparat sparat dina ändringar "
+"till enskilda fält ännu. Var vänlig klicka OK för att spara. Du kommer att "
+"behöva köra operationen på nytt."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Du har markerat en operation och du har inte gjort några ändringar i "
+"enskilda fält. Du letar antagligen efter Utför-knappen snarare än Spara."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Notera: Du är %s timme före serverns tid."
+msgstr[1] "Notera: Du är %s timmar före serverns tid."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Notera: Du är %s timme efter serverns tid."
+msgstr[1] "Notera: Du är %s timmar efter serverns tid."
+
+msgid "Now"
+msgstr "Nu"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Välj en tidpunkt"
+
+msgid "Midnight"
+msgstr "Midnatt"
+
+msgid "6 a.m."
+msgstr "06:00"
+
+msgid "Noon"
+msgstr "Middag"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Avbryt"
+
+msgid "Today"
+msgstr "I dag"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "I går"
+
+msgid "Tomorrow"
+msgstr "I morgon"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januari Februari Mars April Maj Juni Juli Augusti September Oktober November "
+"December"
+
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+msgid "Show"
+msgstr "Visa"
+
+msgid "Hide"
+msgstr "Göm"
diff --git a/tbc/static/admin/locale/sw/LC_MESSAGES/django.mo b/tbc/static/admin/locale/sw/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..2a39996
--- /dev/null
+++ b/tbc/static/admin/locale/sw/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sw/LC_MESSAGES/django.po b/tbc/static/admin/locale/sw/LC_MESSAGES/django.po
new file mode 100644
index 0000000..700ecb2
--- /dev/null
+++ b/tbc/static/admin/locale/sw/LC_MESSAGES/django.po
@@ -0,0 +1,675 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Emil <bmachaku@gmail.com>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Swahili (http://www.transifex.com/django/django/language/"
+"sw/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sw\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Umefanikiwa kufuta %(items)s %(count)d."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Huwezi kufuta %(name)s"
+
+msgid "Are you sure?"
+msgstr "Una uhakika?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Futa %(verbose_name_plural)s teule"
+
+msgid "Administration"
+msgstr "Utawala"
+
+msgid "All"
+msgstr "yote"
+
+msgid "Yes"
+msgstr "Ndiyo"
+
+msgid "No"
+msgstr "Hapana"
+
+msgid "Unknown"
+msgstr "Haijulikani"
+
+msgid "Any date"
+msgstr "Tarehe yoyote"
+
+msgid "Today"
+msgstr "Leo"
+
+msgid "Past 7 days"
+msgstr "Siku 7 zilizopita"
+
+msgid "This month"
+msgstr "mwezi huu"
+
+msgid "This year"
+msgstr "Mwaka huu"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Tafadhali ingiza %(username)s na nywila sahihi kwa akaunti ya msimamizi. "
+"Kumbuka kuzingatia herufi kubwa na ndogo."
+
+msgid "Action:"
+msgstr "Tendo"
+
+msgid "action time"
+msgstr "muda wa tendo"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "Kitambulisho cha kitu"
+
+msgid "object repr"
+msgstr "`repr` ya kitu"
+
+msgid "action flag"
+msgstr "bendera ya tendo"
+
+msgid "change message"
+msgstr "badilisha ujumbe"
+
+msgid "log entry"
+msgstr "ingizo kwenye kumbukumbu"
+
+msgid "log entries"
+msgstr "maingizo kwenye kumbukumbu"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Kuongezwa kwa \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Kubadilishwa kwa \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Kufutwa kwa \"%(object)s\"."
+
+msgid "LogEntry Object"
+msgstr "Kitu cha Ingizo la Kumbukumbu"
+
+msgid "None"
+msgstr "Hakuna"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "Mabadiliko ya %s."
+
+msgid "and"
+msgstr "na"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Ingizo la %(name)s \"%(object)s\" limefanyika "
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Mabadiliko %(list)s yamefanyoka kwa %(object)s \"%(name)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Kumefutwa kwa %(name)s \"%(object)s\" kumefanyika."
+
+msgid "No fields changed."
+msgstr "Hakuna uga uliobadilishwa."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Ingizo la \"%(obj)s\" %(name)s limefanyika kwa mafanikio. Unaweza "
+"kuhariritena hapo chini."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ingizo la \"%(obj)s\" %(name)s limefanyika kwa mafanikio. Unaweza tena "
+"kuongeza %(name)s hapo chini."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Ingizo la \"%(obj)s\" %(name)s limefanyika kwa mafanikio."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"Ingizo la \"%(obj)s\" %(name)s limebadilishwa kwa mafanikio. Unaweza tena "
+"kulihariri hapo chini."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Ingizo la \"%(obj)s\" %(name)s limebadilishwa kwa mafanikio. Unaweza "
+"kuongeza %(name)s hapo chini."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Mabadiliko ya \"%(obj)s\" %(name)s yamefanikiwa."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Nilazima kuchagua vitu ili kufanyia kitu fulani. Hakuna kitu "
+"kilichochaguliwa."
+
+msgid "No action selected."
+msgstr "Hakuna tendo lililochaguliwa"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Ufutaji wa \"%(obj)s\" %(name)s umefanikiwa."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Hakuna %(name)s yenye `primary key` %(key)r."
+
+#, python-format
+msgid "Add %s"
+msgstr "Ongeza %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Badilisha %s"
+
+msgid "Database error"
+msgstr "Hitilafu katika hifadhidata"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "mabadiliko ya %(name)s %(count)s yamefanikiwa."
+msgstr[1] "mabadiliko ya %(name)s %(count)s yamefanikiwa."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s kuchaguliwa"
+msgstr[1] "%(total_count)s (kila kitu) kuchaguliwa"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Vilivyo chaguliwa ni 0 kati ya %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Badilisha historia: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(instance)s %(class_name)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Kufutwa kwa ingizo la %(instance)s %(class_name)s kutahitaji kufutwa kwa "
+"vitu vifuatavyo vyenye mahusiano vilivyokingwa: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Utawala wa tovuti ya django"
+
+msgid "Django administration"
+msgstr "Utawala wa Django"
+
+msgid "Site administration"
+msgstr "Utawala wa tovuti"
+
+msgid "Log in"
+msgstr "Ingia"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Utawala wa %(app)s"
+
+msgid "Page not found"
+msgstr "Ukurasa haujapatikana"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Samahani, ukurasa uliohitajika haukupatikana."
+
+msgid "Home"
+msgstr "Sebule"
+
+msgid "Server error"
+msgstr "Hitilafu ya seva"
+
+msgid "Server error (500)"
+msgstr "Hitilafu ya seva (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Hitilafu ya seva <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Kumekuwa na hitilafu. Imeripotiwa kwa watawala kupitia barua pepe na "
+"inatakiwa kurekebishwa mapema."
+
+msgid "Run the selected action"
+msgstr "Fanya tendo lililochaguliwa."
+
+msgid "Go"
+msgstr "Nenda"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Bofya hapa kuchagua viumbile katika kurasa zote"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Chagua kila %(module_name)s, (%(total_count)s). "
+
+msgid "Clear selection"
+msgstr "Safisha chaguo"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Kwanza, ingiza jina lamtumiaji na nywila. Kisha, utaweza kuhariri zaidi "
+"machaguo ya mtumiaji."
+
+msgid "Enter a username and password."
+msgstr "Ingiza jina la mtumiaji na nywila."
+
+msgid "Change password"
+msgstr "Badilisha nywila"
+
+msgid "Please correct the error below."
+msgstr "Tafadhali sahihisha makosa yafuatayo "
+
+msgid "Please correct the errors below."
+msgstr "Tafadhali sahihisha makosa yafuatayo."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "ingiza nywila ya mtumiaji <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Karibu"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Nyaraka"
+
+msgid "Log out"
+msgstr "Toka"
+
+msgid "Add"
+msgstr "Ongeza"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "View on site"
+msgstr "Ona kwenye tovuti"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ongeza %(name)s"
+
+msgid "Filter"
+msgstr "Chuja"
+
+msgid "Remove from sorting"
+msgstr "Ondoa katika upangaji"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Kipaumbele katika mpangilio: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Geuza mpangilio"
+
+msgid "Delete"
+msgstr "Futa"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Kufutwa kwa '%(escaped_object)s' %(object_name)s kutasababisha kufutwa kwa "
+"vitu vinavyohuisana, lakini akaunti yako haina ruhusa ya kufuta vitu vya "
+"aina zifuatazo:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Kufuta '%(escaped_object)s' %(object_name)s kutahitaji kufuta vitu "
+"vifuatavyo ambavyo vinavyohuisana na vimelindwa:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Una uhakika kuwa unataka kufuta \"%(escaped_object)s\" %(object_name)s ? "
+"Vitu vyote vinavyohuisana kati ya vifuatavyo vitafutwa:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Ndiyo, Nina uhakika"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Futa viumbile mbalimbali"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Kufutwa kwa %(objects_name)s chaguliwa kutasababisha kufutwa kwa "
+"vituvinavyohusiana, lakini akaunti yako haina ruhusa ya kufuta vitu vya "
+"vifuatavyo:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Kufutwa kwa %(objects_name)s kutahitaji kufutwa kwa vitu vifuatavyo vyenye "
+"uhusiano na vilivyolindwa:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Una uhakika kuwa unataka kufuta %(objects_name)s chaguliwa ? Vitu vyote kati "
+"ya vifuatavyo vinavyohusiana vitafutwa:"
+
+msgid "Change"
+msgstr "Badilisha"
+
+msgid "Remove"
+msgstr "Ondoa"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Ongeza %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Futa?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Kwa %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Models katika application %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Huna ruhusa ya kuhariri chochote"
+
+msgid "Recent Actions"
+msgstr "Matendo ya hivi karibuni"
+
+msgid "My Actions"
+msgstr "Matendo yangu"
+
+msgid "None available"
+msgstr "Hakuna kilichopatikana"
+
+msgid "Unknown content"
+msgstr "Maudhui hayajulikani"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Kuna tatizo limetokea katika usanikishaji wako wa hifadhidata. Hakikisha "
+"kuwa majedwali sahihi ya hifadhidata yameundwa, na hakikisha hifadhidata "
+"inaweza kusomwana mtumiaji sahihi."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Umesahau jina na nenosiri lako?"
+
+msgid "Date/time"
+msgstr "Tarehe/saa"
+
+msgid "User"
+msgstr "Mtumiaji"
+
+msgid "Action"
+msgstr "Tendo"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Kiumbile hiki hakina historia ya kubadilika. Inawezekana hakikuwekwa kupitia "
+"hii tovuti ya utawala."
+
+msgid "Show all"
+msgstr "Onesha yotee"
+
+msgid "Save"
+msgstr "Hifadhi"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Tafuta"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "tokeo %(counter)s"
+msgstr[1] "matokeo %(counter)s"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "jumla %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Hifadhi kama mpya"
+
+msgid "Save and add another"
+msgstr "Hifadhi na ongeza"
+
+msgid "Save and continue editing"
+msgstr "Hifadhi na endelea kuhariri"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ahsante kwa kutumia muda wako katika Tovuti yetu leo. "
+
+msgid "Log in again"
+msgstr "ingia tena"
+
+msgid "Password change"
+msgstr "Badilisha nywila"
+
+msgid "Your password was changed."
+msgstr "Nywila yako imebadilishwa"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Tafadhali ingiza nywila yako ya zamani, kwa ajili ya usalama, kisha ingiza "
+"nywila mpya mara mbili ili tuweze kuthibitisha kuwa umelichapisha kwa "
+"usahihi."
+
+msgid "Change my password"
+msgstr "Badilisha nywila yangu"
+
+msgid "Password reset"
+msgstr "Kuseti nywila upya"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Nywila yako imesetiwa. Unaweza kuendelea na kuingia sasa."
+
+msgid "Password reset confirmation"
+msgstr "Uthibitisho wa kuseti nywila upya"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Tafadhali ingiza nywila mpya mara mbili ili tuweze kuthibitisha kuwa "
+"umelichapisha kwa usahihi."
+
+msgid "New password:"
+msgstr "Nywila mpya:"
+
+msgid "Confirm password:"
+msgstr "Thibitisha nywila"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Kiungo cha kuseti nywila upya ni batili, inawezekana ni kwa sababu kiungo "
+"hicho tayari kimetumika. tafadhali omba upya kuseti nywila."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Ikiwa hujapata barua pepe, tafadhali hakikisha umeingiza anuani ya barua "
+"pepe uliyoitumia kujisajili na angalia katika folda la spam"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Umepata barua pepe hii kwa sababu ulihitaji ku seti upya nywila ya akaunti "
+"yako ya %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Tafadhali nenda ukurasa ufuatao na uchague nywila mpya:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Jina lako la mtumiaji, ikiwa umesahau:"
+
+msgid "Thanks for using our site!"
+msgstr "Ahsante kwa kutumia tovui yetu!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "timu ya %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Umesahau nywila yako? Ingiza anuani yako ya barua pepe hapo chini, nasi "
+"tutakutumia maelekezo ya kuseti nenosiri jipya. "
+
+msgid "Email address:"
+msgstr "Anuani ya barua pepe:"
+
+msgid "Reset my password"
+msgstr "Seti nywila yangu upya"
+
+msgid "All dates"
+msgstr "Tarehe zote"
+
+#, python-format
+msgid "Select %s"
+msgstr "Chagua %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Chaguo %s kwa mabadilisho"
+
+msgid "Date:"
+msgstr "Tarehe"
+
+msgid "Time:"
+msgstr "Saa"
+
+msgid "Lookup"
+msgstr "`Lookup`"
+
+msgid "Currently:"
+msgstr "Kwa sasa:"
+
+msgid "Change:"
+msgstr "Badilisha:"
diff --git a/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..c135cd6
--- /dev/null
+++ b/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..edae9c9
--- /dev/null
+++ b/tbc/static/admin/locale/sw/LC_MESSAGES/djangojs.po
@@ -0,0 +1,163 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Emil <bmachaku@gmail.com>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Swahili (http://www.transifex.com/django/django/language/"
+"sw/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sw\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Yaliyomo: %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Hii ni orodha ya %s uliyochagua. Unaweza kuchagua baadhi vitu kwa kuvichagua "
+"katika kisanduku hapo chini kisha kubofya mshale wa \"Chagua\" kati ya "
+"visanduku viwili."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Chapisha katika kisanduku hiki ili kuchuja orodha ya %s iliyopo."
+
+msgid "Filter"
+msgstr "Chuja"
+
+msgid "Choose all"
+msgstr "Chagua vyote"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Bofya kuchagua %s kwa pamoja."
+
+msgid "Choose"
+msgstr "Chagua"
+
+msgid "Remove"
+msgstr "Ondoa"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Chaguo la %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Hii ni orodha ya %s uliyochagua. Unaweza kuondoa baadhi vitu kwa kuvichagua "
+"katika kisanduku hapo chini kisha kubofya mshale wa \"Ondoa\" kati ya "
+"visanduku viwili."
+
+msgid "Remove all"
+msgstr "Ondoa vyote"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Bofya ili kuondoa %s chaguliwa kwa pamoja."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "umechagua %(sel)s kati ya %(cnt)s"
+msgstr[1] "umechagua %(sel)s kati ya %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Umeacha kuhifadhi mabadiliko katika uga zinazoharirika. Ikiwa utafanya tendo "
+"lingine, mabadiliko ambayo hayajahifadhiwa yatapotea."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. "
+"Tafadali bofya Sawa ukitaka kuhifadhi. Utahitajika kufanya upya kitendo "
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. "
+"Inawezekana unatafuta kitufe cha Nenda badala ya Hifadhi"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Kumbuka: Uko saa %s mbele ukilinganisha na majira ya seva"
+msgstr[1] "Kumbuka: Uko masaa %s mbele ukilinganisha na majira ya seva"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Kumbuka: Uko saa %s nyuma ukilinganisha na majira ya seva"
+msgstr[1] "Kumbuka: Uko masaa %s nyuma ukilinganisha na majira ya seva"
+
+msgid "Now"
+msgstr "Sasa"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Chagua wakati"
+
+msgid "Midnight"
+msgstr "Usiku wa manane"
+
+msgid "6 a.m."
+msgstr "Saa 12 alfajiri"
+
+msgid "Noon"
+msgstr "Adhuhuri"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Ghairi"
+
+msgid "Today"
+msgstr "Leo"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Jana"
+
+msgid "Tomorrow"
+msgstr "Kesho"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januari Februari Machi Aprili Mei Juni Julai Agosti Septemba Oktoba Novemba "
+"Desemba"
+
+msgid "S M T W T F S"
+msgstr "J2 J3 J4 J5 IJ JM JP"
+
+msgid "Show"
+msgstr "Onesha"
+
+msgid "Hide"
+msgstr "Ficha"
diff --git a/tbc/static/admin/locale/ta/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ta/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d73fc2e
--- /dev/null
+++ b/tbc/static/admin/locale/ta/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ta/LC_MESSAGES/django.po b/tbc/static/admin/locale/ta/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b9ddef1
--- /dev/null
+++ b/tbc/static/admin/locale/ta/LC_MESSAGES/django.po
@@ -0,0 +1,637 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr "உறுதியாக சொல்கிறீர்களா?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "அனைத்தும்"
+
+msgid "Yes"
+msgstr "ஆம்"
+
+msgid "No"
+msgstr "இல்லை"
+
+msgid "Unknown"
+msgstr "தெரியாத"
+
+msgid "Any date"
+msgstr "எந்த தேதியும்"
+
+msgid "Today"
+msgstr "இன்று"
+
+msgid "Past 7 days"
+msgstr "கடந்த 7 நாட்களில்"
+
+msgid "This month"
+msgstr "இந்த மாதம்"
+
+msgid "This year"
+msgstr "இந்த வருடம்"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr "செயல் நேரம்"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "பொருள் அடையாளம்"
+
+msgid "object repr"
+msgstr "பொருள் உருவகித்தம்"
+
+msgid "action flag"
+msgstr "செயர்குறி"
+
+msgid "change message"
+msgstr "செய்தியை மாற்று"
+
+msgid "log entry"
+msgstr "புகுபதிவு உள்ளீடு"
+
+msgid "log entries"
+msgstr "புகுபதிவு உள்ளீடுகள்"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s மாற்றபட்டுள்ளது."
+
+msgid "and"
+msgstr "மற்றும்"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr "எந்த புலமும் மாறவில்லை."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" வெற்றிகரமாக சேர்க்கப்பட்டுள்ளது. நீங்கள் கீழே தொகுக்க முடியும்."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாகச் சேர்க்கப்பட்டது."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக மாற்றப்பட்டது."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக அழிக்கப்பட்டுள்ளது."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr "%s யை சேர்க்க"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s யை மாற்று"
+
+msgid "Database error"
+msgstr "தகவல்சேமிப்பு பிழை"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr "வரலாற்றை மாற்று: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "டிஜாங்ஙோ தள நிர்வாகி"
+
+msgid "Django administration"
+msgstr "டிஜாங்ஙோ நிர்வாகம் "
+
+msgid "Site administration"
+msgstr "இணைய மேலான்மை"
+
+msgid "Log in"
+msgstr "உள்ளே போ"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "பக்கத்தைக் காணவில்லை"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "நீங்கள் விரும்பிய பக்கத்தை காண இயலவில்லை,அதற்காக நாங்கள் வருந்துகிறோம்."
+
+msgid "Home"
+msgstr "வீடு"
+
+msgid "Server error"
+msgstr "சேவகன் பிழை"
+
+msgid "Server error (500)"
+msgstr "சேவையகம் தவறு(500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "சேவையகம் பிழை<em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr "செல்"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"முதலில்,பயனர்ப்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.அதன் பிறகு தான் நீங்கள் உங்கள் பெயரின் "
+"விவரங்களை திருத்த முடியும்"
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr "கடவுச்சொல்லை மாற்று"
+
+msgid "Please correct the error below."
+msgstr "கீழே உள்ள தவறுகளைத் திருத்துக"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "நல்வரவு,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "ஆவனமாக்கம்"
+
+msgid "Log out"
+msgstr "வெளியேறு"
+
+msgid "Add"
+msgstr "சேர்க்க"
+
+msgid "History"
+msgstr "வரலாறு"
+
+msgid "View on site"
+msgstr "தளத்தில் பார்"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s சேர்க்க"
+
+msgid "Filter"
+msgstr "வடிகட்டி"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "நீக்குக"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"நீக்கும் '%(escaped_object)s' ஆனது %(object_name)s தொடர்புடைய மற்றவற்றையும் நீக்கும். "
+"ஆனால் அதை நீக்குவதற்குரிய உரிமை உங்களுக்கு இல்லை"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"நீங்கள் இந்த \"%(escaped_object)s\" %(object_name)s நீக்குவதில் நிச்சயமா?தொடர்புடைய "
+"மற்றவையும் நீக்கப்படும். "
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ஆம், எனக்கு உறுதி"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "மாற்றுக"
+
+msgid "Remove"
+msgstr "அழிக்க"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ஆல்"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "உங்களுக்கு மாற்றுவதற்குரிய உரிமையில்லை"
+
+msgid "Recent Actions"
+msgstr "தற்போதைய செயல்கள்"
+
+msgid "My Actions"
+msgstr "எனது செயல்கள்"
+
+msgid "None available"
+msgstr "எதுவும் கிடைக்கவில்லை"
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"உங்களுடைய தகவல்சேமிப்பகத்தை நிறுவுவதில் சில தவறுகள் உள்ளது. அதற்கு இணையான "
+"தகவல்சேமிப்பு அட்டவணையைதயாரிக்கவும். மேலும் பயனர் படிக்கும் படியான தகவல்சேமிப்பகத்தை "
+"உருவாக்கவும்."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "தேதி/நேரம் "
+
+msgid "User"
+msgstr "பயனர்"
+
+msgid "Action"
+msgstr "செயல்"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"இந்த பொருள் மாற்று வரலாற்றில் இல்லைஒரு வேளை நிர்வாகத்தளத்தின் மூலம் சேர்க்கப்படாமலிருக்கலாம்"
+
+msgid "Show all"
+msgstr "எல்லாவற்றையும் காட்டு"
+
+msgid "Save"
+msgstr "சேமிக்க"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s மொத்தம்"
+
+msgid "Save as new"
+msgstr "புதியதாக சேமி"
+
+msgid "Save and add another"
+msgstr "சேமித்து இன்னுமொன்றைச் சேர்"
+
+msgid "Save and continue editing"
+msgstr "சேமித்து மாற்றத்தை தொடருக"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "வலைத்தளத்தில் உங்களது பொன்னான நேரத்தை செலவழித்தமைக்கு மிகுந்த நன்றி"
+
+msgid "Log in again"
+msgstr "மீண்டும் உள்ளே பதிவு செய்யவும்"
+
+msgid "Password change"
+msgstr "கடவுச்சொல் மாற்று"
+
+msgid "Your password was changed."
+msgstr "உங்களுடைய கடவுச்சொல் மாற்றபட்டது"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"பாதுகாப்பு காரணங்களுக்காக , முதலில் உங்களது பழைய கடவுச்சொல்லை உள்ளிடுக. அதன் பிறகு "
+"புதிய கடவுச்சொல்லை இரு முறை உள்ளிடுக. இது உங்களது உள்ளிடுதலை சரிபார்க்க உதவும். "
+
+msgid "Change my password"
+msgstr "கடவுச் சொல்லை மாற்றவும்"
+
+msgid "Password reset"
+msgstr "கடவுச்சொல்லை மாற்றியமை"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr "புதிய கடவுச்சொல்:"
+
+msgid "Confirm password:"
+msgstr "கடவுச்சொலின் மாற்றத்தை உறுதிப்படுத்து:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr "உங்களது பயனாளர் பெயர், நீங்கள் மறந்திருந்தால்:"
+
+msgid "Thanks for using our site!"
+msgstr "எங்களது வலைத்தளத்தை பயன் படுத்தியதற்கு மிகுந்த நன்றி"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "இந்த %(site_name)s -இன் குழு"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "எனது கடவுச்சொல்லை மாற்றியமை"
+
+msgid "All dates"
+msgstr "அனைத்து தேதியும்"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s யை தேர்ந்தெடு"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s யை மாற்ற தேர்ந்தெடு"
+
+msgid "Date:"
+msgstr "தேதி:"
+
+msgid "Time:"
+msgstr "நேரம்:"
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..2a51d74
--- /dev/null
+++ b/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c52defe
--- /dev/null
+++ b/tbc/static/admin/locale/ta/LC_MESSAGES/djangojs.po
@@ -0,0 +1,148 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%s இருக்கிறதா "
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "வடிகட்டி"
+
+msgid "Choose all"
+msgstr "எல்லாவற்றையும் தேர்ந்த்தெடுக்க"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "அழிக்க"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s தேர்ந்த்தெடுக்கப்பட்ட"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "இப்பொழுது "
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ஒரு நேரத்தை தேர்ந்த்தெடுக்க "
+
+msgid "Midnight"
+msgstr "நடு இரவு "
+
+msgid "6 a.m."
+msgstr "காலை 6 மணி "
+
+msgid "Noon"
+msgstr "மதியம் "
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "வேண்டாம் "
+
+msgid "Today"
+msgstr "இன்று "
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "நேற்று "
+
+msgid "Tomorrow"
+msgstr "நாளை"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ஜனவரி பிப்ரவரி மார்ச் ஏப்ரல் மே ஜூன் ஜூலை ஆகஸ்டு செப்டம்பர் அக்டோபர் நவம்பர் டிசம்பர்"
+
+msgid "S M T W T F S"
+msgstr "ஞா தி செ பு வி வெ ச"
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/te/LC_MESSAGES/django.mo b/tbc/static/admin/locale/te/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..f4abef3
--- /dev/null
+++ b/tbc/static/admin/locale/te/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/te/LC_MESSAGES/django.po b/tbc/static/admin/locale/te/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ad003fb
--- /dev/null
+++ b/tbc/static/admin/locale/te/LC_MESSAGES/django.po
@@ -0,0 +1,633 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# bhaskar teja yerneni <prudhviy@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# ప్రవీణ్ ఇళ్ళ <mail2ipn@gmail.com>, 2011,2013
+# వీవెన్ <veeven@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: te\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s జయప్రదముగా తీసేవేయబడినది."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s తొలగించుట వీలుకాదు"
+
+msgid "Are you sure?"
+msgstr "మీరు ఖచ్చితంగా ఇలా చేయాలనుకుంటున్నారా?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "ఎంచుకోన్న %(verbose_name_plural)s తీసివేయుము "
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "అన్నీ"
+
+msgid "Yes"
+msgstr "అవును"
+
+msgid "No"
+msgstr "కాదు"
+
+msgid "Unknown"
+msgstr "తెలియనది"
+
+msgid "Any date"
+msgstr "ఏ రోజైన"
+
+msgid "Today"
+msgstr "ఈ రోజు"
+
+msgid "Past 7 days"
+msgstr "గత 7 రోజుల గా"
+
+msgid "This month"
+msgstr "ఈ నెల"
+
+msgid "This year"
+msgstr "ఈ సంవత్సరం"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "చర్య:"
+
+msgid "action time"
+msgstr "పని సమయము "
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "వస్తువు"
+
+msgid "object repr"
+msgstr "వస్తువు"
+
+msgid "action flag"
+msgstr "పని ఫ్లాగ్"
+
+msgid "change message"
+msgstr "సందేశము ని మార్చంది"
+
+msgid "log entry"
+msgstr "లాగ్ ఎంట్రీ"
+
+msgid "log entries"
+msgstr "లాగ్ ఎంట్రీలు"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "వొకటీ లేదు"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr " %s మార్చబడిండి"
+
+msgid "and"
+msgstr "మరియు"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" జతచేయబడినది."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" కొరకు %(list)s మార్చబడినది."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" తొలగిబడినది"
+
+msgid "No fields changed."
+msgstr "క్షేత్రములు ఏమి మార్చబడలేదు"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" జయప్రదంగా కలపబడ్డడి. మీరు మళ్ళీ దీనినీ క్రింద మార్చవచ్చు"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\"జయప్రదంగా కలపబడ్డడి"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" జయప్రదంగా మార్చబడిండి"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"అంశములపయి తదుపరి చర్య తీసుకోనటకు వాటిని ఎంపిక చేసుకోవలెను. ప్రస్తుతం ఎటువంటి అంశములు "
+"మార్చబడలేదు."
+
+msgid "No action selected."
+msgstr "మీరు ఎటువంటి చర్య తీసుకొనలేదు "
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" జయప్రదంగా తీసివేయబడ్డడి"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r ప్రధాన కీ గా వున్న %(name)s అంశం ఏమి లేదు."
+
+#, python-format
+msgid "Add %s"
+msgstr "%sని జత చేయండి "
+
+#, python-format
+msgid "Change %s"
+msgstr "%sని మార్చుము"
+
+msgid "Database error"
+msgstr "దత్తాంశస్థానము పొరబాటు "
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి."
+msgstr[1] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s ఎంపికయినది."
+msgstr[1] "అన్ని %(total_count)s ఎంపికయినవి."
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 of %(cnt)s ఎంపికయినవి."
+
+#, python-format
+msgid "Change history: %s"
+msgstr "చరిత్రం మార్చు: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "జాంగొ యొక్క నిర్వాహణదారులు"
+
+msgid "Django administration"
+msgstr "జాంగొ నిర్వాహణ"
+
+msgid "Site administration"
+msgstr "సైట్ నిర్వాహణ"
+
+msgid "Log in"
+msgstr "ప్రవేశించండి"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "పుట దొరకలేదు"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "క్షమించండి మీరు కోరిన పుట దొరకలేడు"
+
+msgid "Home"
+msgstr "నివాసము"
+
+msgid "Server error"
+msgstr "సర్వర్ పొరబాటు"
+
+msgid "Server error (500)"
+msgstr "సర్వర్ పొరబాటు (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "సర్వర్ పొరబాటు <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "ఎంచుకున్న చర్యను నడుపు"
+
+msgid "Go"
+msgstr "వెళ్లు"
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr "ఎంపికను తుడిచివేయి"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr "ఒక వాడుకరిపేరు మరియు సంకేతపదాన్ని ప్రవేశపెట్టండి."
+
+msgid "Change password"
+msgstr "సంకేతపదాన్ని మార్చుకోండి"
+
+msgid "Please correct the error below."
+msgstr "క్రింద ఉన్న తప్పులు సరిదిద్దుకోండి"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr "సుస్వాగతం"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "పత్రీకరణ"
+
+msgid "Log out"
+msgstr "నిష్క్రమించండి"
+
+msgid "Add"
+msgstr "చేర్చు"
+
+msgid "History"
+msgstr "చరిత్ర"
+
+msgid "View on site"
+msgstr "సైట్ లో చూడండి"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s జత చేయు"
+
+msgid "Filter"
+msgstr "వడపోత"
+
+msgid "Remove from sorting"
+msgstr "క్రమీకరణ నుండి తొలగించు"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "తొలగించు"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "అవును "
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "మార్చు"
+
+msgid "Remove"
+msgstr "తొలగించు"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr "తొలగించాలా?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "మీకు ఏది మార్చటానికి అధికారము లేదు"
+
+msgid "Recent Actions"
+msgstr "ఇటీవలి చర్యలు"
+
+msgid "My Actions"
+msgstr "నా చర్యలు"
+
+msgid "None available"
+msgstr "ఏమి దొరకలేదు"
+
+msgid "Unknown content"
+msgstr "తెలియని విషయం"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "మీ సంకేతపదం లేదా వాడుకరిపేరును మర్చిపోయారా?"
+
+msgid "Date/time"
+msgstr "తేదీ/సమయం"
+
+msgid "User"
+msgstr "వాడుకరి"
+
+msgid "Action"
+msgstr "చర్య"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr "అన్నీ చూపించు"
+
+msgid "Save"
+msgstr "భద్రపరుచు"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "వెతుకు"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s ఫలితం"
+msgstr[1] "%(counter)s ఫలితాలు"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s మొత్తము"
+
+msgid "Save as new"
+msgstr "కొత్త దాని లా దాచు"
+
+msgid "Save and add another"
+msgstr "దాచి కొత్త దానిని కలపండి"
+
+msgid "Save and continue editing"
+msgstr "దాచి మార్చుటా ఉందండి"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr "మళ్ళీ ప్రవేశించండి"
+
+msgid "Password change"
+msgstr "అనుమతి పదం మార్పు"
+
+msgid "Your password was changed."
+msgstr "మీ అనుమతి పదం మార్చబడిండి"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , "
+"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి "
+
+msgid "Change my password"
+msgstr "నా సంకేతపదాన్ని మార్చు"
+
+msgid "Password reset"
+msgstr "అనుమతి పదం తిరిగి అమర్చు"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "మీ అనుమతి పదం మర్చుబడినది. మీరు ఇప్పుదు లాగ్ ఇన్ అవ్వచ్చు."
+
+msgid "Password reset confirmation"
+msgstr "అనుమతి పదం తిరిగి మార్చు ఖాయం చెయండి"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , "
+"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి "
+
+msgid "New password:"
+msgstr "కొత్త సంకేతపదం:"
+
+msgid "Confirm password:"
+msgstr "సంకేతపదాన్ని నిర్ధారించండి:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr "మీ వాడుకరిపేరు, ఒక వేళ మీరు మర్చిపోయివుంటే:"
+
+msgid "Thanks for using our site!"
+msgstr "మా సైటుని ఉపయోగిస్తున్నందుకు ధన్యవాదములు!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s జట్టు"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr "ఈమెయిలు చిరునామా:"
+
+msgid "Reset my password"
+msgstr "అనుమతిపదం తిరిగి అమర్చు"
+
+msgid "All dates"
+msgstr "అన్నీ తేదీలు"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s ని ఎన్నుకోండి"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "%s ని మార్చటానికి ఎన్నుకోండి"
+
+msgid "Date:"
+msgstr "తారీఖు:"
+
+msgid "Time:"
+msgstr "సమయం:"
+
+msgid "Lookup"
+msgstr "అంశ శోధన."
+
+msgid "Currently:"
+msgstr "ప్రస్తుతం"
+
+msgid "Change:"
+msgstr "మార్చు:"
diff --git a/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..d6def02
--- /dev/null
+++ b/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..14d5b23
--- /dev/null
+++ b/tbc/static/admin/locale/te/LC_MESSAGES/djangojs.po
@@ -0,0 +1,149 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# bhaskar teja yerneni <prudhviy@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: te\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "ఆందుబాతులోఉన్న %s "
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "వడపోత"
+
+msgid "Choose all"
+msgstr "అన్నీ ఎన్నుకోండి"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "తీసివేయండి"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "ఎన్నుకున్న %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "ఇప్పుడు"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "ఒక సమయము ఎన్నుకోండి"
+
+msgid "Midnight"
+msgstr "ఆర్ధరాత్రి"
+
+msgid "6 a.m."
+msgstr "6 a.m"
+
+msgid "Noon"
+msgstr "మధ్యాహ్నము"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "రద్దు చేయు"
+
+msgid "Today"
+msgstr "ఈనాడు"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "నిన్న"
+
+msgid "Tomorrow"
+msgstr "రేపు"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ఙాన్వరి ఫిబ్రవరి మార్చి ఎప్రిల్ మే ఙూను ఙులై ఆగష్టు సెప్టెంబర్ అక్టోబర్ నవంబర్ డిసెంబర్"
+
+msgid "S M T W T F S"
+msgstr "ఆ సో మం భు గు శు శ"
+
+msgid "Show"
+msgstr "చూపించుము"
+
+msgid "Hide"
+msgstr "దాచు"
diff --git a/tbc/static/admin/locale/th/LC_MESSAGES/django.mo b/tbc/static/admin/locale/th/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..2833776
--- /dev/null
+++ b/tbc/static/admin/locale/th/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/th/LC_MESSAGES/django.po b/tbc/static/admin/locale/th/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d0ef745
--- /dev/null
+++ b/tbc/static/admin/locale/th/LC_MESSAGES/django.po
@@ -0,0 +1,647 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kowit Charoenratchatabhan <kowit.s.c@gmail.com>, 2013-2014
+# piti118 <piti118@gmail.com>, 2012
+# Suteepat Damrongyingsupab <tianissimo@hotmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Thai (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s ถูกลบเรียบร้อยแล้ว"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "ไม่สามารถลบ %(name)s"
+
+msgid "Are you sure?"
+msgstr "แน่ใจหรือ"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "ลบ %(verbose_name_plural)s ที่เลือก"
+
+msgid "Administration"
+msgstr "การจัดการ"
+
+msgid "All"
+msgstr "ทั้งหมด"
+
+msgid "Yes"
+msgstr "ใช่"
+
+msgid "No"
+msgstr "ไม่ใช่"
+
+msgid "Unknown"
+msgstr "ไม่รู้"
+
+msgid "Any date"
+msgstr "วันไหนก็ได้"
+
+msgid "Today"
+msgstr "วันนี้"
+
+msgid "Past 7 days"
+msgstr "สัปดาห์ที่แล้ว"
+
+msgid "This month"
+msgstr "เดือนนี้"
+
+msgid "This year"
+msgstr "ปีนี้"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr "กรุณาใส่ %(username)s และรหัสผ่านให้ถูกต้อง มีการแยกแยะตัวพิมพ์ใหญ่-เล็ก"
+
+msgid "Action:"
+msgstr "คำสั่ง :"
+
+msgid "action time"
+msgstr "เวลาลงมือ"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "อ็อบเจ็กต์ไอดี"
+
+msgid "object repr"
+msgstr "object repr"
+
+msgid "action flag"
+msgstr "action flag"
+
+msgid "change message"
+msgstr "เปลี่ยนข้อความ"
+
+msgid "log entry"
+msgstr "log entry"
+
+msgid "log entries"
+msgstr "log entries"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" ถูกเพิ่ม"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" ถูกเปลี่ยน - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" ถูกลบ"
+
+msgid "LogEntry Object"
+msgstr "อ็อบเจ็กต์ LogEntry"
+
+msgid "None"
+msgstr "ไม่มี"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s เปลี่ยนแล้ว"
+
+msgid "and"
+msgstr "และ"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "เพิ่ม %(name)s \"%(object)s\" แล้ว"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "เปลี่ยน %(list)s สำหรับ %(name)s \"%(object)s\" แล้ว"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "ลบ %(name)s \"%(object)s\" แล้ว"
+
+msgid "No fields changed."
+msgstr "ไม่มีฟิลด์ใดถูกเปลี่ยน"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "เพิ่ม %(name)s \"%(obj)s\" เรียบร้อยแล้ว แก้ไขได้อีกที่ด้านล่าง"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "เพิ่ม %(name)s \"%(obj)s\" เรียบร้อยแล้ว เพิ่ม %(name)s ได้อีกที่ด้านล่าง"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "เพิ่ม %(name)s \"%(obj)s\" เรียบร้อยแล้ว"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "เปลี่ยนแปลง %(name)s \"%(obj)s\" เรียบร้อยแล้ว แก้ไขได้อีกที่ด้านล่าง"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "เปลี่ยนแปลง %(name)s \"%(obj)s\" เรียบร้อยแล้ว เพิ่ม %(name)s ได้อีกที่ด้านล่าง"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "เปลี่ยนแปลง %(name)s \"%(obj)s\" เรียบร้อยแล้ว"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"ไม่มีรายการใดถูกเปลี่ยน\n"
+"รายการจะต้องถูกเลือกก่อนเพื่อที่จะทำตามคำสั่งได้"
+
+msgid "No action selected."
+msgstr "ไม่มีคำสั่งที่ถูกเลือก"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "ลบ %(name)s \"%(obj)s\" เรียบร้อยแล้ว"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "Primary key %(key)r ของอ็อบเจ็กต์ %(name)s ไม่มีอยู่"
+
+#, python-format
+msgid "Add %s"
+msgstr "เพิ่ม %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "เปลี่ยน %s"
+
+msgid "Database error"
+msgstr "เกิดความผิดพลาดที่ฐานข้อมูล"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(name)s จำนวน %(count)s อันได้ถูกเปลี่ยนแปลงเรียบร้อยแล้ว."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s ได้ถูกเลือก"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "เลือก 0 จาก %(cnt)s"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "เปลี่ยนแปลงประวัติ: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"กำลังลบ %(class_name)s %(instance)s จะต้องมีการลบอ็อบเจ็คต์ป้องกันที่เกี่ยวข้อง : "
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "ผู้ดูแลระบบ Django"
+
+msgid "Django administration"
+msgstr "การจัดการ Django"
+
+msgid "Site administration"
+msgstr "การจัดการไซต์"
+
+msgid "Log in"
+msgstr "เข้าสู่ระบบ"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "การจัดการ %(app)s"
+
+msgid "Page not found"
+msgstr "ไม่พบหน้านี้"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "เสียใจด้วย ไม่พบหน้าที่ต้องการ"
+
+msgid "Home"
+msgstr "หน้าหลัก"
+
+msgid "Server error"
+msgstr "เซิร์ฟเวอร์ขัดข้อง"
+
+msgid "Server error (500)"
+msgstr "เซิร์ฟเวอร์ขัดข้อง (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "เซิร์ฟเวอร์ขัดข้อง <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"เกิดเหตุขัดข้องขี้น ทางเราได้รายงานไปยังผู้ดูแลระบบแล้ว และจะดำเนินการแก้ไขอย่างเร่งด่วน "
+"ขอบคุณสำหรับการรายงานความผิดพลาด"
+
+msgid "Run the selected action"
+msgstr "รันคำสั่งที่ถูกเลือก"
+
+msgid "Go"
+msgstr "ไป"
+
+msgid "Click here to select the objects across all pages"
+msgstr "คลิกที่นี่เพื่อเลือกอ็อบเจ็กต์จากหน้าทั้งหมด"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "เลือกทั้งหมด %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "เคลียร์ตัวเลือก"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "ขั้นตอนแรก ใส่ชื่อผู้ใช้และรหัสผ่าน หลังจากนั้นคุณจะสามารถแก้ไขข้อมูลผู้ใช้ได้มากขึ้น"
+
+msgid "Enter a username and password."
+msgstr "กรุณาใส่ชื่อผู้ใช้และรหัสผ่าน"
+
+msgid "Change password"
+msgstr "เปลี่ยนรหัสผ่าน"
+
+msgid "Please correct the error below."
+msgstr "โปรดแก้ไขข้อผิดพลาดด้านล่าง"
+
+msgid "Please correct the errors below."
+msgstr "กรุณาแก้ไขข้อผิดพลาดด้านล่าง"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "ใส่รหัสผ่านใหม่สำหรับผู้ใช้ <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "ยินดีต้อนรับ,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "เอกสารประกอบ"
+
+msgid "Log out"
+msgstr "ออกจากระบบ"
+
+msgid "Add"
+msgstr "เพิ่ม"
+
+msgid "History"
+msgstr "ประวัติ"
+
+msgid "View on site"
+msgstr "ดูที่หน้าเว็บ"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "เพิ่ม %(name)s"
+
+msgid "Filter"
+msgstr "ตัวกรอง"
+
+msgid "Remove from sorting"
+msgstr "เอาออกจาก sorting"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "ลำดับการ sorting: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "เปิด/ปิด sorting"
+
+msgid "Delete"
+msgstr "ลบ"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"กำลังดำเนินการลบ %(object_name)s '%(escaped_object)s'และจะแสดงผลการลบ "
+"แต่บัญชีของคุณไม่สามารถทำการลบข้อมูลชนิดนี้ได้"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"การลบ %(object_name)s '%(escaped_object)s' จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"คุณแน่ใจหรือที่จะลบ %(object_name)s \"%(escaped_object)s\"?"
+"ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบไปด้วย:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ใช่, ฉันแน่ใจ"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "ลบหลายอ็อบเจ็กต์"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"การลบ %(objects_name)s ที่เลือก จะทำให้อ็อบเจ็กต์ที่เกี่ยวข้องถูกลบไปด้วย "
+"แต่บัญชีของคุณไม่มีสิทธิ์ที่จะลบอ็อบเจ็กต์ชนิดนี้"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr "การลบ %(objects_name)s ที่ถูกเลือก จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"คุณแน่ใจหรือว่า ต้องการลบ %(objects_name)s ที่ถูกเลือก? เนื่องจากอ็อบเจ็กต์ "
+"และรายการที่เกี่ยวข้องทั้งหมดต่อไปนี้จะถูกลบด้วย"
+
+msgid "Change"
+msgstr "เปลี่ยนแปลง"
+
+msgid "Remove"
+msgstr "ถอดออก"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "เพิ่ม %(verbose_name)s อีก"
+
+msgid "Delete?"
+msgstr "ลบ?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " โดย %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "โมเดลในแอป %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "คุณไม่สิทธิ์ในการเปลี่ยนแปลงข้อมูลใดๆ ได้"
+
+msgid "Recent Actions"
+msgstr "คำสั่งที่ผ่านมา"
+
+msgid "My Actions"
+msgstr "คำสั่งของฉัน"
+
+msgid "None available"
+msgstr "ไม่ว่าง"
+
+msgid "Unknown content"
+msgstr "ไม่ทราบเนื้อหา"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"มีสิ่งผิดปกติเกิดขึ้นกับการติดตั้งฐานข้อมูล กรุณาตรวจสอบอีกครั้งว่าฐานข้อมูลได้ถูกติดตั้งแล้ว "
+"หรือฐานข้อมูลสามารถอ่านและเขียนได้โคยผู้ใช้นี้"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "ลืมรหัสผ่านหรือชื่อผู้ใช้ของคุณหรือไม่"
+
+msgid "Date/time"
+msgstr "วันที่/เวลา"
+
+msgid "User"
+msgstr "ผู้ใช้"
+
+msgid "Action"
+msgstr "คำสั่ง"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "อ็อบเจ็กต์นี้ไม่ได้แก้ไขประวัติ เป็นไปได้ว่ามันอาจจะไม่ได้ถูกเพิ่มเข้าไปโดยระบบ"
+
+msgid "Show all"
+msgstr "แสดงทั้งหมด"
+
+msgid "Save"
+msgstr "บันทึก"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "ค้นหา"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s ผลลัพธ์"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s ทั้งหมด"
+
+msgid "Save as new"
+msgstr "บันทึกใหม่"
+
+msgid "Save and add another"
+msgstr "บันทึกและเพิ่ม"
+
+msgid "Save and continue editing"
+msgstr "บันทึกและกลับมาแก้ไข"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ขอบคุณที่สละเวลาอันมีค่าให้กับเว็บไซต์ของเราในวันนี้"
+
+msgid "Log in again"
+msgstr "เข้าสู่ระบบอีกครั้ง"
+
+msgid "Password change"
+msgstr "เปลี่ยนรหัสผ่าน"
+
+msgid "Your password was changed."
+msgstr "รหัสผ่านของคุณถูกเปลี่ยนไปแล้ว"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"กรุณาใส่รหัสผ่านเดิม ด้วยเหตุผลทางด้านการรักษาความปลอดภัย "
+"หลังจากนั้นให้ใส่รหัสผ่านใหม่อีกสองครั้ง เพื่อตรวจสอบว่าคุณได้พิมพ์รหัสอย่างถูกต้อง"
+
+msgid "Change my password"
+msgstr "เปลี่ยนรหัสผ่านของฉัน"
+
+msgid "Password reset"
+msgstr "ตั้งค่ารหัสผ่านใหม่"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "รหัสผ่านของคุณได้รับการตั้งค่าแล้ว คุณสามารถเข้าสู่ระบบได้ทันที"
+
+msgid "Password reset confirmation"
+msgstr "การยืนยันตั้งค่ารหัสผ่านใหม่"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "กรุณาใส่รหัสผ่านใหม่สองครั้ง เพื่อตรวจสอบว่าคุณได้พิมพ์รหัสอย่างถูกต้อง"
+
+msgid "New password:"
+msgstr "รหัสผ่านใหม่:"
+
+msgid "Confirm password:"
+msgstr "ยืนยันรหัสผ่าน:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"การตั้งรหัสผ่านใหม่ไม่สำเร็จ เป็นเพราะว่าหน้านี้ได้ถูกใช้งานไปแล้ว กรุณาทำการตั้งรหัสผ่านใหม่อีกครั้ง"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"หากคุณไม่ได้รับอีเมล โปรดให้แน่ใจว่าคุณได้ป้อนอีเมลที่คุณลงทะเบียน "
+"และตรวจสอบโฟลเดอร์สแปมของคุณแล้ว"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"คุณได้รับอีเมล์ฉบับนี้ เนื่องจากคุณส่งคำร้องขอเปลี่ยนรหัสผ่านสำหรับบัญชีผู้ใช้ของคุณที่ %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "กรุณาไปที่หน้านี้และเลือกรหัสผ่านใหม่:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "ชื่อผู้ใช้ของคุณ ในกรณีที่คุณถูกลืม:"
+
+msgid "Thanks for using our site!"
+msgstr "ขอบคุณสำหรับการใช้งานเว็บไซต์ของเรา"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ทีม"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr "ลืมรหัสผ่าน? กรุณาใส่อีเมลด้านล่าง เราจะส่งวิธีการในการตั้งรหัสผ่านใหม่ไปให้คุณทางอีเมล"
+
+msgid "Email address:"
+msgstr "อีเมล:"
+
+msgid "Reset my password"
+msgstr "ตั้งรหัสผ่านของฉันใหม่"
+
+msgid "All dates"
+msgstr "ทุกวัน"
+
+#, python-format
+msgid "Select %s"
+msgstr "เลือก %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "เลือก %s เพื่อเปลี่ยนแปลง"
+
+msgid "Date:"
+msgstr "วันที่ :"
+
+msgid "Time:"
+msgstr "เวลา :"
+
+msgid "Lookup"
+msgstr "ดูที่"
+
+msgid "Currently:"
+msgstr "ปัจจุบัน:"
+
+msgid "Change:"
+msgstr "เปลี่ยนเป็น:"
diff --git a/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..33e8900
--- /dev/null
+++ b/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e4430a2
--- /dev/null
+++ b/tbc/static/admin/locale/th/LC_MESSAGES/djangojs.po
@@ -0,0 +1,158 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kowit Charoenratchatabhan <kowit.s.c@gmail.com>, 2011-2012
+# Suteepat Damrongyingsupab <tianissimo@hotmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Thai (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "%sที่มีอยู่"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"นี่คือรายการที่ใช้ได้ของ %s คุณอาจเลือกบางรายการโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม "
+"\"เลือก\" ระหว่างสองกล่อง"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "พิมพ์ลงในช่องนี้เพื่อกรองรายการที่ใช้ได้ของ %s"
+
+msgid "Filter"
+msgstr "ตัวกรอง"
+
+msgid "Choose all"
+msgstr "เลือกทั้งหมด"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "คลิกเพื่อเลือก %s ทั้งหมดในครั้งเดียว"
+
+msgid "Choose"
+msgstr "เลือก"
+
+msgid "Remove"
+msgstr "ลบออก"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%sที่ถูกเลือก"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"นี่คือรายการที่ถูกเลือกของ %s คุณอาจเอาบางรายการออกโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม "
+"\"เอาออก\" ระหว่างสองกล่อง"
+
+msgid "Remove all"
+msgstr "เอาออกทั้งหมด"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "คลิกเพื่อเอา %s ออกทั้งหมดในครั้งเดียว"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s จาก %(cnt)s selected"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"คุณยังไม่ได้บันทึกการเปลี่ยนแปลงในแต่ละฟิลด์ ถ้าคุณเรียกใช้คำสั่ง "
+"ข้อมูลที่ไม่ได้บันทึกการเปลี่ยนแปลงของคุณจะหายไป"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"คุณได้เลือกคำสั่ง แต่คุณยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณไปยังฟิลด์ กรุณาคลิก OK เพื่อบันทึก "
+"คุณจะต้องเรียกใช้คำสั่งใหม่อีกครั้ง"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"คุณได้เลือกคำสั่งและคุณยังไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในฟิลด์ คุณอาจมองหาปุ่มไปมากกว่าปุ่มบันทึก"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "ขณะนี้"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "เลือกเวลา"
+
+msgid "Midnight"
+msgstr "เที่ยงคืน"
+
+msgid "6 a.m."
+msgstr "หกโมงเช้า"
+
+msgid "Noon"
+msgstr "เที่ยงวัน"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "ยกเลิก"
+
+msgid "Today"
+msgstr "วันนี้"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "เมื่อวาน"
+
+msgid "Tomorrow"
+msgstr "พรุ่งนี้"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"มกราคม กุมภาพันธ์ มีนาคม เมษายน พฤษภาคม มิถุนายน กรกฎาคม สิงหาคม กันยายน ตุลาคม "
+"พฤศจิกายน ธันวาคม"
+
+msgid "S M T W T F S"
+msgstr "อา. จ. อ. พ. พฤ. ศ. ส."
+
+msgid "Show"
+msgstr "แสดง"
+
+msgid "Hide"
+msgstr "ซ่อน"
diff --git a/tbc/static/admin/locale/tr/LC_MESSAGES/django.mo b/tbc/static/admin/locale/tr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..371f8ec
--- /dev/null
+++ b/tbc/static/admin/locale/tr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/tr/LC_MESSAGES/django.po b/tbc/static/admin/locale/tr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7fd1584
--- /dev/null
+++ b/tbc/static/admin/locale/tr/LC_MESSAGES/django.po
@@ -0,0 +1,689 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# BouRock, 2015
+# BouRock, 2014-2015
+# Caner Başaran <basaran.caner@gmail.com>, 2013
+# Cihad GÜNDOĞDU <cihadgundogdu@gmail.com>, 2012
+# Cihad GÜNDOĞDU <cihadgundogdu@gmail.com>, 2014
+# Cihan Okyay <cihan.okyay@linux.org.tr>, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Mesut Can Gürle <mesutcang@gmail.com>, 2013
+# Murat Sahin <martinamca@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 09:36+0000\n"
+"Last-Translator: BouRock\n"
+"Language-Team: Turkish (http://www.transifex.com/django/django/language/"
+"tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d adet %(items)s başarılı olarak silindi."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s silinemiyor"
+
+msgid "Are you sure?"
+msgstr "Emin misiniz?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Seçili %(verbose_name_plural)s nesnelerini sil"
+
+msgid "Administration"
+msgstr "Yönetim"
+
+msgid "All"
+msgstr "Tümü"
+
+msgid "Yes"
+msgstr "Evet"
+
+msgid "No"
+msgstr "Hayır"
+
+msgid "Unknown"
+msgstr "Bilinmiyor"
+
+msgid "Any date"
+msgstr "Herhangi bir tarih"
+
+msgid "Today"
+msgstr "Bugün"
+
+msgid "Past 7 days"
+msgstr "Son 7 gün"
+
+msgid "This month"
+msgstr "Bu ay"
+
+msgid "This year"
+msgstr "Bu yıl"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Lütfen görevli hesabı için %(username)s ve parolanızı doğru girin. İki "
+"alanın da büyük küçük harfe duyarlı olabildiğini unutmayın."
+
+msgid "Action:"
+msgstr "Eylem:"
+
+msgid "action time"
+msgstr "eylem zamanı"
+
+msgid "user"
+msgstr "kullanıcı"
+
+msgid "content type"
+msgstr "içerik türü"
+
+msgid "object id"
+msgstr "nesne kimliği"
+
+msgid "object repr"
+msgstr "nesne kodu"
+
+msgid "action flag"
+msgstr "eylem işareti"
+
+msgid "change message"
+msgstr "iletiyi değiştir"
+
+msgid "log entry"
+msgstr "günlük girdisi"
+
+msgid "log entries"
+msgstr "günlük girdisi"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" eklendi."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" değiştirildi - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" silindi."
+
+msgid "LogEntry Object"
+msgstr "LogEntry Nesnesi"
+
+msgid "None"
+msgstr "Hiçbiri"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Birden fazla seçmek için \"Control (Ctrl)\" veya Mac'deki \"Command\" tuşuna "
+"basılı tutun."
+
+msgid "Added."
+msgstr "Eklendi."
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s değiştirildi."
+
+msgid "and"
+msgstr "ve"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" eklendi."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" için %(list)s değiştirildi."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" silindi."
+
+msgid "No fields changed."
+msgstr "Değiştirilen alanlar yok."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" başarılı olarak eklendi. Aşağıda tekrar "
+"düzenleyebilirsiniz."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" başarılı olarak eklendi. Aşağıda başka bir %(name)s "
+"ekleyebilirsiniz."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" başarılı olarak eklendi."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" başarılı olarak değiştirildi. Aşağıda tekrar "
+"düzenleyebilirsiniz."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" başarılı olarak değiştirildi. Aşağıda başka bir "
+"%(name)s ekleyebilirsiniz."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" başarılı olarak değiştirildi."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Bunlar üzerinde eylemlerin uygulanması için öğeler seçilmek zorundadır. Hiç "
+"öğe değiştirilmedi."
+
+msgid "No action selected."
+msgstr "Seçilen eylem yok."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" başarılı olarak silindi."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r birincil anahtarı olan %(name)s nesnesi mevcut değil."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s ekle"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s değiştir"
+
+msgid "Database error"
+msgstr "Veritabanı hatası"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s adet %(name)s başarılı olarak değiştirildi."
+msgstr[1] "%(count)s adet %(name)s başarılı olarak değiştirildi."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s nesne seçildi"
+msgstr[1] "Tüm %(total_count)s nesne seçildi"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 / %(cnt)s nesne seçildi"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Değişiklik geçmişi: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"%(class_name)s %(instance)s silinmesi aşağıda korunan ilgili nesnelerin de "
+"silinmesini gerektirecektir: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django site yöneticisi"
+
+msgid "Django administration"
+msgstr "Django yönetimi"
+
+msgid "Site administration"
+msgstr "Site yönetimi"
+
+msgid "Log in"
+msgstr "Oturum aç"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s yönetimi"
+
+msgid "Page not found"
+msgstr "Sayfa bulunamadı"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Üzgünüz, istediğiniz sayfa bulunamadı."
+
+msgid "Home"
+msgstr "Giriş"
+
+msgid "Server error"
+msgstr "Sunucu hatası"
+
+msgid "Server error (500)"
+msgstr "Sunucu hatası (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Sunucu Hatası <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Bir hata oluştu. Site yöneticilerine e-posta yoluyla bildirildi ve kısa süre "
+"içinde düzeltilmelidir. Sabrınız için teşekkür ederiz."
+
+msgid "Run the selected action"
+msgstr "Seçilen eylemi çalıştır"
+
+msgid "Go"
+msgstr "Git"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Tüm sayfalardaki nesneleri seçmek için buraya tıklayın"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Tüm %(total_count)s %(module_name)s nesnelerini seç"
+
+msgid "Clear selection"
+msgstr "Seçimi temizle"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Önce, bir kullanıcı adı ve parola girin. Ondan sonra, daha fazla kullanıcı "
+"seçeneğini düzenleyebileceksiniz."
+
+msgid "Enter a username and password."
+msgstr "Kullanıcı adı ve parola girin."
+
+msgid "Change password"
+msgstr "Parolayı değiştir"
+
+msgid "Please correct the error below."
+msgstr "Lütfen aşağıdaki hataları düzeltin."
+
+msgid "Please correct the errors below."
+msgstr "Lütfen aşağıdaki hataları düzeltin."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> kullanıcısı için yeni bir parola girin."
+
+msgid "Welcome,"
+msgstr "Hoş Geldiniz,"
+
+msgid "View site"
+msgstr "Siteyi göster"
+
+msgid "Documentation"
+msgstr "Belgeler"
+
+msgid "Log out"
+msgstr "Oturumu kapat"
+
+msgid "Add"
+msgstr "Ekle"
+
+msgid "History"
+msgstr "Geçmiş"
+
+msgid "View on site"
+msgstr "Sitede görüntüle"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ekle"
+
+msgid "Filter"
+msgstr "Süz"
+
+msgid "Remove from sorting"
+msgstr "Sıralamadan kaldır"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sıralama önceliği: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Sıralamayı değiştir"
+
+msgid "Delete"
+msgstr "Sil"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, ilgili nesnelerin "
+"silinmesi ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü "
+"silmek için izine sahip değil."
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, aşağıda korunan "
+"ilgili nesnelerin silinmesini gerektirecek:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" nesnesini silmek istediğinize emin "
+"misiniz? Aşağıdaki ilgili öğelerin tümü silinecektir:"
+
+msgid "Objects"
+msgstr "Nesneler"
+
+msgid "Yes, I'm sure"
+msgstr "Evet, eminim"
+
+msgid "No, take me back"
+msgstr "Hayır, beni geri götür"
+
+msgid "Delete multiple objects"
+msgstr "Birden fazla nesneyi sil"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Seçilen %(objects_name)s nesnelerinin silinmesi, ilgili nesnelerin silinmesi "
+"ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü silmek için "
+"izine sahip değil."
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Seçilen %(objects_name)s nesnelerinin silinmesi, aşağıda korunan ilgili "
+"nesnelerin silinmesini gerektirecek:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Seçilen %(objects_name)s nesnelerini silmek istediğinize emin misiniz? "
+"Aşağıdaki nesnelerin tümü ve onların ilgili öğeleri silinecektir:"
+
+msgid "Change"
+msgstr "Değiştir"
+
+msgid "Remove"
+msgstr "Kaldır"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Başka bir %(verbose_name)s ekle"
+
+msgid "Delete?"
+msgstr "Silinsin mi?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s süzgecine göre"
+
+msgid "Summary"
+msgstr "Özet"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s uygulamasındaki modeller"
+
+msgid "You don't have permission to edit anything."
+msgstr "Hiçbir şeyi düzenlemek için izne sahip değilsiniz."
+
+msgid "Recent Actions"
+msgstr "Son Eylemler"
+
+msgid "My Actions"
+msgstr "Eylemlerim"
+
+msgid "None available"
+msgstr "Mevcut değil"
+
+msgid "Unknown content"
+msgstr "Bilinmeyen içerik"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Veritabanı kurulumunuz ile ilgili birşeyler yanlış. Uygun veritabanı "
+"tablolarının oluşturulduğundan ve veritabanının uygun kullanıcı tarafından "
+"okunabilir olduğundan emin olun."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"%(username)s olarak kimlik doğrulamanız yapıldı, ancak bu sayfaya erişmek "
+"için yetkili değilsiniz. Farklı bir hesapla oturum açmak ister misiniz?"
+
+msgid "Forgotten your password or username?"
+msgstr "Kullanıcı adınızı veya parolanızı mı unuttunuz?"
+
+msgid "Date/time"
+msgstr "Tarih/saat"
+
+msgid "User"
+msgstr "Kullanıcı"
+
+msgid "Action"
+msgstr "Eylem"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Bu nesne değişme geçmişine sahip değil. Muhtemelen bu yönetici sitesi "
+"aracılığıyla eklenmedi."
+
+msgid "Show all"
+msgstr "Tümünü göster"
+
+msgid "Save"
+msgstr "Kaydet"
+
+msgid "Popup closing..."
+msgstr "Açılır pencere kapanıyor..."
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Seçilen %(model)s değiştir"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Başka bir %(model)s ekle"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Seçilen %(model)s sil"
+
+msgid "Search"
+msgstr "Ara"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s sonuç"
+msgstr[1] "%(counter)s sonuç"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "toplam %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Yeni olarak kaydet"
+
+msgid "Save and add another"
+msgstr "Kaydet ve başka birini ekle"
+
+msgid "Save and continue editing"
+msgstr "Kaydet ve düzenlemeye devam et"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"Bugün Web sitesinde biraz güzel zaman geçirdiğiniz için teşekkür ederiz."
+
+msgid "Log in again"
+msgstr "Tekrar oturum aç"
+
+msgid "Password change"
+msgstr "Parola değiştime"
+
+msgid "Your password was changed."
+msgstr "Parolanız değiştirildi."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Güvenliğiniz için, lütfen eski parolanızı girin, ve ondan sonra yeni "
+"parolanızı iki kere girin böylece doğru olarak yazdığınızı doğrulayabilelim."
+
+msgid "Change my password"
+msgstr "Parolamı değiştir"
+
+msgid "Password reset"
+msgstr "Parolayı sıfırla"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Parolanız ayarlandı. Şimdi devam edebilir ve oturum açabilirsiniz."
+
+msgid "Password reset confirmation"
+msgstr "Parola sıfırlama onayı"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Lütfen yeni parolanızı iki kere girin böylece böylece doğru olarak "
+"yazdığınızı doğrulayabilelim."
+
+msgid "New password:"
+msgstr "Yeni parola:"
+
+msgid "Confirm password:"
+msgstr "Parolayı onayla:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Parola sıfırlama bağlantısı geçersiz olmuş, çünkü zaten kullanılmış. Lütfen "
+"yeni bir parola sıfırlama isteyin."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"Eğer girdiğiniz e-posta ile bir hesabınız varsa, parolanızın ayarlanması "
+"için size talimatları e-posta ile gönderdik. En kısa sürede almalısınız."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Eğer bir e-posta almadıysanız, lütfen kayıt olurken girdiğiniz adresi "
+"kullandığınızdan emin olun ve istenmeyen mesajlar klasörünü kontrol edin."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Bu e-postayı alıyorsunuz çünkü %(site_name)s sitesindeki kullanıcı hesabınız "
+"için bir parola sıfırlama istediniz."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Lütfen şurada belirtilen sayfaya gidin ve yeni bir parola seçin:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Unutma ihtimalinize karşı, kullanıcı adınız:"
+
+msgid "Thanks for using our site!"
+msgstr "Sitemizi kullandığınız için teşekkürler!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ekibi"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Parolanızı mı unuttunuz? Aşağıya e-posta adresinizi girin ve yeni bir tane "
+"ayarlamak için talimatları e-posta ile gönderelim."
+
+msgid "Email address:"
+msgstr "E-posta adresi:"
+
+msgid "Reset my password"
+msgstr "Parolamı sıfırla"
+
+msgid "All dates"
+msgstr "Tüm tarihler"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s seç"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Değiştirmek için %s seçin"
+
+msgid "Date:"
+msgstr "Tarih:"
+
+msgid "Time:"
+msgstr "Saat:"
+
+msgid "Lookup"
+msgstr "Arama"
+
+msgid "Currently:"
+msgstr "Şu anda:"
+
+msgid "Change:"
+msgstr "Değiştir:"
diff --git a/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a8b05f1
--- /dev/null
+++ b/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e35a8fb
--- /dev/null
+++ b/tbc/static/admin/locale/tr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# BouRock, 2015
+# BouRock, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Metin Amiroff <amiroff@gmail.com>, 2011
+# Murat Çorlu <muratcorlu@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 11:07+0000\n"
+"Last-Translator: BouRock\n"
+"Language-Team: Turkish (http://www.transifex.com/django/django/language/"
+"tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Mevcut %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Bu mevcut %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve ondan "
+"sonra iki kutu arasındaki \"Seçin\" okuna tıklayarak seçebilirsiniz."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Mevcut %s listesini süzmek için bu kutu içine yazın."
+
+msgid "Filter"
+msgstr "Süzgeç"
+
+msgid "Choose all"
+msgstr "Tümünü seçin"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Bir kerede tüm %s seçilmesi için tıklayın."
+
+msgid "Choose"
+msgstr "Seçin"
+
+msgid "Remove"
+msgstr "Kaldır"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Seçilen %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Bu seçilen %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve "
+"ondan sonra iki kutu arasındaki \"Kaldır\" okuna tıklayarak "
+"kaldırabilirsiniz."
+
+msgid "Remove all"
+msgstr "Tümünü kaldır"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Bir kerede tüm seçilen %s kaldırılması için tıklayın."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(sel)s / %(cnt)s seçildi"
+msgstr[1] "%(sel)s / %(cnt)s seçildi"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Bireysel düzenlenebilir alanlarda kaydedilmemiş değişiklikleriniz var. Eğer "
+"bir eylem çalıştırırsanız, kaydedilmemiş değişiklikleriniz kaybolacaktır."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Bir eylem seçtiniz, fakat henüz bireysel alanlara değişikliklerinizi "
+"kaydetmediniz. Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi "
+"yeniden çalıştırmanız gerekecek."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Bir eylem seçtiniz, fakat bireysel alanlar üzerinde hiçbir değişiklik "
+"yapmadınız. Muhtemelen Kaydet düğmesi yerine Git düğmesini arıyorsunuz."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Not: Sunucu saatinin %s saat ilerisindesiniz."
+msgstr[1] "Not: Sunucu saatinin %s saat ilerisindesiniz."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Not: Sunucu saatinin %s saat gerisindesiniz."
+msgstr[1] "Not: Sunucu saatinin %s saat gerisindesiniz."
+
+msgid "Now"
+msgstr "Şimdi"
+
+msgid "Choose a Time"
+msgstr "Bir Saat Seçin"
+
+msgid "Choose a time"
+msgstr "Bir saat seçin"
+
+msgid "Midnight"
+msgstr "Geceyarısı"
+
+msgid "6 a.m."
+msgstr "Sabah 6"
+
+msgid "Noon"
+msgstr "Öğle"
+
+msgid "6 p.m."
+msgstr "6 ö.s."
+
+msgid "Cancel"
+msgstr "İptal"
+
+msgid "Today"
+msgstr "Bugün"
+
+msgid "Choose a Date"
+msgstr "Bir Tarih Seçin"
+
+msgid "Yesterday"
+msgstr "Dün"
+
+msgid "Tomorrow"
+msgstr "Yarın"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım Aralık"
+
+msgid "S M T W T F S"
+msgstr "P P S Ç P C C"
+
+msgid "Show"
+msgstr "Göster"
+
+msgid "Hide"
+msgstr "Gizle"
diff --git a/tbc/static/admin/locale/tt/LC_MESSAGES/django.mo b/tbc/static/admin/locale/tt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..db8e524
--- /dev/null
+++ b/tbc/static/admin/locale/tt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/tt/LC_MESSAGES/django.po b/tbc/static/admin/locale/tt/LC_MESSAGES/django.po
new file mode 100644
index 0000000..67928ed
--- /dev/null
+++ b/tbc/static/admin/locale/tt/LC_MESSAGES/django.po
@@ -0,0 +1,650 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Azat Khasanshin <lordofbazuks@gmail.com>, 2011
+# v_ildar <v_ildar@bk.ru>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tt\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s уңышлы рәвештә бетерелгән."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s бетереп булмады"
+
+msgid "Are you sure?"
+msgstr "Сез инанып карар кылдыгызмы?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Сайланган %(verbose_name_plural)s бетерергә"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "Барысы"
+
+msgid "Yes"
+msgstr "Әйе"
+
+msgid "No"
+msgstr "Юк"
+
+msgid "Unknown"
+msgstr "Билгесез"
+
+msgid "Any date"
+msgstr "Теләсә нинди көн һәм вакыт"
+
+msgid "Today"
+msgstr "Бүген"
+
+msgid "Past 7 days"
+msgstr "Соңгы 7 көн"
+
+msgid "This month"
+msgstr "Бу ай"
+
+msgid "This year"
+msgstr "Бу ел"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "Гамәл:"
+
+msgid "action time"
+msgstr "гамәл вакыты"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "объект идентификаторы"
+
+msgid "object repr"
+msgstr "объект фаразы"
+
+msgid "action flag"
+msgstr "гамәл тибы"
+
+msgid "change message"
+msgstr "үзгәрү белдерүе"
+
+msgid "log entry"
+msgstr "журнал язмасы"
+
+msgid "log entries"
+msgstr "журнал язмалары"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "Юк"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s үзгәртелгән."
+
+msgid "and"
+msgstr "һәм"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" өстәлгән."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" өчен %(list)s үзгәртелгән."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" бетерелгән."
+
+msgid "No fields changed."
+msgstr "Үзгәртелгән кырлар юк."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" үңышлы рәвештә өстәлгән. Астарак сез аны тагын бер кат "
+"төзәтә аласыз."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" үңышлы рәвештә өстәлгән."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" уңышлы рәвештә үзгәртелгән."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Элементар өстеннән гамәл кылу өчен алар сайланган булырга тиеш. Элементлар "
+"үзгәртелмәгән."
+
+msgid "No action selected."
+msgstr "Гамәл сайланмаган."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" уңышлы рәвештә бетерелгән."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(key)r беренчел ачкыч белән булган %(name)s юк."
+
+#, python-format
+msgid "Add %s"
+msgstr "%s өстәргә"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s үзгәртергә"
+
+msgid "Database error"
+msgstr "Бирелмәләр базасы хатасы"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s уңышлы рәвештә үзгәртелгән."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s сайланган"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "Барлык %(cnt)s объектан 0 сайланган"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Үзгәртү тарихы: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django сайты идарәсе"
+
+msgid "Django administration"
+msgstr "Django идарәсе"
+
+msgid "Site administration"
+msgstr "Сайт идарәсе"
+
+msgid "Log in"
+msgstr "Керергә"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "Сәхифә табылмаган"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Кызганычка каршы, соралган сәхифә табылмады."
+
+msgid "Home"
+msgstr "Башбит"
+
+msgid "Server error"
+msgstr "Сервер хатасы"
+
+msgid "Server error (500)"
+msgstr "Сервер хатасы (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Сервер хатасы <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "Сайланган гамәлне башкарырга"
+
+msgid "Go"
+msgstr "Башкарырга"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Барлык сәхифәләрдә булган объектларны сайлау өчен монда чирттерегез"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Бөтен %(total_count)s %(module_name)s сайларга"
+
+msgid "Clear selection"
+msgstr "Сайланганлыкны алырга"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Баштан логин һәм серсүзне кертегез. Аннан соң сез кулланучы турында күбрәк "
+"мәгълүматне төзәтә алырсыз."
+
+msgid "Enter a username and password."
+msgstr "Логин һәм серсүзне кертегез."
+
+msgid "Change password"
+msgstr "Серсүзне үзгәртергә"
+
+msgid "Please correct the error below."
+msgstr "Зинһар, биредәге хаталарны төзәтегез."
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> кулланучы өчен яңа серсүзне кертегез."
+
+msgid "Welcome,"
+msgstr "Рәхим итегез,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Документация"
+
+msgid "Log out"
+msgstr "Чыгарга"
+
+msgid "Add"
+msgstr "Өстәргә"
+
+msgid "History"
+msgstr "Тарих"
+
+msgid "View on site"
+msgstr "Сайтта карарга"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s өстәргә"
+
+msgid "Filter"
+msgstr "Филтер"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Бетерергә"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' бетереүе аның белән бәйләнгән "
+"объектларның бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе "
+"объект тибларын бетерү өчен хокуклары җитми:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' бетерүе киләсе сакланган объектларның "
+"бетерелүен таләп итә:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Сез инанып %(object_name)s \"%(escaped_object)s\" бетерергә телисезме? "
+"Барлык киләсе бәйләнгән объектлар да бетерелер:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Әйе, мин инандым"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Берничә объектны бетерергә"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Сайланган %(objects_name)s бетерүе аның белән бәйләнгән объектларның "
+"бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе объект тибларын "
+"бетерү өчен хокуклары җитми:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"%(objects_name)s бетерүе киләсе аның белән бәйләнгән сакланган объектларның "
+"бетерелүен таләп итә:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Сез инанып %(objects_name)s бетерергә телисезме? Барлык киләсе объектлар һәм "
+"алар белән бәйләнгән элементлар да бетерелер:"
+
+msgid "Change"
+msgstr "Үзгәртергә"
+
+msgid "Remove"
+msgstr "Бетерергә"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Тагын бер %(verbose_name)s өстәргә"
+
+msgid "Delete?"
+msgstr "Бетерергә?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s буенча"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "Төзәтү өчен хокукларыгыз җитми."
+
+msgid "Recent Actions"
+msgstr "Соңгы гамәлләр"
+
+msgid "My Actions"
+msgstr "Минем гамәлләр"
+
+msgid "None available"
+msgstr "Тарих юк"
+
+msgid "Unknown content"
+msgstr "Билгесез тип"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Сезнең бирелмәләр базасы дөрес итем көйләнмәгән. Тиешле җәдвәлләр төзелгәнен "
+"һәм тиешле кулланучының хокуклары җитәрлек булуын тикшерегез."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "Көн һәм вакыт"
+
+msgid "User"
+msgstr "Кулланучы"
+
+msgid "Action"
+msgstr "Гамәл"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Әлеге объектның үзгәртү тарихы юк. Бу идарә итү сайты буенча өстәлмәгән "
+"булуы ихтимал."
+
+msgid "Show all"
+msgstr "Бөтенесен күрсәтергә"
+
+msgid "Save"
+msgstr "Сакларга"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Эзләргә"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s нәтиҗә"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "барлыгы %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Яңа объект итеп сакларга"
+
+msgid "Save and add another"
+msgstr "Сакларга һәм бүтән объектны өстәргә"
+
+msgid "Save and continue editing"
+msgstr "Сакларга һәм төзәтүне дәвам итәргә"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Сайтыбызда үткәргән вакыт өчен рәхмәт."
+
+msgid "Log in again"
+msgstr "Тагын керергә"
+
+msgid "Password change"
+msgstr "Серсүзне үзгәртү"
+
+msgid "Your password was changed."
+msgstr "Серсүзегез үзгәртелгән."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Хәвефсезлек сәбәпле, зинһар, үзегезнең иске серсүзне кертегез, аннан яңа "
+"серсүзне ике тапкыр кертегез (дөрес язылышын тикшерү өчен)."
+
+msgid "Change my password"
+msgstr "Серсүземне үзгәртергә"
+
+msgid "Password reset"
+msgstr "Серсүзне торгызу"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Серсүзегез үзгәртелгән. Сез хәзер керә аласыз."
+
+msgid "Password reset confirmation"
+msgstr "Серсүзне торгызу раслау"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "Зинһар, тикшерү өчен яңа серсүзегезне ике тапкыр кертегез."
+
+msgid "New password:"
+msgstr "Яңа серсуз:"
+
+msgid "Confirm password:"
+msgstr "Серсүзне раслагыз:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Серсүзне торгызу өчен сылтама хаталы. Бәлки аның белән инде кулланганнар. "
+"Зинһар, серсүзне тагын бер тапкыр торгызып карагыз."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Зинһар, бу сәхифәгә юнәлегез һәм яңа серсүзне кертегез:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Сезнең кулланучы исемегез (оныткан булсагыз):"
+
+msgid "Thanks for using our site!"
+msgstr "Безнең сайтны куллану өчен рәхмәт!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s сайтының төркеме"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr "Эл. почта адресы:"
+
+msgid "Reset my password"
+msgstr "Серсүземне торгызырга"
+
+msgid "All dates"
+msgstr "Бөтен көннәр"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s сайлагыз"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Үзгәртү өчен %s сайлагыз"
+
+msgid "Date:"
+msgstr "Көн:"
+
+msgid "Time:"
+msgstr "Вакыт:"
+
+msgid "Lookup"
+msgstr "Эзләү"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..156dcd1
--- /dev/null
+++ b/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2a2f9cf
--- /dev/null
+++ b/tbc/static/admin/locale/tt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,154 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Azat Khasanshin <lordofbazuks@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tt\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Рөхсәт ителгән %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "Фильтр"
+
+msgid "Choose all"
+msgstr "Барысын сайларга"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "Бетерергә"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Сайланган %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s арасыннан %(sel)s сайланган"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Кайбер кырларда сакланмаган төзәтүләр кала. Сез гамәлне башкарсагыз, сезнең "
+"сакланмаган үзгәртүләр югалачаклар."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Сез гамәлне сайладыгыз, әмма кайбер кырлардагы төзәтүләрне сакламадыгыз. "
+"Аларны саклау өчен OK төймәсенә басыгыз. Аннан соң гамәлне тагын бер тапкыр "
+"башкарырга туры килер."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Сез гамәлне сайладыгыз һәм төзәтүләрне башкармадыгыз. Бәлки сез \"Сакларга\" "
+"төймәсе урынына \"Башкарырга\" төймәсен кулланырга теләдегез."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "Хәзер"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Вакыт сайлагыз"
+
+msgid "Midnight"
+msgstr "Төн уртасы"
+
+msgid "6 a.m."
+msgstr "Иртәнге 6"
+
+msgid "Noon"
+msgstr "Төш"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Юкка чыгарырга"
+
+msgid "Today"
+msgstr "Бүген"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Кичә"
+
+msgid "Tomorrow"
+msgstr "Иртәгә"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Гыйнвар Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь "
+"Декабрь"
+
+msgid "S M T W T F S"
+msgstr "Я Д С Ч П Җ Ш"
+
+msgid "Show"
+msgstr "Күрсәтергә"
+
+msgid "Hide"
+msgstr "Яшерергә"
diff --git a/tbc/static/admin/locale/udm/LC_MESSAGES/django.mo b/tbc/static/admin/locale/udm/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d51b11a
--- /dev/null
+++ b/tbc/static/admin/locale/udm/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/udm/LC_MESSAGES/django.po b/tbc/static/admin/locale/udm/LC_MESSAGES/django.po
new file mode 100644
index 0000000..df03f5f
--- /dev/null
+++ b/tbc/static/admin/locale/udm/LC_MESSAGES/django.po
@@ -0,0 +1,606 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-18 08:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/"
+"udm/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: udm\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr ""
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Yes"
+msgstr "Бен"
+
+msgid "No"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Тодымтэ"
+
+msgid "Any date"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Past 7 days"
+msgstr ""
+
+msgid "This month"
+msgstr ""
+
+msgid "This year"
+msgstr ""
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr ""
+
+msgid "action time"
+msgstr ""
+
+msgid "object id"
+msgstr ""
+
+msgid "object repr"
+msgstr ""
+
+msgid "action flag"
+msgstr ""
+
+msgid "change message"
+msgstr ""
+
+msgid "log entry"
+msgstr ""
+
+msgid "log entries"
+msgstr ""
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr ""
+
+msgid "No fields changed."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+
+msgid "No action selected."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr ""
+
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+msgid "Database error"
+msgstr ""
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] ""
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] ""
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr ""
+
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr ""
+
+msgid "Django administration"
+msgstr ""
+
+msgid "Site administration"
+msgstr ""
+
+msgid "Log in"
+msgstr ""
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+msgid "Home"
+msgstr ""
+
+msgid "Server error"
+msgstr ""
+
+msgid "Server error (500)"
+msgstr ""
+
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr ""
+
+msgid "Go"
+msgstr ""
+
+msgid "Click here to select the objects across all pages"
+msgstr ""
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr ""
+
+msgid "Clear selection"
+msgstr ""
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+msgid "Enter a username and password."
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Please correct the error below."
+msgstr ""
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+msgid "Welcome,"
+msgstr ""
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Log out"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "View on site"
+msgstr ""
+
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "Ӵушоно"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr ""
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+
+msgid "Change"
+msgstr "Тупатъяно"
+
+msgid "Remove"
+msgstr ""
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr ""
+
+msgid "Delete?"
+msgstr ""
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+msgid "Recent Actions"
+msgstr ""
+
+msgid "My Actions"
+msgstr ""
+
+msgid "None available"
+msgstr ""
+
+msgid "Unknown content"
+msgstr ""
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+msgid "Show all"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+msgid "Save as new"
+msgstr ""
+
+msgid "Save and add another"
+msgstr ""
+
+msgid "Save and continue editing"
+msgstr ""
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+msgid "Log in again"
+msgstr ""
+
+msgid "Password change"
+msgstr ""
+
+msgid "Your password was changed."
+msgstr ""
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+msgid "Change my password"
+msgstr ""
+
+msgid "Password reset"
+msgstr ""
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+
+msgid "Password reset confirmation"
+msgstr ""
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+
+msgid "New password:"
+msgstr ""
+
+msgid "Confirm password:"
+msgstr ""
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+msgid "Thanks for using our site!"
+msgstr ""
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr ""
+
+msgid "All dates"
+msgstr ""
+
+msgid "(None)"
+msgstr ""
+
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+msgid "Date:"
+msgstr ""
+
+msgid "Time:"
+msgstr ""
+
+msgid "Lookup"
+msgstr ""
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..af7ab53
--- /dev/null
+++ b/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e3826f0
--- /dev/null
+++ b/tbc/static/admin/locale/udm/LC_MESSAGES/djangojs.po
@@ -0,0 +1,142 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:13+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/"
+"udm/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: udm\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Choose all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr ""
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] ""
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr ""
+
+msgid "Clock"
+msgstr ""
+
+msgid "Choose a time"
+msgstr ""
+
+msgid "Midnight"
+msgstr ""
+
+msgid "6 a.m."
+msgstr ""
+
+msgid "Noon"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Calendar"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+msgid "S M T W T F S"
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
diff --git a/tbc/static/admin/locale/uk/LC_MESSAGES/django.mo b/tbc/static/admin/locale/uk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9f022b1
--- /dev/null
+++ b/tbc/static/admin/locale/uk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/uk/LC_MESSAGES/django.po b/tbc/static/admin/locale/uk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1c26d53
--- /dev/null
+++ b/tbc/static/admin/locale/uk/LC_MESSAGES/django.po
@@ -0,0 +1,691 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Oleksandr Chernihov <o.chernihov@gmail.com>, 2014
+# Andriy Sokolovskiy <me@asokolovskiy.com>, 2015
+# Boryslav Larin <brabadu@gmail.com>, 2011
+# Igor Melnyk, 2014
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kirill Gagarski <gagarin.gtn@gmail.com>, 2015
+# Max V. Stotsky <transifex@ms.pereslavl.ru>, 2014
+# Mykola Zamkovoi <nickzam@gmail.com>, 2014
+# Sergiy Kuzmenko <s.kuzmenko@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ukrainian (http://www.transifex.com/django/django/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"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Успішно видалено %(count)d %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Не вдається видалити %(name)s"
+
+msgid "Are you sure?"
+msgstr "Ви впевнені?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Видалити обрані %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "Адміністрування"
+
+msgid "All"
+msgstr "Всі"
+
+msgid "Yes"
+msgstr "Так"
+
+msgid "No"
+msgstr "Ні"
+
+msgid "Unknown"
+msgstr "Невідомо"
+
+msgid "Any date"
+msgstr "Будь-яка дата"
+
+msgid "Today"
+msgstr "Сьогодні"
+
+msgid "Past 7 days"
+msgstr "Останні 7 днів"
+
+msgid "This month"
+msgstr "Цього місяця"
+
+msgid "This year"
+msgstr "Цього року"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Будь ласка, введіть правильні %(username)s і пароль для облікового запису "
+"персоналу. Зауважте, що обидва поля можуть бути чутливі до регістру."
+
+msgid "Action:"
+msgstr "Дія:"
+
+msgid "action time"
+msgstr "час дії"
+
+msgid "user"
+msgstr "користувач"
+
+msgid "content type"
+msgstr "тип вмісту"
+
+msgid "object id"
+msgstr "id об'єкта"
+
+msgid "object repr"
+msgstr "представлення об'єкта (repr)"
+
+msgid "action flag"
+msgstr "позначка дії"
+
+msgid "change message"
+msgstr "змінити повідомлення"
+
+msgid "log entry"
+msgstr "запис у журналі"
+
+msgid "log entries"
+msgstr "записи в журналі"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Додано \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Змінено \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Видалено \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "Об'єкт журнального запису"
+
+msgid "None"
+msgstr "Ніщо"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Затисніть клавішу \"Control\", або \"Command\" на Mac, щоб обрати більше "
+"однієї опції."
+
+msgid "Added."
+msgstr "Додано."
+
+#, python-format
+msgid "Changed %s."
+msgstr "Змінено %s."
+
+msgid "and"
+msgstr "та"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Додано %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Змінено %(list)s для %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Видалено %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "Поля не змінені."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" був успішно доданий. Нижче, Ви можете редагувати його "
+"знову."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" було успішно додано. Ви можете додати ще одну %(name)s "
+"нижче."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" було додано успішно."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" було успішно змінено. Ви можете знову відредагувати її "
+"нижче."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" було успішно змінено. Ви можете додати ще одну %(name)s "
+"нижче."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" був успішно змінений."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Для виконання дії необхідно обрати елемент. Жодний елемент не був змінений."
+
+msgid "No action selected."
+msgstr "Дія не обрана."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" був видалений успішно."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s об'єкт з первинним ключем %(key)r не існує."
+
+#, python-format
+msgid "Add %s"
+msgstr "Додати %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Змінити %s"
+
+msgid "Database error"
+msgstr "Помилка бази даних"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s був успішно змінений."
+msgstr[1] "%(count)s %(name)s були успішно змінені."
+msgstr[2] "%(count)s %(name)s було успішно змінено."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s обраний"
+msgstr[1] "%(total_count)s обрані"
+msgstr[2] "Усі %(total_count)s обрано"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 з %(cnt)s обрано"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Історія змін: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Видалення %(class_name)s %(instance)s вимагатиме видалення наступних "
+"захищених пов'язаних об'єктів: %(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django сайт адміністрування"
+
+msgid "Django administration"
+msgstr "Django адміністрування"
+
+msgid "Site administration"
+msgstr "Адміністрування сайта"
+
+msgid "Log in"
+msgstr "Увійти"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Адміністрування %(app)s"
+
+msgid "Page not found"
+msgstr "Сторінка не знайдена"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Нам шкода, але сторінка яку ви запросили, не знайдена."
+
+msgid "Home"
+msgstr "Домівка"
+
+msgid "Server error"
+msgstr "Помилка сервера"
+
+msgid "Server error (500)"
+msgstr "Помилка сервера (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Помилка сервера <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Виникла помилка. Адміністратора сайту повідомлено електронною поштою. "
+"Помилка буде виправлена ​​найближчим часом. Дякуємо за ваше терпіння."
+
+msgid "Run the selected action"
+msgstr "Виконати обрану дію"
+
+msgid "Go"
+msgstr "Вперед"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Натисніть тут, щоб вибрати об'єкти на всіх сторінках"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Обрати всі %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Скинути вибір"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Спочатку введіть ім'я користувача і пароль. Після цього ви зможете "
+"редагувати більше опцій користувача."
+
+msgid "Enter a username and password."
+msgstr "Введіть ім'я користувача і пароль."
+
+msgid "Change password"
+msgstr "Змінити пароль"
+
+msgid "Please correct the error below."
+msgstr "Будь ласка, виправте помилку, вказану нижче."
+
+msgid "Please correct the errors below."
+msgstr "Будь ласка, виправте помилки, вказані нижче."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Введіть новий пароль для користувача <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Вітаємо,"
+
+msgid "View site"
+msgstr "Дивитися сайт"
+
+msgid "Documentation"
+msgstr "Документація"
+
+msgid "Log out"
+msgstr "Вийти"
+
+msgid "Add"
+msgstr "Додати"
+
+msgid "History"
+msgstr "Історія"
+
+msgid "View on site"
+msgstr "Дивитися на сайті"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додати %(name)s"
+
+msgid "Filter"
+msgstr "Відфільтрувати"
+
+msgid "Remove from sorting"
+msgstr "Видалити з сортування"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Пріорітет сортування: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Сортувати в іншому напрямку"
+
+msgid "Delete"
+msgstr "Видалити"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Видалення %(object_name)s '%(escaped_object)s' призведе до видалення "
+"пов'язаних об'єктів, але ваш реєстраційний запис не має дозволу видаляти "
+"наступні типи об'єктів:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Видалення %(object_name)s '%(escaped_object)s' вимагатиме видалення "
+"наступних пов'язаних об'єктів:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ви впевнені, що хочете видалити %(object_name)s \"%(escaped_object)s\"? Всі "
+"пов'язані записи, що перелічені, будуть видалені:"
+
+msgid "Objects"
+msgstr "Об'єкти"
+
+msgid "Yes, I'm sure"
+msgstr "Так, я впевнений"
+
+msgid "No, take me back"
+msgstr "Ні, повернутись назад"
+
+msgid "Delete multiple objects"
+msgstr "Видалити кілька об'єктів"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Видалення обраних %(objects_name)s вимагатиме видалення пов'язаних об'єктів, "
+"але ваш обліковий запис не має прав для видалення таких типів об'єктів:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Видалення обраних %(objects_name)s вимагатиме видалення наступних захищених "
+"пов'язаних об'єктів:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Ви впевнені, що хочете видалити вибрані %(objects_name)s? Всі вказані "
+"об'єкти та пов'язані з ними елементи будуть видалені:"
+
+msgid "Change"
+msgstr "Змінити"
+
+msgid "Remove"
+msgstr "Видалити"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Додати ще %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "Видалити?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "За %(filter_title)s"
+
+msgid "Summary"
+msgstr "Резюме"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Моделі у %(name)s додатку"
+
+msgid "You don't have permission to edit anything."
+msgstr "У вас немає дозволу на редагування будь-чого."
+
+msgid "Recent Actions"
+msgstr "Недавні дії"
+
+msgid "My Actions"
+msgstr "Мої дії"
+
+msgid "None available"
+msgstr "Немає"
+
+msgid "Unknown content"
+msgstr "Невідомий зміст"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Щось не так з інсталяцією бази даних. Перевірте, що відповідні таблиці бази "
+"даних створені та база даних може бути прочитана відповідним користувачем."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+"Ви аутентифіковані як %(username)s, але вам не надано доступ до цієї "
+"сторінки.\n"
+"Ввійти в інший аккаунт?"
+
+msgid "Forgotten your password or username?"
+msgstr "Забули пароль або ім'я користувача?"
+
+msgid "Date/time"
+msgstr "Дата/час"
+
+msgid "User"
+msgstr "Користувач"
+
+msgid "Action"
+msgstr "Дія"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Цей об'єкт не має історії змін. Напевно, він був доданий не через цей сайт "
+"адміністрування."
+
+msgid "Show all"
+msgstr "Показати всі"
+
+msgid "Save"
+msgstr "Зберегти"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "Змінити обрану %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "Додати ще одну %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "Видалити обрану %(model)s"
+
+msgid "Search"
+msgstr "Пошук"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s результат"
+msgstr[1] "%(counter)s результати"
+msgstr[2] "%(counter)s результатів"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s всього"
+
+msgid "Save as new"
+msgstr "Зберегти як нове"
+
+msgid "Save and add another"
+msgstr "Зберегти і додати інше"
+
+msgid "Save and continue editing"
+msgstr "Зберегти і продовжити редагування"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Дякуємо за час, проведений сьогодні на сайті."
+
+msgid "Log in again"
+msgstr "Увійти знову"
+
+msgid "Password change"
+msgstr "Зміна паролю"
+
+msgid "Your password was changed."
+msgstr "Ваш пароль було змінено."
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Будь ласка введіть ваш старий пароль, задля безпеки, потім введіть ваш новий "
+"пароль двічі для перевірки."
+
+msgid "Change my password"
+msgstr "Змінити мій пароль"
+
+msgid "Password reset"
+msgstr "Перевстановлення паролю"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Пароль встановлено. Ви можете увійти зараз."
+
+msgid "Password reset confirmation"
+msgstr "Підтвердження перевстановлення паролю"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Будь ласка, введіть ваш старий пароль, задля безпеки, потім введіть ваш "
+"новий пароль двічі для перевірки."
+
+msgid "New password:"
+msgstr "Новий пароль:"
+
+msgid "Confirm password:"
+msgstr "Підтвердіть пароль:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Посилання на перевстановлення паролю було помилковим. Можливо тому, що воно "
+"було вже використано. Будь ласка, замовте нове перевстановлення паролю."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"На електронну адресу, яку ви ввели, надіслано ліста з інструкціями щодо "
+"встановлення пароля, якщо обліковий запис з введеною адресою існує. Ви маєте "
+"отримати його найближчим часом."
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Якщо Ви не отримали електронного листа, будь ласка переконайтеся, що ввели "
+"адресу яку вказували при реєстрації та перевірте папку зі спамом."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Ви отримали цей лист через те, що зробили запит на перевстановлення пароля "
+"для облікового запису користувача на %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Будь ласка, перейдіть на цю сторінку, та оберіть новий пароль:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "У разі, якщо ви забули, ваше ім'я користувача:"
+
+msgid "Thanks for using our site!"
+msgstr "Дякуємо за користування нашим сайтом!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Команда сайту %(site_name)s "
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Забули пароль? Введіть свою email-адресу нижче і ми вишлемо інструкції по "
+"встановленню нового."
+
+msgid "Email address:"
+msgstr "Email адреса:"
+
+msgid "Reset my password"
+msgstr "Перевстановіть мій пароль"
+
+msgid "All dates"
+msgstr "Всі дати"
+
+#, python-format
+msgid "Select %s"
+msgstr "Вибрати %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Виберіть %s щоб змінити"
+
+msgid "Date:"
+msgstr "Дата:"
+
+msgid "Time:"
+msgstr "Час:"
+
+msgid "Lookup"
+msgstr "Пошук"
+
+msgid "Currently:"
+msgstr "На даний час:"
+
+msgid "Change:"
+msgstr "Змінено:"
diff --git a/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1823a41
--- /dev/null
+++ b/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..d71a92e
--- /dev/null
+++ b/tbc/static/admin/locale/uk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,169 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Oleksandr Chernihov <o.chernihov@gmail.com>, 2014
+# Boryslav Larin <brabadu@gmail.com>, 2011
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Sergey Lysach <sergikoff88@gmail.com>, 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Ukrainian (http://www.transifex.com/django/django/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"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "В наявності %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Це список всіх доступних %s. Ви можете обрати деякі з них, виділивши їх у "
+"полі нижче і натиснувшт кнопку \"Обрати\"."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+"Почніть вводити текст в цьому полі щоб відфільтрувати список доступних %s."
+
+msgid "Filter"
+msgstr "Фільтр"
+
+msgid "Choose all"
+msgstr "Обрати всі"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Натисніть щоб обрати всі %s відразу."
+
+msgid "Choose"
+msgstr "Обрати"
+
+msgid "Remove"
+msgstr "Видалити"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Обрано %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Це список обраних %s. Ви можете видалити деякі з них, виділивши їх у полі "
+"нижче і натиснувши кнопку \"Видалити\"."
+
+msgid "Remove all"
+msgstr "Видалити все"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Натисніть щоб видалити всі обрані %s відразу."
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "Обрано %(sel)s з %(cnt)s"
+msgstr[1] "Обрано %(sel)s з %(cnt)s"
+msgstr[2] "Обрано %(sel)s з %(cnt)s"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Ви зробили якісь зміни у деяких полях. Якщо Ви виконаєте цю дію, всі "
+"незбережені зміни буде втрачено."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Ви обрали дію, але не зберегли зміни в окремих полях. Будь ласка, натисніть "
+"ОК, щоб зберегти. Вам доведеться повторно запустити дію."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Ви обрали дію і не зробили жодних змін у полях. Ви, напевно, шукаєте кнопку "
+"\"Виконати\", а не \"Зберегти\"."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "Примітка: Ви на %s годину попереду серверного часу."
+msgstr[1] "Примітка: Ви на %s години попереду серверного часу."
+msgstr[2] "Примітка: Ви на %s годин попереду серверного часу."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "Примітка: Ви на %s годину позаду серверного часу."
+msgstr[1] "Примітка: Ви на %s години позаду серверного часу."
+msgstr[2] "Примітка: Ви на %s годин позаду серверного часу."
+
+msgid "Now"
+msgstr "Зараз"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Оберіть час"
+
+msgid "Midnight"
+msgstr "Північ"
+
+msgid "6 a.m."
+msgstr "6"
+
+msgid "Noon"
+msgstr "Полудень"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Відмінити"
+
+msgid "Today"
+msgstr "Сьогодні"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Вчора"
+
+msgid "Tomorrow"
+msgstr "Завтра"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Січень Лютий Березень Квітень Травень Червень Липень Серпень Вересень "
+"Жовтень Листопад Грудень"
+
+msgid "S M T W T F S"
+msgstr "Нд Пн Вт Ср Чт Пт Сб"
+
+msgid "Show"
+msgstr "Показати"
+
+msgid "Hide"
+msgstr "Сховати"
diff --git a/tbc/static/admin/locale/ur/LC_MESSAGES/django.mo b/tbc/static/admin/locale/ur/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..592963a
--- /dev/null
+++ b/tbc/static/admin/locale/ur/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ur/LC_MESSAGES/django.po b/tbc/static/admin/locale/ur/LC_MESSAGES/django.po
new file mode 100644
index 0000000..26dca76
--- /dev/null
+++ b/tbc/static/admin/locale/ur/LC_MESSAGES/django.po
@@ -0,0 +1,656 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Mansoorulhaq Mansoor <mnsrknp@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ur\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "%(count)d %(items)s کو کامیابی سے مٹا دیا گیا۔"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "%(name)s نہیں مٹایا جا سکتا"
+
+msgid "Are you sure?"
+msgstr "آپ کو یقین ھے؟"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "منتخب شدہ %(verbose_name_plural)s مٹائیں"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "تمام"
+
+msgid "Yes"
+msgstr "ھاں"
+
+msgid "No"
+msgstr "نھیں"
+
+msgid "Unknown"
+msgstr "نامعلوم"
+
+msgid "Any date"
+msgstr "کوئی تاریخ"
+
+msgid "Today"
+msgstr "آج"
+
+msgid "Past 7 days"
+msgstr "گزشتہ سات دن"
+
+msgid "This month"
+msgstr "یہ مھینہ"
+
+msgid "This year"
+msgstr "یہ سال"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+
+msgid "Action:"
+msgstr "کاروائی:"
+
+msgid "action time"
+msgstr "کاروائی کا وقت"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "شے کا شناختی نمبر"
+
+msgid "object repr"
+msgstr "شے کا نمائندہ"
+
+msgid "action flag"
+msgstr "کاروائی کا پرچم"
+
+msgid "change message"
+msgstr "پیغام تبدیل کریں"
+
+msgid "log entry"
+msgstr "لاگ کا اندراج"
+
+msgid "log entries"
+msgstr "لاگ کے اندراج"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr ""
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr ""
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr ""
+
+msgid "LogEntry Object"
+msgstr ""
+
+msgid "None"
+msgstr "کوئی نھیں"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s تبدیل کریں۔"
+
+msgid "and"
+msgstr "اور"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" کا اضافہ کیا گیا۔"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" %(list)s کی تبدیلی کی گئی۔"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" مٹایا گیا۔۔"
+
+msgid "No fields changed."
+msgstr "کوئی خانہ تبدیل نھیں کیا گیا۔"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" کا کامیابی سے اضافہ کیا گیا۔ نیچے آپ دوبارہ اسے مدوّن کر "
+"سکتے ھیں۔"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" کا کامیابی سے اضافہ کیا گیا۔"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" کی تبدیلی کامیابی سے ھو گئی۔"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"اشیاء پر کاروائی سرانجام دینے کے لئے ان کا منتخب ھونا ضروری ھے۔ کوئی شے "
+"تبدیل نھیں کی گئی۔"
+
+msgid "No action selected."
+msgstr "کوئی کاروائی منتخب نھیں کی گئی۔"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" کامیابی سے مٹایا گیا تھا۔"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "%(name)s شے %(key)r پرائمری کلید کے ساتھ موجود نھیں ھے۔"
+
+#, python-format
+msgid "Add %s"
+msgstr "%s کا اضافہ کریں"
+
+#, python-format
+msgid "Change %s"
+msgstr "%s تبدیل کریں"
+
+msgid "Database error"
+msgstr "ڈیٹا بیس کی خرابی"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "%(count)s %(name)s کامیابی سے تبدیل کیا گیا تھا۔"
+msgstr[1] "%(count)s %(name)s کامیابی سے تبدیل کیے گئے تھے۔"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "%(total_count)s منتخب کیا گیا۔"
+msgstr[1] "تمام %(total_count)s منتخب کئے گئے۔"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s میں سے 0 منتخب کیا گیا۔"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "%s کی تبدیلی کا تاریخ نامہ"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "منتظم برائے جینگو سائٹ"
+
+msgid "Django administration"
+msgstr "انتظامیہ برائے جینگو سائٹ"
+
+msgid "Site administration"
+msgstr "سائٹ کی انتظامیہ"
+
+msgid "Log in"
+msgstr "اندر جائیں"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "صفحہ نھیں ملا"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "ھم معذرت خواہ ھیں، مطلوبہ صفحہ نھیں مل سکا۔"
+
+msgid "Home"
+msgstr "گھر"
+
+msgid "Server error"
+msgstr "سرور کی خرابی"
+
+msgid "Server error (500)"
+msgstr "سرور کی خرابی (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "سرور کی خرابی <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+msgid "Run the selected action"
+msgstr "منتخب شدہ کاروائیاں چلائیں"
+
+msgid "Go"
+msgstr "جاؤ"
+
+msgid "Click here to select the objects across all pages"
+msgstr "تمام صفحات میں سے اشیاء منتخب کرنے کے لئے یہاں کلک کریں۔"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "تمام %(total_count)s %(module_name)s منتخب کریں"
+
+msgid "Clear selection"
+msgstr "انتخاب صاف کریں"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"پہلے نام صارف اور لفظ اجازت درج کریں۔ پھر آپ مزید صارف کے حقوق مدوّن کرنے کے "
+"قابل ھوں گے۔"
+
+msgid "Enter a username and password."
+msgstr "نام صارف اور لفظ اجازت درج کریں۔"
+
+msgid "Change password"
+msgstr "لفظ اجازت تبدیل کریں"
+
+msgid "Please correct the error below."
+msgstr "براہ کرم نیچے غلطیاں درست کریں۔"
+
+msgid "Please correct the errors below."
+msgstr ""
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "صارف <strong>%(username)s</strong> کے لئے نیا لفظ اجازت درج کریں۔"
+
+msgid "Welcome,"
+msgstr "خوش آمدید،"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "طریق استعمال"
+
+msgid "Log out"
+msgstr "باہر جائیں"
+
+msgid "Add"
+msgstr "اضافہ"
+
+msgid "History"
+msgstr "تاریخ نامہ"
+
+msgid "View on site"
+msgstr "سائٹ پر مشاھدہ کریں"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s کا اضافہ کریں"
+
+msgid "Filter"
+msgstr "چھانٹیں"
+
+msgid "Remove from sorting"
+msgstr ""
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr ""
+
+msgid "Toggle sorting"
+msgstr ""
+
+msgid "Delete"
+msgstr "مٹائیں"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' کو مٹانے کے نتیجے میں معتلقہ اشیاء مٹ "
+"سکتی ھیں، مگر آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام مٹانے کا حق حاصل نھیں "
+"ھے۔"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' کو مٹانے کے لئے مندرجہ ذیل محفوظ متعلقہ "
+"اشیاء کو مٹانے کی ضرورت پڑ سکتی ھے۔"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"واقعی آپ %(object_name)s \"%(escaped_object)s\" کو مٹانا چاہتے ھیں۔ مندرجہ "
+"ذیل تمام متعلقہ اجزاء مٹ جائیں گے۔"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "ھاں، مجھے یقین ھے"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "متعدد اشیاء مٹائیں"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"منتخب شدہ %(objects_name)s کو مٹانے کے نتیجے میں متعلقہ اشیاء مٹ سکتی ھیں، "
+"لیکن آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام کو مٹانے کا حق حاصل نھیں ھے۔"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"منتخب شدہ %(objects_name)s کو مٹانے کے لئے مندرجہ ذیل محفوظ شدہ اشیاء کو "
+"مٹانے کی ضرورت پڑ سکتی ھے۔"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"واقعی آپ منتخب شدہ %(objects_name)s مٹانا چاھتے ھیں؟ مندرجہ ذیل اور ان سے "
+"متعلقہ تمام اشیاء حذف ھو جائیں گی۔"
+
+msgid "Change"
+msgstr "تدوین"
+
+msgid "Remove"
+msgstr "خارج کریں"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "دوسرا %(verbose_name)s درج کریں"
+
+msgid "Delete?"
+msgstr "مٹاؤں؟"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "از %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr ""
+
+msgid "You don't have permission to edit anything."
+msgstr "آپ کو کوئی چیز مدوّن کرنے کا حق نھیں ھے۔"
+
+msgid "Recent Actions"
+msgstr "حالیہ کاروائیاں"
+
+msgid "My Actions"
+msgstr "میری کاروائیاں"
+
+msgid "None available"
+msgstr "کچھ دستیاب نھیں"
+
+msgid "Unknown content"
+msgstr "نامعلوم مواد"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"آپ کی ڈیٹا بیس کی تنصیب میں کوئی چیز خراب ھے۔ یقین کر لیں کہ موزون ڈیٹا بیس "
+"ٹیبل بنائے گئے تھے، اور یقین کر لیں کہ ڈیٹ بیس مناسب صارف کے پڑھے جانے کے "
+"قابل ھے۔"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr ""
+
+msgid "Date/time"
+msgstr "تاریخ/وقت"
+
+msgid "User"
+msgstr "صارف"
+
+msgid "Action"
+msgstr "کاروائی"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"اس شے کا تبدیلی کا تاریخ نامہ نھیں ھے۔ اس کا غالباً بذریعہ اس منتظم سائٹ کے "
+"اضافہ نھیں کیا گیا۔"
+
+msgid "Show all"
+msgstr "تمام دکھائیں"
+
+msgid "Save"
+msgstr "محفوظ کریں"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "تلاش کریں"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s نتیجہ"
+msgstr[1] "%(counter)s نتائج"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "کل %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "بطور نیا محفوظ کریں"
+
+msgid "Save and add another"
+msgstr "محفوظ کریں اور مزید اضافہ کریں"
+
+msgid "Save and continue editing"
+msgstr "محفوظ کریں اور تدوین جاری رکھیں"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ویب سائٹ پر آج کچھ معیاری وقت خرچ کرنے کے لئے شکریہ۔"
+
+msgid "Log in again"
+msgstr "دوبارہ اندر جائیں"
+
+msgid "Password change"
+msgstr "لفظ اجازت کی تبدیلی"
+
+msgid "Your password was changed."
+msgstr "آپ کا لفظ اجازت تبدیل کر دیا گیا تھا۔"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"براہ کرم سیکیورٹی کی خاطر اپنا پرانا لفظ اجازت درج کریں اور پھر اپنا نیا لفظ "
+"اجازت دو مرتبہ درج کریں تاکہ ھم توثیق کر سکیں کہ آپ نے اسے درست درج کیا ھے۔"
+
+msgid "Change my password"
+msgstr "میرا لفظ تبدیل کریں"
+
+msgid "Password reset"
+msgstr "لفظ اجازت کی دوبارہ ترتیب"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr ""
+"آپ کا لفظ اجازت مرتب کر دیا گیا ھے۔ آپ کو آگے بڑھنے اور اندر جانے کی اجازت "
+"ھے۔"
+
+msgid "Password reset confirmation"
+msgstr "لفظ اجازت دوبارہ مرتب کرنے کی توثیق"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"براہ مھربانی اپنا نیا لفظ اجازت دو مرتبہ درج کریں تاکہ تاکہ ھم تصدیق کر سکیں "
+"کہ تم نے اسے درست درج کیا ھے۔"
+
+msgid "New password:"
+msgstr "نیا لفظ اجازت:"
+
+msgid "Confirm password:"
+msgstr "لفظ اجازت کی توثیق:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"لفظ اجازت دوبارہ مرتب کرنے کا رابطہ (لنک) غلط تھا، غالباً یہ پہلے ھی استعمال "
+"کیا چکا تھا۔ براہ مھربانی نیا لفظ اجازت مرتب کرنے کی درخواست کریں۔"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "براہ مھربانی مندرجہ ذیل صفحے پر جائیں اور نیا لفظ اجازت پسند کریں:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "نام صارف، بھول جانے کی صورت میں:"
+
+msgid "Thanks for using our site!"
+msgstr "ھماری سائٹ استعمال کرنے کے لئے شکریہ"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s کی ٹیم"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+
+msgid "Email address:"
+msgstr ""
+
+msgid "Reset my password"
+msgstr "میرا لفظ اجازت دوبارہ مرتب کریں"
+
+msgid "All dates"
+msgstr "تمام تاریخیں"
+
+#, python-format
+msgid "Select %s"
+msgstr "%s منتخب کریں"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "تبدیل کرنے کے لئے %s منتخب کریں"
+
+msgid "Date:"
+msgstr "تاریخ:"
+
+msgid "Time:"
+msgstr "وقت:"
+
+msgid "Lookup"
+msgstr "ڈھونڈیں"
+
+msgid "Currently:"
+msgstr ""
+
+msgid "Change:"
+msgstr ""
diff --git a/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..55a2a59
--- /dev/null
+++ b/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..6642e2f
--- /dev/null
+++ b/tbc/static/admin/locale/ur/LC_MESSAGES/djangojs.po
@@ -0,0 +1,155 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Mansoorulhaq Mansoor <mnsrknp@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ur\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "دستیاب %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr ""
+
+msgid "Filter"
+msgstr "چھانٹیں"
+
+msgid "Choose all"
+msgstr "سب منتخب کریں"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "Remove"
+msgstr "خارج کریں"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "منتخب شدہ %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+
+msgid "Remove all"
+msgstr ""
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr ""
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s میں سے %(sel)s منتخب کیا گیا"
+msgstr[1] "%(cnt)s میں سے %(sel)s منتخب کیے گئے"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"آپ کے پاس ذاتی قابل تدوین خانوں میں غیر محفوظ تبدیلیاں موجود ھیں۔ اگر آپ "
+"کوئی کاروائی کریں گے تو آپ کی غیر محفوظ تبدیلیاں ضائع ھو جائیں گی۔"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"آپ نے ایک کاروائی منتخب کی ھے لیکن ابھی تک آپ نے ذاتی خانوں میں اپنی "
+"تبدیلیاں محفوظ نہیں کی ہیں براہ مھربانی محفوط کرنے کے لئے OK پر کلک کریں۔ آپ "
+"کاوائی دوبارہ چلانے کی ضرورت ھوگی۔"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"آپ نے ایک کاروائی منتخب کی ھے، اور آپ نے ذاتی خانوں میں کوئی تبدیلی نہیں کی "
+"غالباً آپ 'جاؤ' بٹن تلاش کر رھے ھیں بجائے 'مخفوظ کریں' بٹن کے۔"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+msgstr[1] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Now"
+msgstr "اب"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "وقت منتخب کریں"
+
+msgid "Midnight"
+msgstr "نصف رات"
+
+msgid "6 a.m."
+msgstr "6 ص"
+
+msgid "Noon"
+msgstr "دوپھر"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "منسوخ کریں"
+
+msgid "Today"
+msgstr "آج"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "گزشتہ کل"
+
+msgid "Tomorrow"
+msgstr "آئندہ کل"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "جنوری فروری مارچ اپریل مئی جون جولائی اگست ستمبر اکتوبر نومبر دسمبر"
+
+msgid "S M T W T F S"
+msgstr "ا س م ب ج جمعہ ھ"
+
+msgid "Show"
+msgstr "دکھائیں"
+
+msgid "Hide"
+msgstr "چھپائیں"
diff --git a/tbc/static/admin/locale/vi/LC_MESSAGES/django.mo b/tbc/static/admin/locale/vi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..77d7e00
--- /dev/null
+++ b/tbc/static/admin/locale/vi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/vi/LC_MESSAGES/django.po b/tbc/static/admin/locale/vi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c615ac8
--- /dev/null
+++ b/tbc/static/admin/locale/vi/LC_MESSAGES/django.po
@@ -0,0 +1,674 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Dimitris Glezos <glezos@transifex.com>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Thanh Le Viet <lethanhx2k@gmail.com>, 2013
+# Tran <hongdiepkien@gmail.com>, 2011
+# Tran Van <vantxm@yahoo.co.uk>, 2011-2013
+# Vuong Nguyen <autalpha@gmail.com>, 2011
+# xgenvn <xgenvn@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/"
+"vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "Đã xóa thành công %(count)d %(items)s ."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "Không thể xóa %(name)s"
+
+msgid "Are you sure?"
+msgstr "Bạn có chắc chắn không?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "Xóa các %(verbose_name_plural)s đã chọn"
+
+msgid "Administration"
+msgstr "Quản trị website"
+
+msgid "All"
+msgstr "Tất cả"
+
+msgid "Yes"
+msgstr "Có"
+
+msgid "No"
+msgstr "Không"
+
+msgid "Unknown"
+msgstr "Chưa xác định"
+
+msgid "Any date"
+msgstr "Bất kì ngày nào"
+
+msgid "Today"
+msgstr "Hôm nay"
+
+msgid "Past 7 days"
+msgstr "7 ngày trước"
+
+msgid "This month"
+msgstr "Tháng này"
+
+msgid "This year"
+msgstr "Năm nay"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr ""
+"Bạn hãy nhập đúng %(username)s và mật khẩu. (Có phân biệt chữ hoa, thường)"
+
+msgid "Action:"
+msgstr "Hoạt động:"
+
+msgid "action time"
+msgstr "Thời gian tác động"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "Mã đối tượng"
+
+msgid "object repr"
+msgstr "đối tượng repr"
+
+msgid "action flag"
+msgstr "hiệu hành động"
+
+msgid "change message"
+msgstr "thay đổi tin nhắn"
+
+msgid "log entry"
+msgstr "đăng nhập"
+
+msgid "log entries"
+msgstr "mục đăng nhập"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "Thêm \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "Đã thay đổi \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "Đối tượng \"%(object)s.\" đã được xoá."
+
+msgid "LogEntry Object"
+msgstr "LogEntry Object"
+
+msgid "None"
+msgstr "Không"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s đã được thay đổi."
+
+msgid "and"
+msgstr "và"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" đã được thêm vào."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s for %(name)s \"%(object)s\" đã được thay đổi."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" đã bị xóa."
+
+msgid "No fields changed."
+msgstr "Không có trường nào thay đổi"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" đã được thêm vào thành công. Bạn có thể sửa lại dưới "
+"đây."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"Bạn đã thêm %(name)s \"%(obj)s\" thành công. Bạn có thể thêm các %(name)s "
+"khác dưới đây."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" được thêm vào thành công."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr ""
+"%(name)s \"%(obj)s\" đã được thay đổi thành công. Bạn có thể sửa lại dưới "
+"đây."
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+"%(name)s \"%(obj)s\" đã thay đổi thành công. Bạn có thể thêm %(name)s khác "
+"dưới đây."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" đã được thay đổi thành công."
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr ""
+"Mục tiêu phải được chọn mới có thể thực hiện hành động trên chúng. Không có "
+"mục tiêu nào đã được thay đổi."
+
+msgid "No action selected."
+msgstr "Không có hoạt động nào được lựa chọn."
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" đã được xóa thành công."
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr " đối tượng %(name)s với khóa chính %(key)r không tồn tại."
+
+#, python-format
+msgid "Add %s"
+msgstr "Thêm %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "Thay đổi %s"
+
+msgid "Database error"
+msgstr "Cơ sở dữ liệu bị lỗi"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] " %(count)s %(name)s đã được thay đổi thành công."
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "Tất cả %(total_count)s đã được chọn"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "0 của %(cnt)s được chọn"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "Lịch sử thay đổi: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"Xóa %(class_name)s %(instance)s sẽ tự động xóa các đối tượng liên quan sau: "
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Trang web admin Django"
+
+msgid "Django administration"
+msgstr "Trang quản trị cho Django"
+
+msgid "Site administration"
+msgstr "Site quản trị hệ thống."
+
+msgid "Log in"
+msgstr "Đăng nhập"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "Quản lý %(app)s"
+
+msgid "Page not found"
+msgstr "Không tìm thấy trang nào"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Xin lỗi bạn! Trang mà bạn yêu cầu không tìm thấy."
+
+msgid "Home"
+msgstr "Trang chủ"
+
+msgid "Server error"
+msgstr "Lỗi máy chủ"
+
+msgid "Server error (500)"
+msgstr "Lỗi máy chủ (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "Lỗi máy chủ <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Có lỗi xảy ra. Lỗi sẽ được gửi đến quản trị website qua email và sẽ được "
+"khắc phục sớm. Cám ơn bạn."
+
+msgid "Run the selected action"
+msgstr "Bắt đầu hành động lựa chọn"
+
+msgid "Go"
+msgstr "Đi đến"
+
+msgid "Click here to select the objects across all pages"
+msgstr "Click vào đây để lựa chọn các đối tượng trên tất cả các trang"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "Hãy chọn tất cả %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "Xóa lựa chọn"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó bạn mới có thể chỉnh sửa "
+"nhiều hơn lựa chọn của người dùng."
+
+msgid "Enter a username and password."
+msgstr "Điền tên đăng nhập và mật khẩu."
+
+msgid "Change password"
+msgstr "Thay đổi mật khẩu"
+
+msgid "Please correct the error below."
+msgstr "Hãy sửa lỗi sai dưới đây"
+
+msgid "Please correct the errors below."
+msgstr "Hãy chỉnh sửa lại các lỗi sau."
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Hãy nhập mật khẩu mới cho người sử dụng <strong>%(username)s</strong>."
+
+msgid "Welcome,"
+msgstr "Chào mừng bạn,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "Tài liệu"
+
+msgid "Log out"
+msgstr "Thoát"
+
+msgid "Add"
+msgstr "Thêm vào"
+
+msgid "History"
+msgstr "Bản ghi nhớ"
+
+msgid "View on site"
+msgstr "Xem trên trang web"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "Thêm vào %(name)s"
+
+msgid "Filter"
+msgstr "Bộ lọc"
+
+msgid "Remove from sorting"
+msgstr "Bỏ khỏi sắp xếp"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "Sắp xếp theo:%(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "Hoán đổi sắp xếp"
+
+msgid "Delete"
+msgstr "Xóa"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Xóa %(object_name)s '%(escaped_object)s' sẽ làm mất những dữ liệu có liên "
+"quan. Tài khoản của bạn không được cấp quyển xóa những dữ liệu đi kèm theo."
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"Xóa các %(object_name)s ' %(escaped_object)s ' sẽ bắt buộc xóa các đối "
+"tượng được bảo vệ sau đây:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Bạn có chắc là muốn xóa %(object_name)s \"%(escaped_object)s\"?Tất cả những "
+"dữ liệu đi kèm dưới đây cũng sẽ bị mất:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "Có, tôi chắc chắn."
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "Xóa nhiều đối tượng"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng liên quan, nhưng tài "
+"khoản của bạn không có quyền xóa các loại đối tượng sau đây:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr ""
+"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng đã được bảo vệ sau "
+"đây:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"Bạn chắc chắn muốn xóa những lựa chọn %(objects_name)s? Tất cả những đối "
+"tượng sau và những đối tượng liên quan sẽ được xóa:"
+
+msgid "Change"
+msgstr "Thay đổi"
+
+msgid "Remove"
+msgstr "Gỡ bỏ"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "Thêm một %(verbose_name)s "
+
+msgid "Delete?"
+msgstr "Bạn muốn xóa?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Bởi %(filter_title)s "
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "Các mô models trong %(name)s"
+
+msgid "You don't have permission to edit anything."
+msgstr "Bạn không được cấp quyền chỉnh sửa bất cứ cái gì."
+
+msgid "Recent Actions"
+msgstr "Các hoạt động gần đây"
+
+msgid "My Actions"
+msgstr "Hoạt động của tôi"
+
+msgid "None available"
+msgstr "Không có sẵn"
+
+msgid "Unknown content"
+msgstr "Không biết nội dung"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Một vài lỗi với cơ sở dữ liệu cài đặt của bạn. Hãy chắc chắn bảng biểu dữ "
+"liệu được tạo phù hợp và dữ liệu có thể được đọc bởi những người sử dụng phù "
+"hợp."
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "Bạn quên mật khẩu hoặc tài khoản?"
+
+msgid "Date/time"
+msgstr "Ngày/giờ"
+
+msgid "User"
+msgstr "Người dùng"
+
+msgid "Action"
+msgstr "Hành động"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Đối tượng này không có một lịch sử thay đổi. Nó có lẽ đã không được thêm vào "
+"qua trang web admin."
+
+msgid "Show all"
+msgstr "Hiện tất cả"
+
+msgid "Save"
+msgstr "Lưu lại"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "Tìm kiếm"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s kết quả"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "tổng số %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "Lưu mới"
+
+msgid "Save and add another"
+msgstr "Lưu và thêm mới"
+
+msgid "Save and continue editing"
+msgstr "Lưu và tiếp tục chỉnh sửa"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Cảm ơn bạn đã dành thời gian với website này"
+
+msgid "Log in again"
+msgstr "Đăng nhập lại"
+
+msgid "Password change"
+msgstr "Thay đổi mật khẩu"
+
+msgid "Your password was changed."
+msgstr "Mật khẩu của bạn đã được thay đổi"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Hãy nhập lại mật khẩu cũ và sau đó nhập mật khẩu mới hai lần để chúng tôi có "
+"thể kiểm tra lại xem bạn đã gõ chính xác hay chưa."
+
+msgid "Change my password"
+msgstr "Thay đổi mật khẩu"
+
+msgid "Password reset"
+msgstr "Lập lại mật khẩu"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "Mật khẩu của bạn đã được lập lại. Bạn hãy thử đăng nhập."
+
+msgid "Password reset confirmation"
+msgstr "Xác nhận việc lập lại mật khẩu"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Hãy nhập mật khẩu mới hai lần để chúng tôi có thể kiểm tra xem bạn đã gõ "
+"chính xác chưa"
+
+msgid "New password:"
+msgstr "Mật khẩu mới"
+
+msgid "Confirm password:"
+msgstr "Nhập lại mật khẩu:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr ""
+"Liên kết đặt lại mật khẩu không hợp lệ, có thể vì nó đã được sử dụng. Xin "
+"vui lòng yêu cầu đặt lại mật khẩu mới."
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"Nếu bạn không nhận được email, hãy kiểm tra lại địa chỉ email mà bạn dùng để "
+"đăng kí hoặc kiểm tra trong thư mục spam/rác"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr ""
+"Bạn nhận được email này vì bạn đã yêu cầu làm mới lại mật khẩu cho tài khoản "
+"của bạn tại %(site_name)s."
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "Hãy vào đường link dưới đây và chọn một mật khẩu mới"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "Tên đăng nhập của bạn, trường hợp bạn quên nó:"
+
+msgid "Thanks for using our site!"
+msgstr "Cảm ơn bạn đã sử dụng website của chúng tôi!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Đội của %(site_name)s"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"Quên mật khẩu? Nhập địa chỉ email vào ô dưới đây. Chúng tôi sẽ email cho bạn "
+"hướng dẫn cách thiết lập mật khẩu mới."
+
+msgid "Email address:"
+msgstr "Địa chỉ Email:"
+
+msgid "Reset my password"
+msgstr "Làm lại mật khẩu"
+
+msgid "All dates"
+msgstr "Tất cả các ngày"
+
+#, python-format
+msgid "Select %s"
+msgstr "Chọn %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "Chọn %s để thay đổi"
+
+msgid "Date:"
+msgstr "Ngày:"
+
+msgid "Time:"
+msgstr "Giờ:"
+
+msgid "Lookup"
+msgstr "Tìm"
+
+msgid "Currently:"
+msgstr "Hiện nay:"
+
+msgid "Change:"
+msgstr "Thay đổi:"
diff --git a/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..d424bb2
--- /dev/null
+++ b/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a30ed82
--- /dev/null
+++ b/tbc/static/admin/locale/vi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,166 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Tran <hongdiepkien@gmail.com>, 2011
+# Tran Van <vantxm@yahoo.co.uk>, 2013
+# Vuong Nguyen <autalpha@gmail.com>, 2011
+# xgenvn <xgenvn@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/"
+"vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "Có sẵn %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"Danh sách các lựa chọn đang có %s. Bạn có thể chọn bằng bách click vào mũi "
+"tên \"Chọn\" nằm giữa hai hộp."
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "Bạn hãy nhập vào ô này để lọc các danh sách sau %s."
+
+msgid "Filter"
+msgstr "Lọc"
+
+msgid "Choose all"
+msgstr "Chọn tất cả"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "Click để chọn tất cả %s ."
+
+msgid "Choose"
+msgstr "Chọn"
+
+msgid "Remove"
+msgstr "Xóa"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "Chọn %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"Danh sách bạn đã chọn %s. Bạn có thể bỏ chọn bằng cách click vào mũi tên "
+"\"Xoá\" nằm giữa hai ô."
+
+msgid "Remove all"
+msgstr "Xoá tất cả"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "Click để bỏ chọn tất cả %s"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] " %(sel)s của %(cnt)s được chọn"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"Bạn chưa lưu những trường đã chỉnh sửa. Nếu bạn chọn hành động này, những "
+"chỉnh sửa chưa được lưu sẽ bị mất."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"Bạn đã lựa chọn một hành động, nhưng bạn không lưu thay đổi của bạn đến các "
+"lĩnh vực cá nhân được nêu ra. Xin vui lòng click OK để lưu lại. Bạn sẽ cần "
+"phải chạy lại các hành động."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"Bạn đã lựa chọn một hành động, và bạn đã không thực hiện bất kỳ thay đổi nào "
+"trên các trường. Có lẽ bạn đang tìm kiếm nút bấm Go thay vì nút bấm Save."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+"Lưu ý: Hiện tại bạn đang thấy thời gian trước %s giờ so với thời gian máy "
+"chủ."
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+"Lưu ý: Hiện tại bạn đang thấy thời gian sau %s giờ so với thời gian máy chủ."
+
+msgid "Now"
+msgstr "Bây giờ"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "Chọn giờ"
+
+msgid "Midnight"
+msgstr "Nửa đêm"
+
+msgid "6 a.m."
+msgstr "6 giờ sáng"
+
+msgid "Noon"
+msgstr "Buổi trưa"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "Hủy bỏ"
+
+msgid "Today"
+msgstr "Hôm nay"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "Hôm qua"
+
+msgid "Tomorrow"
+msgstr "Ngày mai"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Tháng một Tháng hai Tháng ba Tháng tư Tháng năm Tháng sáu Tháng bảy Tháng "
+"tám Tháng chín Tháng mười Tháng mười một Tháng mười hai"
+
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+msgid "Show"
+msgstr "Hiện ra"
+
+msgid "Hide"
+msgstr "Dấu đi"
diff --git a/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.mo b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a9dcb31
--- /dev/null
+++ b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.po b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.po
new file mode 100644
index 0000000..490a96a
--- /dev/null
+++ b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/django.po
@@ -0,0 +1,655 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kevin Sze <leiarix@gmail.com>, 2012
+# Lele Long <schemacs@gmail.com>, 2011,2015
+# ouyanghongyu <ouyanghongyu@gmail.com>, 2013-2014
+# Sean Lee <iseansay@gmail.com>, 2013
+# Sean Lee <iseansay@gmail.com>, 2013
+# slene <vslene@gmail.com>, 2011
+# Ziang Song <songziang@gmail.com>, 2012
+# Kevin Sze <leiarix@gmail.com>, 2012
+# ouyanghongyu <ouyanghongyu@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/django/django/"
+"language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "成功删除了 %(count)d 个 %(items)s"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "无法删除 %(name)s"
+
+msgid "Are you sure?"
+msgstr "你确定吗?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "删除所选的 %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "管理"
+
+msgid "All"
+msgstr "全部"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "Any date"
+msgstr "任意日期"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Past 7 days"
+msgstr "过去7天"
+
+msgid "This month"
+msgstr "本月"
+
+msgid "This year"
+msgstr "今年"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr "请输入一个正确的 %(username)s 和密码. 注意他们都是区分大小写的."
+
+msgid "Action:"
+msgstr "动作"
+
+msgid "action time"
+msgstr "动作时间"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "对象id"
+
+msgid "object repr"
+msgstr "对象表示"
+
+msgid "action flag"
+msgstr "动作标志"
+
+msgid "change message"
+msgstr "修改消息"
+
+msgid "log entry"
+msgstr "日志记录"
+
+msgid "log entries"
+msgstr "日志记录"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "已经添加了 \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "修改了 \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "删除了 \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry对象"
+
+msgid "None"
+msgstr "无"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按住 ”Control“,或者Mac上的 “Command”,可以选择多个。"
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "已修改 %s 。"
+
+msgid "and"
+msgstr "和"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "已添加 %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "已变更 %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "已删除 %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "没有字段被修改。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 添加成功。你可以在下面再次编辑它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" 已经成功添加。你可以在下面添加另外的 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 添加成功。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr " %(name)s \"%(obj)s\" 已经成功进行变更。你可以在下面再次编辑它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" 已经成功进行变更。你可以在下面添加其它的 %(name)s。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 修改成功。"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "条目必须选中以对其进行操作。没有任何条目被更改。"
+
+msgid "No action selected."
+msgstr "未选择动作"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 删除成功。"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "具有主键 %(key)r 的对象 %(name)s 不存在。"
+
+#, python-format
+msgid "Add %s"
+msgstr "增加 %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "修改 %s"
+
+msgid "Database error"
+msgstr "数据库错误"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "总共 %(count)s 个 %(name)s 变更成功。"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "选中了 %(total_count)s 个"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s 个中 0 个被选"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "变更历史: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"删除 %(class_name)s %(instance)s 将需要删除以下受保护的相关对象: "
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django 站点管理员"
+
+msgid "Django administration"
+msgstr "Django 管理"
+
+msgid "Site administration"
+msgstr "站点管理"
+
+msgid "Log in"
+msgstr "登录"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s 管理"
+
+msgid "Page not found"
+msgstr "页面没有找到"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很报歉,请求页面无法找到。"
+
+msgid "Home"
+msgstr "首页"
+
+msgid "Server error"
+msgstr "服务器错误"
+
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"有一个错误。已经通过电子邮件通知网站管理员,不久以后应该可以修复。谢谢你的参"
+"与。"
+
+msgid "Run the selected action"
+msgstr "运行选中的动作"
+
+msgid "Go"
+msgstr "执行"
+
+msgid "Click here to select the objects across all pages"
+msgstr "点击此处选择所有页面中包含的对象。"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "选中所有的 %(total_count)s 个 %(module_name)s"
+
+msgid "Clear selection"
+msgstr "清除选中"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "首先,输入一个用户名和密码。然后,你就可以编辑更多的用户选项。"
+
+msgid "Enter a username and password."
+msgstr "输入用户名和"
+
+msgid "Change password"
+msgstr "修改密码"
+
+msgid "Please correct the error below."
+msgstr "请修正下面的错误。"
+
+msgid "Please correct the errors below."
+msgstr "请更正下列错误。"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "为用户 <strong>%(username)s</strong> 输入一个新的密码。"
+
+msgid "Welcome,"
+msgstr "欢迎,"
+
+msgid "View site"
+msgstr "查看站点"
+
+msgid "Documentation"
+msgstr "文档"
+
+msgid "Log out"
+msgstr "注销"
+
+msgid "Add"
+msgstr "增加"
+
+msgid "History"
+msgstr "历史"
+
+msgid "View on site"
+msgstr "在站点上查看"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "增加 %(name)s"
+
+msgid "Filter"
+msgstr "过滤器"
+
+msgid "Remove from sorting"
+msgstr "删除排序"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "排序优先级: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "正逆序切换"
+
+msgid "Delete"
+msgstr "删除"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"删除 %(object_name)s '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无"
+"权删除下列类型的对象:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"要删除 %(object_name)s '%(escaped_object)s', 将要求删除以下受保护的相关对象:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"你确认想要删除 %(object_name)s \"%(escaped_object)s\"? 下列所有相关的项目都"
+"将被删除:"
+
+msgid "Objects"
+msgstr "对象"
+
+msgid "Yes, I'm sure"
+msgstr "是的,我确定"
+
+msgid "No, take me back"
+msgstr "不,返回"
+
+msgid "Delete multiple objects"
+msgstr "删除多个对象"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"要删除所选的 %(objects_name)s 结果会删除相关对象, 但你的账户没有权限删除这类"
+"对象:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr "要删除所选的 %(objects_name)s, 将要求删除以下受保护的相关对象:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和余它们相关的条目将都会"
+"被删除:"
+
+msgid "Change"
+msgstr "修改"
+
+msgid "Remove"
+msgstr "删除"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "添加另一个 %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "删除?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 以 %(filter_title)s"
+
+msgid "Summary"
+msgstr "概览"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "在应用程序 %(name)s 中的模型"
+
+msgid "You don't have permission to edit anything."
+msgstr "你无权修改任何东西。"
+
+msgid "Recent Actions"
+msgstr "最近动作"
+
+msgid "My Actions"
+msgstr "我的动作"
+
+msgid "None available"
+msgstr "无可用的"
+
+msgid "Unknown content"
+msgstr "未知内容"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"你的数据库安装有误。确保已经创建了相应的数据库表,并确保数据库可被相关的用户"
+"读取。"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "忘记了您的密码或用户名?"
+
+msgid "Date/time"
+msgstr "日期/时间"
+
+msgid "User"
+msgstr "用户"
+
+msgid "Action"
+msgstr "动作"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "该对象没有变更历史记录。可能从未通过这个管理站点添加。"
+
+msgid "Show all"
+msgstr "显示全部"
+
+msgid "Save"
+msgstr "保存"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "更改选中的%(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "增加另一个 %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "取消选中 %(model)s"
+
+msgid "Search"
+msgstr "搜索"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s 条结果。"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "总共 %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "保存为新的"
+
+msgid "Save and add another"
+msgstr "保存并增加另一个"
+
+msgid "Save and continue editing"
+msgstr "保存并继续编辑"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感谢您今天在本站花费了一些宝贵时间。"
+
+msgid "Log in again"
+msgstr "重新登录"
+
+msgid "Password change"
+msgstr "密码修改"
+
+msgid "Your password was changed."
+msgstr "你的密码已修改。"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"请输入你的旧密码,为了安全起见,接着要输入两遍新密码,以便我们校验你输入的是"
+"否正确。"
+
+msgid "Change my password"
+msgstr "修改我的密码"
+
+msgid "Password reset"
+msgstr "密码重设"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "你的口令己经设置。现在你可以继续进行登录。"
+
+msgid "Password reset confirmation"
+msgstr "密码重设确认"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "请输入两遍新密码,以便我们校验你输入的是否正确。"
+
+msgid "New password:"
+msgstr "新密码:"
+
+msgid "Confirm password:"
+msgstr "确认密码:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"如果您输入的邮件地址所对应的账户存在,设置密码的提示已经发送邮件给您,您将很"
+"快收到。"
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"如果你没有收到邮件, 请确保您所输入的地址是正确的, 并检查您的垃圾邮件文件夹."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr "你收到这封邮件是因为你请求重置你在网站 %(site_name)s上的用户账户密码。"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "请访问该页面并选择一个新密码:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "你的用户名,如果已忘记的话:"
+
+msgid "Thanks for using our site!"
+msgstr "感谢使用我们的站点!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 团队"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"忘记你的密码了?在下面输入你的电子邮件地址,我们将发送一封设置新密码的邮件给"
+"你。"
+
+msgid "Email address:"
+msgstr "电子邮件地址:"
+
+msgid "Reset my password"
+msgstr "重设我的密码"
+
+msgid "All dates"
+msgstr "所有日期"
+
+#, python-format
+msgid "Select %s"
+msgstr "选择 %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "选择 %s 来修改"
+
+msgid "Date:"
+msgstr "日期:"
+
+msgid "Time:"
+msgstr "时间:"
+
+msgid "Lookup"
+msgstr "查询"
+
+msgid "Currently:"
+msgstr "当前:"
+
+msgid "Change:"
+msgstr "更改:"
diff --git a/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..c312232
--- /dev/null
+++ b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a8ec710
--- /dev/null
+++ b/tbc/static/admin/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -0,0 +1,157 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Lele Long <schemacs@gmail.com>, 2011,2015
+# slene <vslene@gmail.com>, 2011
+# Ziang Song <songziang@gmail.com>, 2012
+# Kevin Sze <leiarix@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/django/django/"
+"language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "可用 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"这是可用的%s列表。你可以在选择框下面进行选择,然后点击两选框之间的“选择”箭"
+"头。"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "在此框中键入以过滤可用的%s列表"
+
+msgid "Filter"
+msgstr "过滤"
+
+msgid "Choose all"
+msgstr "全选"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "点击选择全部%s。"
+
+msgid "Choose"
+msgstr "选择"
+
+msgid "Remove"
+msgstr "删除"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "选中的 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr "这是已选%s的列表。你可以"
+
+msgid "Remove all"
+msgstr "删除全部"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "删除所有选择的%s。"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"你已选则执行一个动作, 但有一个可编辑栏位的变更尚未保存. 请点选确定进行保存. "
+"再重新执行该动作."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"你已选则执行一个动作, 但可编辑栏位沒有任何改变. 你应该尝试 '去' 按钮, 而不是 "
+"'保存' 按钮."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "注意:你比服务器时间超前 %s 个小时。"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "注意:你比服务器时间滞后 %s 个小时。"
+
+msgid "Now"
+msgstr "现在"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "选择一个时间"
+
+msgid "Midnight"
+msgstr "午夜"
+
+msgid "6 a.m."
+msgstr "上午6点"
+
+msgid "Noon"
+msgstr "正午"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "昨天"
+
+msgid "Tomorrow"
+msgstr "明天"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月"
+
+msgid "S M T W T F S"
+msgstr "日 一 二 三 四 五 六"
+
+msgid "Show"
+msgstr "显示"
+
+msgid "Hide"
+msgstr "隐藏"
diff --git a/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a7aca39
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.po b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.po
new file mode 100644
index 0000000..be87567
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/django.po
@@ -0,0 +1,640 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Kevin Sze <leiarix@gmail.com>, 2012
+# Lele Long <schemacs@gmail.com>, 2011,2015
+# ouyanghongyu <ouyanghongyu@gmail.com>, 2013-2014
+# Sean Lee <iseansay@gmail.com>, 2013
+# Sean Lee <iseansay@gmail.com>, 2013
+# slene <vslene@gmail.com>, 2011
+# Ziang Song <songziang@gmail.com>, 2012
+# Kevin Sze <leiarix@gmail.com>, 2012
+# ouyanghongyu <ouyanghongyu@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-31 01:47+0000\n"
+"Last-Translator: Lele Long <schemacs@gmail.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/django/"
+"language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "成功删除了 %(count)d 个 %(items)s"
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "无法删除 %(name)s"
+
+msgid "Are you sure?"
+msgstr "你确定吗?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "删除所选的 %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr "管理"
+
+msgid "All"
+msgstr "全部"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "Any date"
+msgstr "任意日期"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Past 7 days"
+msgstr "过去7天"
+
+msgid "This month"
+msgstr "本月"
+
+msgid "This year"
+msgstr "今年"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr "请输入一个正确的 %(username)s 和密码. 注意他们都是区分大小写的."
+
+msgid "Action:"
+msgstr "动作"
+
+msgid "action time"
+msgstr "动作时间"
+
+msgid "object id"
+msgstr "对象id"
+
+msgid "object repr"
+msgstr "对象表示"
+
+msgid "action flag"
+msgstr "动作标志"
+
+msgid "change message"
+msgstr "修改消息"
+
+msgid "log entry"
+msgstr "日志记录"
+
+msgid "log entries"
+msgstr "日志记录"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "已经添加了 \"%(object)s\"."
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "修改了 \"%(object)s\" - %(changes)s"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "删除了 \"%(object)s.\""
+
+msgid "LogEntry Object"
+msgstr "LogEntry对象"
+
+msgid "None"
+msgstr "无"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按住 ”Control“,或者Mac上的 “Command”,可以选择多个。"
+
+#, python-format
+msgid "Changed %s."
+msgstr "已修改 %s 。"
+
+msgid "and"
+msgstr "和"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "已添加 %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "已变更 %(list)s for %(name)s \"%(object)s\"."
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "已删除 %(name)s \"%(object)s\"."
+
+msgid "No fields changed."
+msgstr "没有字段被修改。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 添加成功。你可以在下面再次编辑它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" 已经成功添加。你可以在下面添加另外的 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 添加成功。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr " %(name)s \"%(obj)s\" 已经成功进行变更。你可以在下面再次编辑它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr ""
+" %(name)s \"%(obj)s\" 已经成功进行变更。你可以在下面添加其它的 %(name)s。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 修改成功。"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "条目必须选中以对其进行操作。没有任何条目被更改。"
+
+msgid "No action selected."
+msgstr "未选择动作"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 删除成功。"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "具有主键 %(key)r 的对象 %(name)s 不存在。"
+
+#, python-format
+msgid "Add %s"
+msgstr "增加 %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "修改 %s"
+
+msgid "Database error"
+msgstr "数据库错误"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "总共 %(count)s 个 %(name)s 变更成功。"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "选中了 %(total_count)s 个"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s 个中 0 个被选"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "变更历史: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"删除 %(class_name)s %(instance)s 将需要删除以下受保护的相关对象: "
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django 站点管理员"
+
+msgid "Django administration"
+msgstr "Django 管理"
+
+msgid "Site administration"
+msgstr "站点管理"
+
+msgid "Log in"
+msgstr "登录"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr "%(app)s 管理"
+
+msgid "Page not found"
+msgstr "页面没有找到"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很报歉,请求页面无法找到。"
+
+msgid "Home"
+msgstr "首页"
+
+msgid "Server error"
+msgstr "服务器错误"
+
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"有一个错误。已经通过电子邮件通知网站管理员,不久以后应该可以修复。谢谢你的参"
+"与。"
+
+msgid "Run the selected action"
+msgstr "运行选中的动作"
+
+msgid "Go"
+msgstr "执行"
+
+msgid "Click here to select the objects across all pages"
+msgstr "点击此处选择所有页面中包含的对象。"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "选中所有的 %(total_count)s 个 %(module_name)s"
+
+msgid "Clear selection"
+msgstr "清除选中"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "首先,输入一个用户名和密码。然后,你就可以编辑更多的用户选项。"
+
+msgid "Enter a username and password."
+msgstr "输入用户名和"
+
+msgid "Change password"
+msgstr "修改密码"
+
+msgid "Please correct the error below."
+msgstr "请修正下面的错误。"
+
+msgid "Please correct the errors below."
+msgstr "请更正下列错误。"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "为用户 <strong>%(username)s</strong> 输入一个新的密码。"
+
+msgid "Welcome,"
+msgstr "欢迎,"
+
+msgid "View site"
+msgstr "查看站点"
+
+msgid "Documentation"
+msgstr "文档"
+
+msgid "Log out"
+msgstr "注销"
+
+msgid "Add"
+msgstr "增加"
+
+msgid "History"
+msgstr "历史"
+
+msgid "View on site"
+msgstr "在站点上查看"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "增加 %(name)s"
+
+msgid "Filter"
+msgstr "过滤器"
+
+msgid "Remove from sorting"
+msgstr "删除排序"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "排序优先级: %(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "正逆序切换"
+
+msgid "Delete"
+msgstr "删除"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"删除 %(object_name)s '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无"
+"权删除下列类型的对象:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"要删除 %(object_name)s '%(escaped_object)s', 将要求删除以下受保护的相关对象:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"你确认想要删除 %(object_name)s \"%(escaped_object)s\"? 下列所有相关的项目都"
+"将被删除:"
+
+msgid "Objects"
+msgstr "对象"
+
+msgid "Yes, I'm sure"
+msgstr "是的,我确定"
+
+msgid "No, take me back"
+msgstr "不,返回"
+
+msgid "Delete multiple objects"
+msgstr "删除多个对象"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"要删除所选的 %(objects_name)s 结果会删除相关对象, 但你的账户没有权限删除这类"
+"对象:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr "要删除所选的 %(objects_name)s, 将要求删除以下受保护的相关对象:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和余它们相关的条目将都会"
+"被删除:"
+
+msgid "Change"
+msgstr "修改"
+
+msgid "Remove"
+msgstr "删除"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "添加另一个 %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "删除?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 以 %(filter_title)s"
+
+msgid "Summary"
+msgstr "概览"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "在应用程序 %(name)s 中的模型"
+
+msgid "You don't have permission to edit anything."
+msgstr "你无权修改任何东西。"
+
+msgid "Recent Actions"
+msgstr "最近动作"
+
+msgid "My Actions"
+msgstr "我的动作"
+
+msgid "None available"
+msgstr "无可用的"
+
+msgid "Unknown content"
+msgstr "未知内容"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"你的数据库安装有误。确保已经创建了相应的数据库表,并确保数据库可被相关的用户"
+"读取。"
+
+msgid "Forgotten your password or username?"
+msgstr "忘记了您的密码或用户名?"
+
+msgid "Date/time"
+msgstr "日期/时间"
+
+msgid "User"
+msgstr "用户"
+
+msgid "Action"
+msgstr "动作"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "该对象没有变更历史记录。可能从未通过这个管理站点添加。"
+
+msgid "Show all"
+msgstr "显示全部"
+
+msgid "Save"
+msgstr "保存"
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "更改选中的%(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "增加另一个 %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "取消选中 %(model)s"
+
+msgid "Search"
+msgstr "搜索"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s 条结果。"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "总共 %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "保存为新的"
+
+msgid "Save and add another"
+msgstr "保存并增加另一个"
+
+msgid "Save and continue editing"
+msgstr "保存并继续编辑"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感谢您今天在本站花费了一些宝贵时间。"
+
+msgid "Log in again"
+msgstr "重新登录"
+
+msgid "Password change"
+msgstr "密码修改"
+
+msgid "Your password was changed."
+msgstr "你的密码已修改。"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"请输入你的旧密码,为了安全起见,接着要输入两遍新密码,以便我们校验你输入的是"
+"否正确。"
+
+msgid "Change my password"
+msgstr "修改我的密码"
+
+msgid "Password reset"
+msgstr "密码重设"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "你的口令己经设置。现在你可以继续进行登录。"
+
+msgid "Password reset confirmation"
+msgstr "密码重设确认"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "请输入两遍新密码,以便我们校验你输入的是否正确。"
+
+msgid "New password:"
+msgstr "新密码:"
+
+msgid "Confirm password:"
+msgstr "确认密码:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+"如果您输入的邮件地址所对应的账户存在,设置密码的提示已经发送邮件给您,您将很"
+"快收到。"
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"如果你没有收到邮件, 请确保您所输入的地址是正确的, 并检查您的垃圾邮件文件夹."
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr "你收到这封邮件是因为你请求重置你在网站 %(site_name)s上的用户账户密码。"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "请访问该页面并选择一个新密码:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "你的用户名,如果已忘记的话:"
+
+msgid "Thanks for using our site!"
+msgstr "感谢使用我们的站点!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 团队"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"忘记你的密码了?在下面输入你的电子邮件地址,我们将发送一封设置新密码的邮件给"
+"你。"
+
+msgid "Email address:"
+msgstr "电子邮件地址:"
+
+msgid "Reset my password"
+msgstr "重设我的密码"
+
+msgid "All dates"
+msgstr "所有日期"
+
+msgid "(None)"
+msgstr "(None)"
+
+#, python-format
+msgid "Select %s"
+msgstr "选择 %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "选择 %s 来修改"
+
+msgid "Date:"
+msgstr "日期:"
+
+msgid "Time:"
+msgstr "时间:"
+
+msgid "Lookup"
+msgstr "查询"
+
+msgid "Currently:"
+msgstr "当前:"
+
+msgid "Change:"
+msgstr "更改:"
diff --git a/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..abfdbe2
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f09431e
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -0,0 +1,154 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011
+# Lele Long <schemacs@gmail.com>, 2011,2015
+# slene <vslene@gmail.com>, 2011
+# Ziang Song <songziang@gmail.com>, 2012
+# Kevin Sze <leiarix@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-30 15:21+0000\n"
+"Last-Translator: Lele Long <schemacs@gmail.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/django/"
+"language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "可用 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"这是可用的%s列表。你可以在选择框下面进行选择,然后点击两选框之间的“选择”箭"
+"头。"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "在此框中键入以过滤可用的%s列表"
+
+msgid "Filter"
+msgstr "过滤"
+
+msgid "Choose all"
+msgstr "全选"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "点击选择全部%s。"
+
+msgid "Choose"
+msgstr "选择"
+
+msgid "Remove"
+msgstr "删除"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "选中的 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr "这是已选%s的列表。你可以"
+
+msgid "Remove all"
+msgstr "删除全部"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "删除所有选择的%s。"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr ""
+"你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失."
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"你已选则执行一个动作, 但有一个可编辑栏位的变更尚未保存. 请点选确定进行保存. "
+"再重新执行该动作."
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"你已选则执行一个动作, 但可编辑栏位沒有任何改变. 你应该尝试 '去' 按钮, 而不是 "
+"'保存' 按钮."
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] "注意:你比服务器时间超前 %s 个小时。"
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] "注意:你比服务器时间滞后 %s 个小时。"
+
+msgid "Now"
+msgstr "现在"
+
+msgid "Clock"
+msgstr "时钟"
+
+msgid "Choose a time"
+msgstr "选择一个时间"
+
+msgid "Midnight"
+msgstr "午夜"
+
+msgid "6 a.m."
+msgstr "上午6点"
+
+msgid "Noon"
+msgstr "正午"
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Calendar"
+msgstr "日历"
+
+msgid "Yesterday"
+msgstr "昨天"
+
+msgid "Tomorrow"
+msgstr "明天"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月"
+
+msgid "S M T W T F S"
+msgstr "日 一 二 三 四 五 六"
+
+msgid "Show"
+msgstr "显示"
+
+msgid "Hide"
+msgstr "隐藏"
diff --git a/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.mo b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..50c4579
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.po b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8075331
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/django.po
@@ -0,0 +1,631 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# ilay <ilay@ilay.tw>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# mail6543210 <mail6543210@yahoo.com.tw>, 2013-2014
+# ming hsien tzang <tzangms@gmail.com>, 2011
+# tcc <tcchou@tcchou.org>, 2011
+# Yeh-Yung <yyc1217@gmail.com>, 2013
+# Yeh-Yung <yyc1217@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2015-01-18 08:31+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/django/"
+"language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "成功的刪除了 %(count)d 個 %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "無法刪除 %(name)s"
+
+msgid "Are you sure?"
+msgstr "你確定嗎?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "刪除所選的 %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "全部"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "Any date"
+msgstr "任何日期"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Past 7 days"
+msgstr "過去 7 天"
+
+msgid "This month"
+msgstr "本月"
+
+msgid "This year"
+msgstr "今年"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr "請輸入正確的工作人員%(username)s及密碼。請注意兩者皆區分大小寫。"
+
+msgid "Action:"
+msgstr "動作:"
+
+msgid "action time"
+msgstr "動作時間"
+
+msgid "object id"
+msgstr "物件 id"
+
+msgid "object repr"
+msgstr "物件 repr"
+
+msgid "action flag"
+msgstr "動作旗標"
+
+msgid "change message"
+msgstr "變更訊息"
+
+msgid "log entry"
+msgstr "紀錄項目"
+
+msgid "log entries"
+msgstr "紀錄項目"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" 已新增。"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" - %(changes)s 已變更。"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" 已刪除。"
+
+msgid "LogEntry Object"
+msgstr "紀錄項目"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s 已變更。"
+
+msgid "and"
+msgstr "和"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 已新增。"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 的 %(list)s 已變更。"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 已刪除。"
+
+msgid "No fields changed."
+msgstr "沒有欄位被變更。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 新增成功。你可以在下面再次編輯它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" 新增成功。你可以在下方加入其他 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功新增。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" 變更成功。你可以在下方再次編輯。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" 變更成功。你可以在下方加入其他 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功變更。"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "必須要有項目被選到才能對它們進行動作。沒有項目變更。"
+
+msgid "No action selected."
+msgstr "沒有動作被選。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功刪除。"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "主鍵 %(key)r 的 %(name)s 物件不存在。"
+
+#, python-format
+msgid "Add %s"
+msgstr "新增 %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "變更 %s"
+
+msgid "Database error"
+msgstr "資料庫錯誤"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "共 %(count)s %(name)s 已變更成功。"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "全部 %(total_count)s 個被選"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s 中 0 個被選"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "變更歷史: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+
+msgid "Django site admin"
+msgstr "Django 網站管理"
+
+msgid "Django administration"
+msgstr "Django 管理"
+
+msgid "Site administration"
+msgstr "網站管理"
+
+msgid "Log in"
+msgstr "登入"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "頁面沒有找到"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很抱歉,請求頁面無法找到。"
+
+msgid "Home"
+msgstr "首頁"
+
+msgid "Server error"
+msgstr "伺服器錯誤"
+
+msgid "Server error (500)"
+msgstr "伺服器錯誤 (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "伺服器錯誤 <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝你"
+"的關心。"
+
+msgid "Run the selected action"
+msgstr "執行選擇的動作"
+
+msgid "Go"
+msgstr "去"
+
+msgid "Click here to select the objects across all pages"
+msgstr "點選這裡可選取全部頁面的物件"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "選擇全部 %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "清除選擇"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "首先,輸入一個使用者名稱和密碼。然後你可以編輯更多使用者選項。"
+
+msgid "Enter a username and password."
+msgstr "輸入一個使用者名稱和密碼。"
+
+msgid "Change password"
+msgstr "變更密碼"
+
+msgid "Please correct the error below."
+msgstr "請更正下面的錯誤。"
+
+msgid "Please correct the errors below."
+msgstr "請修正以下錯誤"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "為使用者<strong>%(username)s</strong>輸入一個新的密碼。"
+
+msgid "Welcome,"
+msgstr "歡迎,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "文件"
+
+msgid "Log out"
+msgstr "登出"
+
+msgid "Add"
+msgstr "新增"
+
+msgid "History"
+msgstr "歷史"
+
+msgid "View on site"
+msgstr "在網站上檢視"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "新增 %(name)s"
+
+msgid "Filter"
+msgstr "過濾器"
+
+msgid "Remove from sorting"
+msgstr "從排序中移除"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "優先排序:%(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "切換排序"
+
+msgid "Delete"
+msgstr "刪除"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號"
+"並沒有刪除以下型態物件的權限:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"要刪除 %(object_name)s '%(escaped_object)s', 將要求刪除下面受保護的相關物件:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會"
+"被刪除:"
+
+msgid "Objects"
+msgstr ""
+
+msgid "Yes, I'm sure"
+msgstr "是的,我確定"
+
+msgid "No, take me back"
+msgstr ""
+
+msgid "Delete multiple objects"
+msgstr "刪除多個物件"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"要刪除所選的 %(objects_name)s, 結果會刪除相關物件, 但你的帳號無權刪除下面物件"
+"型態:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr "要刪除所選的 %(objects_name)s, 將要求刪除下面受保護的相關物件:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:"
+
+msgid "Change"
+msgstr "變更"
+
+msgid "Remove"
+msgstr "移除"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "新增其它 %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "刪除?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 以 %(filter_title)s"
+
+msgid "Summary"
+msgstr ""
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s 應用程式中的Model"
+
+msgid "You don't have permission to edit anything."
+msgstr "你沒有編輯任何東西的權限。"
+
+msgid "Recent Actions"
+msgstr "最近的動作"
+
+msgid "My Actions"
+msgstr "我的動作"
+
+msgid "None available"
+msgstr "無可用的"
+
+msgid "Unknown content"
+msgstr "未知內容"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀"
+"取。"
+
+msgid "Forgotten your password or username?"
+msgstr "忘了你的密碼或是使用者名稱?"
+
+msgid "Date/time"
+msgstr "日期/時間"
+
+msgid "User"
+msgstr "使用者"
+
+msgid "Action"
+msgstr "動作"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。"
+
+msgid "Show all"
+msgstr "顯示全部"
+
+msgid "Save"
+msgstr "儲存"
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr ""
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr ""
+
+msgid "Search"
+msgstr "搜尋"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s 結果"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "總共 %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "儲存為新的"
+
+msgid "Save and add another"
+msgstr "儲存並新增另一個"
+
+msgid "Save and continue editing"
+msgstr "儲存並繼續編輯"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感謝你今天花了重要的時間停留在本網站。"
+
+msgid "Log in again"
+msgstr "重新登入"
+
+msgid "Password change"
+msgstr "密碼變更"
+
+msgid "Your password was changed."
+msgstr "你的密碼已變更。"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"為了安全上的考量,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸"
+"入。"
+
+msgid "Change my password"
+msgstr "變更我的密碼"
+
+msgid "Password reset"
+msgstr "密碼重設"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "你的密碼已設置,現在可以繼續登入。"
+
+msgid "Password reset confirmation"
+msgstr "密碼重設確認"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "請輸入你的新密碼兩次, 這樣我們才能檢查你的輸入是否正確。"
+
+msgid "New password:"
+msgstr "新密碼:"
+
+msgid "Confirm password:"
+msgstr "確認密碼:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr "密碼重設連結無效,可能因為他已使用。請重新請求密碼重設。"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查"
+"您的垃圾郵件匣。"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr "這封電子郵件來自 %(site_name)s,因為你要求為帳號重新設定密碼。"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "請到該頁面選擇一個新的密碼:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "你的使用者名稱,萬一你已經忘記的話:"
+
+msgid "Thanks for using our site!"
+msgstr "感謝使用本網站!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 團隊"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"忘記你的密碼? 請在下面輸入你的電子郵件位址, 然後我們會寄出設定新密碼的操作指"
+"示。"
+
+msgid "Email address:"
+msgstr "電子信箱:"
+
+msgid "Reset my password"
+msgstr "重設我的密碼"
+
+msgid "All dates"
+msgstr "所有日期"
+
+msgid "(None)"
+msgstr "(無)"
+
+#, python-format
+msgid "Select %s"
+msgstr "選擇 %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "選擇 %s 來變更"
+
+msgid "Date:"
+msgstr "日期"
+
+msgid "Time:"
+msgstr "時間"
+
+msgid "Lookup"
+msgstr "查詢"
+
+msgid "Currently:"
+msgstr "目前:"
+
+msgid "Change:"
+msgstr "變動:"
diff --git a/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..53320f9
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..72d88ae
--- /dev/null
+++ b/tbc/static/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po
@@ -0,0 +1,153 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# ilay <ilay@ilay.tw>, 2012
+# mail6543210 <mail6543210@yahoo.com.tw>, 2013
+# tcc <tcchou@tcchou.org>, 2011
+# Yeh-Yung <yyc1217@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 11:07+0100\n"
+"PO-Revision-Date: 2014-10-05 20:11+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/django/"
+"language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "可用 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"可用的 %s 列表。你可以在下方的方框內選擇後,點擊兩個方框中的\"選取\"箭頭以選"
+"取。"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "輸入到這個方框以過濾可用的 %s 列表。"
+
+msgid "Filter"
+msgstr "過濾器"
+
+msgid "Choose all"
+msgstr "全選"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "點擊以一次選取所有的 %s"
+
+msgid "Choose"
+msgstr "選取"
+
+msgid "Remove"
+msgstr "移除"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s 被選"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"選取的 %s 列表。你可以在下方的方框內選擇後,點擊兩個方框中的\"移除\"箭頭以移"
+"除。"
+
+msgid "Remove all"
+msgstr "全部移除"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "點擊以一次移除所有選取的 %s"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s 中 %(sel)s 個被選"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr "你尚未儲存一個可編輯欄位的變更。如果你執行動作, 未儲存的變更將會遺失。"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"你已選了一個動作, 但有一個可編輯欄位的變更尚未儲存。請點選 OK 進行儲存。你需"
+"要重新執行該動作。"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"你已選了一個動作, 但沒有任何改變。你可能動到 '去' 按鈕, 而不是 '儲存' 按鈕。"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "現在"
+
+msgid "Clock"
+msgstr "時鐘"
+
+msgid "Choose a time"
+msgstr "選擇一個時間"
+
+msgid "Midnight"
+msgstr "午夜"
+
+msgid "6 a.m."
+msgstr "上午 6 點"
+
+msgid "Noon"
+msgstr "中午"
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Calendar"
+msgstr "日曆"
+
+msgid "Yesterday"
+msgstr "昨天"
+
+msgid "Tomorrow"
+msgstr "明天"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月"
+
+msgid "S M T W T F S"
+msgstr "日 一 二 三 四 五 六"
+
+msgid "Show"
+msgstr "顯示"
+
+msgid "Hide"
+msgstr "隱藏"
diff --git a/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.mo b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d7dbf9c
--- /dev/null
+++ b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.po b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.po
new file mode 100644
index 0000000..da28eb6
--- /dev/null
+++ b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/django.po
@@ -0,0 +1,649 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Chun-Chia Chen <ccc.larc@gmail.com>, 2015
+# ilay <ilay@ilay.tw>, 2012
+# Jannis Leidel <jannis@leidel.info>, 2011
+# mail6543210 <mail6543210@yahoo.com.tw>, 2013-2014
+# ming hsien tzang <tzangms@gmail.com>, 2011
+# tcc <tcchou@tcchou.org>, 2011
+# Yeh-Yung <yyc1217@gmail.com>, 2013
+# Yeh-Yung <yyc1217@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-15 11:06+0100\n"
+"PO-Revision-Date: 2015-11-16 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/"
+"language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, python-format
+msgid "Successfully deleted %(count)d %(items)s."
+msgstr "成功的刪除了 %(count)d 個 %(items)s."
+
+#, python-format
+msgid "Cannot delete %(name)s"
+msgstr "無法刪除 %(name)s"
+
+msgid "Are you sure?"
+msgstr "你確定嗎?"
+
+#, python-format
+msgid "Delete selected %(verbose_name_plural)s"
+msgstr "刪除所選的 %(verbose_name_plural)s"
+
+msgid "Administration"
+msgstr ""
+
+msgid "All"
+msgstr "全部"
+
+msgid "Yes"
+msgstr "是"
+
+msgid "No"
+msgstr "否"
+
+msgid "Unknown"
+msgstr "未知"
+
+msgid "Any date"
+msgstr "任何日期"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Past 7 days"
+msgstr "過去 7 天"
+
+msgid "This month"
+msgstr "本月"
+
+msgid "This year"
+msgstr "今年"
+
+#, python-format
+msgid ""
+"Please enter the correct %(username)s and password for a staff account. Note "
+"that both fields may be case-sensitive."
+msgstr "請輸入正確的工作人員%(username)s及密碼。請注意兩者皆區分大小寫。"
+
+msgid "Action:"
+msgstr "動作:"
+
+msgid "action time"
+msgstr "動作時間"
+
+msgid "user"
+msgstr ""
+
+msgid "content type"
+msgstr ""
+
+msgid "object id"
+msgstr "物件 id"
+
+msgid "object repr"
+msgstr "物件 repr"
+
+msgid "action flag"
+msgstr "動作旗標"
+
+msgid "change message"
+msgstr "變更訊息"
+
+msgid "log entry"
+msgstr "紀錄項目"
+
+msgid "log entries"
+msgstr "紀錄項目"
+
+#, python-format
+msgid "Added \"%(object)s\"."
+msgstr "\"%(object)s\" 已新增。"
+
+#, python-format
+msgid "Changed \"%(object)s\" - %(changes)s"
+msgstr "\"%(object)s\" - %(changes)s 已變更。"
+
+#, python-format
+msgid "Deleted \"%(object)s.\""
+msgstr "\"%(object)s\" 已刪除。"
+
+msgid "LogEntry Object"
+msgstr "紀錄項目"
+
+msgid "None"
+msgstr "None"
+
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按住 \"Control\" 或 \"Command\" (Mac),可選取多個值"
+
+msgid "Added."
+msgstr ""
+
+#, python-format
+msgid "Changed %s."
+msgstr "%s 已變更。"
+
+msgid "and"
+msgstr "和"
+
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 已新增。"
+
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 的 %(list)s 已變更。"
+
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" 已刪除。"
+
+msgid "No fields changed."
+msgstr "沒有欄位被變更。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 新增成功。你可以在下面再次編輯它。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" 新增成功。你可以在下方加入其他 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功新增。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again "
+"below."
+msgstr "%(name)s \"%(obj)s\" 變更成功。你可以在下方再次編輯。"
+
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was changed successfully. You may add another "
+"%(name)s below."
+msgstr "%(name)s \"%(obj)s\" 變更成功。你可以在下方加入其他 %(name)s 。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功變更。"
+
+msgid ""
+"Items must be selected in order to perform actions on them. No items have "
+"been changed."
+msgstr "必須要有項目被選到才能對它們進行動作。沒有項目變更。"
+
+msgid "No action selected."
+msgstr "沒有動作被選。"
+
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功刪除。"
+
+#, python-format
+msgid "%(name)s object with primary key %(key)r does not exist."
+msgstr "主鍵 %(key)r 的 %(name)s 物件不存在。"
+
+#, python-format
+msgid "Add %s"
+msgstr "新增 %s"
+
+#, python-format
+msgid "Change %s"
+msgstr "變更 %s"
+
+msgid "Database error"
+msgstr "資料庫錯誤"
+
+#, python-format
+msgid "%(count)s %(name)s was changed successfully."
+msgid_plural "%(count)s %(name)s were changed successfully."
+msgstr[0] "共 %(count)s %(name)s 已變更成功。"
+
+#, python-format
+msgid "%(total_count)s selected"
+msgid_plural "All %(total_count)s selected"
+msgstr[0] "全部 %(total_count)s 個被選"
+
+#, python-format
+msgid "0 of %(cnt)s selected"
+msgstr "%(cnt)s 中 0 個被選"
+
+#, python-format
+msgid "Change history: %s"
+msgstr "變更歷史: %s"
+
+#. Translators: Model verbose name and instance representation,
+#. suitable to be an item in a list.
+#, python-format
+msgid "%(class_name)s %(instance)s"
+msgstr "%(class_name)s %(instance)s"
+
+#, python-format
+msgid ""
+"Deleting %(class_name)s %(instance)s would require deleting the following "
+"protected related objects: %(related_objects)s"
+msgstr ""
+"刪除 %(class_name)s %(instance)s 將會同時刪除下面受保護的相關物件:"
+"%(related_objects)s"
+
+msgid "Django site admin"
+msgstr "Django 網站管理"
+
+msgid "Django administration"
+msgstr "Django 管理"
+
+msgid "Site administration"
+msgstr "網站管理"
+
+msgid "Log in"
+msgstr "登入"
+
+#, python-format
+msgid "%(app)s administration"
+msgstr ""
+
+msgid "Page not found"
+msgstr "頁面沒有找到"
+
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很抱歉,請求頁面無法找到。"
+
+msgid "Home"
+msgstr "首頁"
+
+msgid "Server error"
+msgstr "伺服器錯誤"
+
+msgid "Server error (500)"
+msgstr "伺服器錯誤 (500)"
+
+msgid "Server Error <em>(500)</em>"
+msgstr "伺服器錯誤 <em>(500)</em>"
+
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"email and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝你"
+"的關心。"
+
+msgid "Run the selected action"
+msgstr "執行選擇的動作"
+
+msgid "Go"
+msgstr "去"
+
+msgid "Click here to select the objects across all pages"
+msgstr "點選這裡可選取全部頁面的物件"
+
+#, python-format
+msgid "Select all %(total_count)s %(module_name)s"
+msgstr "選擇全部 %(total_count)s %(module_name)s"
+
+msgid "Clear selection"
+msgstr "清除選擇"
+
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "首先,輸入一個使用者名稱和密碼。然後你可以編輯更多使用者選項。"
+
+msgid "Enter a username and password."
+msgstr "輸入一個使用者名稱和密碼。"
+
+msgid "Change password"
+msgstr "變更密碼"
+
+msgid "Please correct the error below."
+msgstr "請更正下面的錯誤。"
+
+msgid "Please correct the errors below."
+msgstr "請修正以下錯誤"
+
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "為使用者<strong>%(username)s</strong>輸入一個新的密碼。"
+
+msgid "Welcome,"
+msgstr "歡迎,"
+
+msgid "View site"
+msgstr ""
+
+msgid "Documentation"
+msgstr "文件"
+
+msgid "Log out"
+msgstr "登出"
+
+msgid "Add"
+msgstr "新增"
+
+msgid "History"
+msgstr "歷史"
+
+msgid "View on site"
+msgstr "在網站上檢視"
+
+#, python-format
+msgid "Add %(name)s"
+msgstr "新增 %(name)s"
+
+msgid "Filter"
+msgstr "過濾器"
+
+msgid "Remove from sorting"
+msgstr "從排序中移除"
+
+#, python-format
+msgid "Sorting priority: %(priority_number)s"
+msgstr "優先排序:%(priority_number)s"
+
+msgid "Toggle sorting"
+msgstr "切換排序"
+
+msgid "Delete"
+msgstr "刪除"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號"
+"並沒有刪除以下型態物件的權限:"
+
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
+"following protected related objects:"
+msgstr ""
+"要刪除 %(object_name)s '%(escaped_object)s', 將要求刪除下面受保護的相關物件:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會"
+"被刪除:"
+
+msgid "Objects"
+msgstr "物件"
+
+msgid "Yes, I'm sure"
+msgstr "是的,我確定"
+
+msgid "No, take me back"
+msgstr "不,請帶我回去"
+
+msgid "Delete multiple objects"
+msgstr "刪除多個物件"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"要刪除所選的 %(objects_name)s, 結果會刪除相關物件, 但你的帳號無權刪除下面物件"
+"型態:"
+
+#, python-format
+msgid ""
+"Deleting the selected %(objects_name)s would require deleting the following "
+"protected related objects:"
+msgstr "要刪除所選的 %(objects_name)s, 將要求刪除下面受保護的相關物件:"
+
+#, python-format
+msgid ""
+"Are you sure you want to delete the selected %(objects_name)s? All of the "
+"following objects and their related items will be deleted:"
+msgstr ""
+"你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:"
+
+msgid "Change"
+msgstr "變更"
+
+msgid "Remove"
+msgstr "移除"
+
+#, python-format
+msgid "Add another %(verbose_name)s"
+msgstr "新增其它 %(verbose_name)s"
+
+msgid "Delete?"
+msgstr "刪除?"
+
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 以 %(filter_title)s"
+
+msgid "Summary"
+msgstr "總結"
+
+#, python-format
+msgid "Models in the %(name)s application"
+msgstr "%(name)s 應用程式中的Model"
+
+msgid "You don't have permission to edit anything."
+msgstr "你沒有編輯任何東西的權限。"
+
+msgid "Recent Actions"
+msgstr "最近的動作"
+
+msgid "My Actions"
+msgstr "我的動作"
+
+msgid "None available"
+msgstr "無可用的"
+
+msgid "Unknown content"
+msgstr "未知內容"
+
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀"
+"取。"
+
+#, python-format
+msgid ""
+"You are authenticated as %(username)s, but are not authorized to access this "
+"page. Would you like to login to a different account?"
+msgstr ""
+
+msgid "Forgotten your password or username?"
+msgstr "忘了你的密碼或是使用者名稱?"
+
+msgid "Date/time"
+msgstr "日期/時間"
+
+msgid "User"
+msgstr "使用者"
+
+msgid "Action"
+msgstr "動作"
+
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。"
+
+msgid "Show all"
+msgstr "顯示全部"
+
+msgid "Save"
+msgstr "儲存"
+
+msgid "Popup closing..."
+msgstr ""
+
+#, python-format
+msgid "Change selected %(model)s"
+msgstr "變更所選的 %(model)s"
+
+#, python-format
+msgid "Add another %(model)s"
+msgstr "新增其它 %(model)s"
+
+#, python-format
+msgid "Delete selected %(model)s"
+msgstr "刪除所選的 %(model)s"
+
+msgid "Search"
+msgstr "搜尋"
+
+#, python-format
+msgid "%(counter)s result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s 結果"
+
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "總共 %(full_result_count)s"
+
+msgid "Save as new"
+msgstr "儲存為新的"
+
+msgid "Save and add another"
+msgstr "儲存並新增另一個"
+
+msgid "Save and continue editing"
+msgstr "儲存並繼續編輯"
+
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感謝你今天花了重要的時間停留在本網站。"
+
+msgid "Log in again"
+msgstr "重新登入"
+
+msgid "Password change"
+msgstr "密碼變更"
+
+msgid "Your password was changed."
+msgstr "你的密碼已變更。"
+
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"為了安全上的考量,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸"
+"入。"
+
+msgid "Change my password"
+msgstr "變更我的密碼"
+
+msgid "Password reset"
+msgstr "密碼重設"
+
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "你的密碼已設置,現在可以繼續登入。"
+
+msgid "Password reset confirmation"
+msgstr "密碼重設確認"
+
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "請輸入你的新密碼兩次, 這樣我們才能檢查你的輸入是否正確。"
+
+msgid "New password:"
+msgstr "新密碼:"
+
+msgid "Confirm password:"
+msgstr "確認密碼:"
+
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used. Please request a new password reset."
+msgstr "密碼重設連結無效,可能因為他已使用。請重新請求密碼重設。"
+
+msgid ""
+"We've emailed you instructions for setting your password, if an account "
+"exists with the email you entered. You should receive them shortly."
+msgstr ""
+
+msgid ""
+"If you don't receive an email, please make sure you've entered the address "
+"you registered with, and check your spam folder."
+msgstr ""
+"如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查"
+"您的垃圾郵件匣。"
+
+#, python-format
+msgid ""
+"You're receiving this email because you requested a password reset for your "
+"user account at %(site_name)s."
+msgstr "這封電子郵件來自 %(site_name)s,因為你要求為帳號重新設定密碼。"
+
+msgid "Please go to the following page and choose a new password:"
+msgstr "請到該頁面選擇一個新的密碼:"
+
+msgid "Your username, in case you've forgotten:"
+msgstr "你的使用者名稱,萬一你已經忘記的話:"
+
+msgid "Thanks for using our site!"
+msgstr "感謝使用本網站!"
+
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 團隊"
+
+msgid ""
+"Forgotten your password? Enter your email address below, and we'll email "
+"instructions for setting a new one."
+msgstr ""
+"忘記你的密碼? 請在下面輸入你的電子郵件位址, 然後我們會寄出設定新密碼的操作指"
+"示。"
+
+msgid "Email address:"
+msgstr "電子信箱:"
+
+msgid "Reset my password"
+msgstr "重設我的密碼"
+
+msgid "All dates"
+msgstr "所有日期"
+
+#, python-format
+msgid "Select %s"
+msgstr "選擇 %s"
+
+#, python-format
+msgid "Select %s to change"
+msgstr "選擇 %s 來變更"
+
+msgid "Date:"
+msgstr "日期"
+
+msgid "Time:"
+msgstr "時間"
+
+msgid "Lookup"
+msgstr "查詢"
+
+msgid "Currently:"
+msgstr "目前:"
+
+msgid "Change:"
+msgstr "變動:"
diff --git a/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.mo b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..93cef55
--- /dev/null
+++ b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.po b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f6a8ba1
--- /dev/null
+++ b/tbc/static/admin/locale/zh_TW/LC_MESSAGES/djangojs.po
@@ -0,0 +1,156 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# ilay <ilay@ilay.tw>, 2012
+# mail6543210 <mail6543210@yahoo.com.tw>, 2013
+# tcc <tcchou@tcchou.org>, 2011
+# Yeh-Yung <yyc1217@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-09 17:42+0200\n"
+"PO-Revision-Date: 2015-10-10 08:16+0000\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/"
+"language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, javascript-format
+msgid "Available %s"
+msgstr "可用 %s"
+
+#, javascript-format
+msgid ""
+"This is the list of available %s. You may choose some by selecting them in "
+"the box below and then clicking the \"Choose\" arrow between the two boxes."
+msgstr ""
+"可用的 %s 列表。你可以在下方的方框內選擇後,點擊兩個方框中的\"選取\"箭頭以選"
+"取。"
+
+#, javascript-format
+msgid "Type into this box to filter down the list of available %s."
+msgstr "輸入到這個方框以過濾可用的 %s 列表。"
+
+msgid "Filter"
+msgstr "過濾器"
+
+msgid "Choose all"
+msgstr "全選"
+
+#, javascript-format
+msgid "Click to choose all %s at once."
+msgstr "點擊以一次選取所有的 %s"
+
+msgid "Choose"
+msgstr "選取"
+
+msgid "Remove"
+msgstr "移除"
+
+#, javascript-format
+msgid "Chosen %s"
+msgstr "%s 被選"
+
+#, javascript-format
+msgid ""
+"This is the list of chosen %s. You may remove some by selecting them in the "
+"box below and then clicking the \"Remove\" arrow between the two boxes."
+msgstr ""
+"選取的 %s 列表。你可以在下方的方框內選擇後,點擊兩個方框中的\"移除\"箭頭以移"
+"除。"
+
+msgid "Remove all"
+msgstr "全部移除"
+
+#, javascript-format
+msgid "Click to remove all chosen %s at once."
+msgstr "點擊以一次移除所有選取的 %s"
+
+msgid "%(sel)s of %(cnt)s selected"
+msgid_plural "%(sel)s of %(cnt)s selected"
+msgstr[0] "%(cnt)s 中 %(sel)s 個被選"
+
+msgid ""
+"You have unsaved changes on individual editable fields. If you run an "
+"action, your unsaved changes will be lost."
+msgstr "你尚未儲存一個可編輯欄位的變更。如果你執行動作, 未儲存的變更將會遺失。"
+
+msgid ""
+"You have selected an action, but you haven't saved your changes to "
+"individual fields yet. Please click OK to save. You'll need to re-run the "
+"action."
+msgstr ""
+"你已選了一個動作, 但有一個可編輯欄位的變更尚未儲存。請點選 OK 進行儲存。你需"
+"要重新執行該動作。"
+
+msgid ""
+"You have selected an action, and you haven't made any changes on individual "
+"fields. You're probably looking for the Go button rather than the Save "
+"button."
+msgstr ""
+"你已選了一個動作, 但沒有任何改變。你可能動到 '去' 按鈕, 而不是 '儲存' 按鈕。"
+
+#, javascript-format
+msgid "Note: You are %s hour ahead of server time."
+msgid_plural "Note: You are %s hours ahead of server time."
+msgstr[0] ""
+
+#, javascript-format
+msgid "Note: You are %s hour behind server time."
+msgid_plural "Note: You are %s hours behind server time."
+msgstr[0] ""
+
+msgid "Now"
+msgstr "現在"
+
+msgid "Choose a Time"
+msgstr ""
+
+msgid "Choose a time"
+msgstr "選擇一個時間"
+
+msgid "Midnight"
+msgstr "午夜"
+
+msgid "6 a.m."
+msgstr "上午 6 點"
+
+msgid "Noon"
+msgstr "中午"
+
+msgid "6 p.m."
+msgstr ""
+
+msgid "Cancel"
+msgstr "取消"
+
+msgid "Today"
+msgstr "今天"
+
+msgid "Choose a Date"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "昨天"
+
+msgid "Tomorrow"
+msgstr "明天"
+
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月"
+
+msgid "S M T W T F S"
+msgstr "日 一 二 三 四 五 六"
+
+msgid "Show"
+msgstr "顯示"
+
+msgid "Hide"
+msgstr "隱藏"
diff --git a/tbc/static/admin/migrations/0001_initial.py b/tbc/static/admin/migrations/0001_initial.py
new file mode 100644
index 0000000..c615bd7
--- /dev/null
+++ b/tbc/static/admin/migrations/0001_initial.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import django.contrib.admin.models
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('contenttypes', '__first__'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='LogEntry',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('action_time', models.DateTimeField(auto_now=True, verbose_name='action time')),
+ ('object_id', models.TextField(null=True, verbose_name='object id', blank=True)),
+ ('object_repr', models.CharField(max_length=200, verbose_name='object repr')),
+ ('action_flag', models.PositiveSmallIntegerField(verbose_name='action flag')),
+ ('change_message', models.TextField(verbose_name='change message', blank=True)),
+ ('content_type', models.ForeignKey(
+ to_field='id',
+ on_delete=models.SET_NULL,
+ blank=True, null=True,
+ to='contenttypes.ContentType',
+ verbose_name='content type',
+ )),
+ ('user', models.ForeignKey(
+ to=settings.AUTH_USER_MODEL,
+ on_delete=models.CASCADE,
+ verbose_name='user',
+ )),
+ ],
+ options={
+ 'ordering': ('-action_time',),
+ 'db_table': 'django_admin_log',
+ 'verbose_name': 'log entry',
+ 'verbose_name_plural': 'log entries',
+ },
+ bases=(models.Model,),
+ managers=[
+ ('objects', django.contrib.admin.models.LogEntryManager()),
+ ],
+ ),
+ ]
diff --git a/tbc/static/admin/migrations/0002_logentry_remove_auto_add.py b/tbc/static/admin/migrations/0002_logentry_remove_auto_add.py
new file mode 100644
index 0000000..fb66c31
--- /dev/null
+++ b/tbc/static/admin/migrations/0002_logentry_remove_auto_add.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+from django.utils import timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('admin', '0001_initial'),
+ ]
+
+ # No database changes; removes auto_add and adds default/editable.
+ operations = [
+ migrations.AlterField(
+ model_name='logentry',
+ name='action_time',
+ field=models.DateTimeField(
+ verbose_name='action time',
+ default=timezone.now,
+ editable=False,
+ ),
+ ),
+ ]
diff --git a/tbc/static/admin/migrations/__init__.py b/tbc/static/admin/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tbc/static/admin/migrations/__init__.py
diff --git a/tbc/static/admin/models.py b/tbc/static/admin/models.py
new file mode 100644
index 0000000..6b6b1f4
--- /dev/null
+++ b/tbc/static/admin/models.py
@@ -0,0 +1,101 @@
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.contrib.admin.utils import quote
+from django.contrib.contenttypes.models import ContentType
+from django.core.urlresolvers import NoReverseMatch, reverse
+from django.db import models
+from django.utils import timezone
+from django.utils.encoding import python_2_unicode_compatible, smart_text
+from django.utils.translation import ugettext, ugettext_lazy as _
+
+ADDITION = 1
+CHANGE = 2
+DELETION = 3
+
+
+class LogEntryManager(models.Manager):
+ use_in_migrations = True
+
+ def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
+ self.model.objects.create(
+ user_id=user_id,
+ content_type_id=content_type_id,
+ object_id=smart_text(object_id),
+ object_repr=object_repr[:200],
+ action_flag=action_flag,
+ change_message=change_message,
+ )
+
+
+@python_2_unicode_compatible
+class LogEntry(models.Model):
+ action_time = models.DateTimeField(
+ _('action time'),
+ default=timezone.now,
+ editable=False,
+ )
+ user = models.ForeignKey(
+ settings.AUTH_USER_MODEL,
+ models.CASCADE,
+ verbose_name=_('user'),
+ )
+ content_type = models.ForeignKey(
+ ContentType,
+ models.SET_NULL,
+ verbose_name=_('content type'),
+ blank=True, null=True,
+ )
+ object_id = models.TextField(_('object id'), blank=True, null=True)
+ object_repr = models.CharField(_('object repr'), max_length=200)
+ action_flag = models.PositiveSmallIntegerField(_('action flag'))
+ change_message = models.TextField(_('change message'), blank=True)
+
+ objects = LogEntryManager()
+
+ class Meta:
+ verbose_name = _('log entry')
+ verbose_name_plural = _('log entries')
+ db_table = 'django_admin_log'
+ ordering = ('-action_time',)
+
+ def __repr__(self):
+ return smart_text(self.action_time)
+
+ def __str__(self):
+ if self.is_addition():
+ return ugettext('Added "%(object)s".') % {'object': self.object_repr}
+ elif self.is_change():
+ return ugettext('Changed "%(object)s" - %(changes)s') % {
+ 'object': self.object_repr,
+ 'changes': self.change_message,
+ }
+ elif self.is_deletion():
+ return ugettext('Deleted "%(object)s."') % {'object': self.object_repr}
+
+ return ugettext('LogEntry Object')
+
+ def is_addition(self):
+ return self.action_flag == ADDITION
+
+ def is_change(self):
+ return self.action_flag == CHANGE
+
+ def is_deletion(self):
+ return self.action_flag == DELETION
+
+ def get_edited_object(self):
+ "Returns the edited object represented by this log entry"
+ return self.content_type.get_object_for_this_type(pk=self.object_id)
+
+ def get_admin_url(self):
+ """
+ Returns the admin URL to edit the object represented by this log entry.
+ """
+ if self.content_type and self.object_id:
+ url_name = 'admin:%s_%s_change' % (self.content_type.app_label, self.content_type.model)
+ try:
+ return reverse(url_name, args=(quote(self.object_id),))
+ except NoReverseMatch:
+ pass
+ return None
diff --git a/tbc/static/admin/options.py b/tbc/static/admin/options.py
new file mode 100644
index 0000000..c7ac2ff
--- /dev/null
+++ b/tbc/static/admin/options.py
@@ -0,0 +1,1916 @@
+import copy
+import operator
+from collections import OrderedDict
+from functools import partial, reduce, update_wrapper
+
+from django import forms
+from django.conf import settings
+from django.contrib import messages
+from django.contrib.admin import helpers, widgets
+from django.contrib.admin.checks import (
+ BaseModelAdminChecks, InlineModelAdminChecks, ModelAdminChecks,
+)
+from django.contrib.admin.exceptions import DisallowedModelAdminToField
+from django.contrib.admin.templatetags.admin_static import static
+from django.contrib.admin.templatetags.admin_urls import add_preserved_filters
+from django.contrib.admin.utils import (
+ NestedObjects, flatten_fieldsets, get_deleted_objects,
+ lookup_needs_distinct, model_format_dict, quote, unquote,
+)
+from django.contrib.auth import get_permission_codename
+from django.core.exceptions import (
+ FieldDoesNotExist, FieldError, PermissionDenied, ValidationError,
+)
+from django.core.paginator import Paginator
+from django.core.urlresolvers import reverse
+from django.db import models, router, transaction
+from django.db.models.constants import LOOKUP_SEP
+from django.db.models.fields import BLANK_CHOICE_DASH
+from django.forms.formsets import DELETION_FIELD_NAME, all_valid
+from django.forms.models import (
+ BaseInlineFormSet, inlineformset_factory, modelform_defines_fields,
+ modelform_factory, modelformset_factory,
+)
+from django.forms.widgets import CheckboxSelectMultiple, SelectMultiple
+from django.http import Http404, HttpResponseRedirect
+from django.http.response import HttpResponseBase
+from django.template.response import SimpleTemplateResponse, TemplateResponse
+from django.utils import six
+from django.utils.decorators import method_decorator
+from django.utils.encoding import force_text, python_2_unicode_compatible
+from django.utils.html import escape, escapejs
+from django.utils.http import urlencode
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst, get_text_list
+from django.utils.translation import string_concat, ugettext as _, ungettext
+from django.views.decorators.csrf import csrf_protect
+from django.views.generic import RedirectView
+
+IS_POPUP_VAR = '_popup'
+TO_FIELD_VAR = '_to_field'
+
+
+HORIZONTAL, VERTICAL = 1, 2
+
+
+def get_content_type_for_model(obj):
+ # Since this module gets imported in the application's root package,
+ # it cannot import models from other applications at the module level.
+ from django.contrib.contenttypes.models import ContentType
+ return ContentType.objects.get_for_model(obj, for_concrete_model=False)
+
+
+def get_ul_class(radio_style):
+ return 'radiolist' if radio_style == VERTICAL else 'radiolist inline'
+
+
+class IncorrectLookupParameters(Exception):
+ pass
+
+# Defaults for formfield_overrides. ModelAdmin subclasses can change this
+# by adding to ModelAdmin.formfield_overrides.
+
+FORMFIELD_FOR_DBFIELD_DEFAULTS = {
+ models.DateTimeField: {
+ 'form_class': forms.SplitDateTimeField,
+ 'widget': widgets.AdminSplitDateTime
+ },
+ models.DateField: {'widget': widgets.AdminDateWidget},
+ models.TimeField: {'widget': widgets.AdminTimeWidget},
+ models.TextField: {'widget': widgets.AdminTextareaWidget},
+ models.URLField: {'widget': widgets.AdminURLFieldWidget},
+ models.IntegerField: {'widget': widgets.AdminIntegerFieldWidget},
+ models.BigIntegerField: {'widget': widgets.AdminBigIntegerFieldWidget},
+ models.CharField: {'widget': widgets.AdminTextInputWidget},
+ models.ImageField: {'widget': widgets.AdminFileWidget},
+ models.FileField: {'widget': widgets.AdminFileWidget},
+ models.EmailField: {'widget': widgets.AdminEmailInputWidget},
+}
+
+csrf_protect_m = method_decorator(csrf_protect)
+
+
+class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
+ """Functionality common to both ModelAdmin and InlineAdmin."""
+
+ raw_id_fields = ()
+ fields = None
+ exclude = None
+ fieldsets = None
+ form = forms.ModelForm
+ filter_vertical = ()
+ filter_horizontal = ()
+ radio_fields = {}
+ prepopulated_fields = {}
+ formfield_overrides = {}
+ readonly_fields = ()
+ ordering = None
+ view_on_site = True
+ show_full_result_count = True
+ checks_class = BaseModelAdminChecks
+
+ def check(self, **kwargs):
+ return self.checks_class().check(self, **kwargs)
+
+ def __init__(self):
+ overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
+ overrides.update(self.formfield_overrides)
+ self.formfield_overrides = overrides
+
+ def formfield_for_dbfield(self, db_field, **kwargs):
+ """
+ Hook for specifying the form Field instance for a given database Field
+ instance.
+
+ If kwargs are given, they're passed to the form Field's constructor.
+ """
+ request = kwargs.pop("request", None)
+
+ # If the field specifies choices, we don't need to look for special
+ # admin widgets - we just need to use a select widget of some kind.
+ if db_field.choices:
+ return self.formfield_for_choice_field(db_field, request, **kwargs)
+
+ # ForeignKey or ManyToManyFields
+ if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)):
+ # Combine the field kwargs with any options for formfield_overrides.
+ # Make sure the passed in **kwargs override anything in
+ # formfield_overrides because **kwargs is more specific, and should
+ # always win.
+ if db_field.__class__ in self.formfield_overrides:
+ kwargs = dict(self.formfield_overrides[db_field.__class__], **kwargs)
+
+ # Get the correct formfield.
+ if isinstance(db_field, models.ForeignKey):
+ formfield = self.formfield_for_foreignkey(db_field, request, **kwargs)
+ elif isinstance(db_field, models.ManyToManyField):
+ formfield = self.formfield_for_manytomany(db_field, request, **kwargs)
+
+ # For non-raw_id fields, wrap the widget with a wrapper that adds
+ # extra HTML -- the "add other" interface -- to the end of the
+ # rendered output. formfield can be None if it came from a
+ # OneToOneField with parent_link=True or a M2M intermediary.
+ if formfield and db_field.name not in self.raw_id_fields:
+ related_modeladmin = self.admin_site._registry.get(db_field.remote_field.model)
+ wrapper_kwargs = {}
+ if related_modeladmin:
+ wrapper_kwargs.update(
+ can_add_related=related_modeladmin.has_add_permission(request),
+ can_change_related=related_modeladmin.has_change_permission(request),
+ can_delete_related=related_modeladmin.has_delete_permission(request),
+ )
+ formfield.widget = widgets.RelatedFieldWidgetWrapper(
+ formfield.widget, db_field.remote_field, self.admin_site, **wrapper_kwargs
+ )
+
+ return formfield
+
+ # If we've got overrides for the formfield defined, use 'em. **kwargs
+ # passed to formfield_for_dbfield override the defaults.
+ for klass in db_field.__class__.mro():
+ if klass in self.formfield_overrides:
+ kwargs = dict(copy.deepcopy(self.formfield_overrides[klass]), **kwargs)
+ return db_field.formfield(**kwargs)
+
+ # For any other type of field, just call its formfield() method.
+ return db_field.formfield(**kwargs)
+
+ def formfield_for_choice_field(self, db_field, request=None, **kwargs):
+ """
+ Get a form Field for a database Field that has declared choices.
+ """
+ # If the field is named as a radio_field, use a RadioSelect
+ if db_field.name in self.radio_fields:
+ # Avoid stomping on custom widget/choices arguments.
+ if 'widget' not in kwargs:
+ kwargs['widget'] = widgets.AdminRadioSelect(attrs={
+ 'class': get_ul_class(self.radio_fields[db_field.name]),
+ })
+ if 'choices' not in kwargs:
+ kwargs['choices'] = db_field.get_choices(
+ include_blank=db_field.blank,
+ blank_choice=[('', _('None'))]
+ )
+ return db_field.formfield(**kwargs)
+
+ def get_field_queryset(self, db, db_field, request):
+ """
+ If the ModelAdmin specifies ordering, the queryset should respect that
+ ordering. Otherwise don't specify the queryset, let the field decide
+ (returns None in that case).
+ """
+ related_admin = self.admin_site._registry.get(db_field.remote_field.model)
+ if related_admin is not None:
+ ordering = related_admin.get_ordering(request)
+ if ordering is not None and ordering != ():
+ return db_field.remote_field.model._default_manager.using(db).order_by(*ordering)
+ return None
+
+ def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
+ """
+ Get a form Field for a ForeignKey.
+ """
+ db = kwargs.get('using')
+ if db_field.name in self.raw_id_fields:
+ kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.remote_field,
+ self.admin_site, using=db)
+ elif db_field.name in self.radio_fields:
+ kwargs['widget'] = widgets.AdminRadioSelect(attrs={
+ 'class': get_ul_class(self.radio_fields[db_field.name]),
+ })
+ kwargs['empty_label'] = _('None') if db_field.blank else None
+
+ if 'queryset' not in kwargs:
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
+
+ return db_field.formfield(**kwargs)
+
+ def formfield_for_manytomany(self, db_field, request=None, **kwargs):
+ """
+ Get a form Field for a ManyToManyField.
+ """
+ # If it uses an intermediary model that isn't auto created, don't show
+ # a field in admin.
+ if not db_field.remote_field.through._meta.auto_created:
+ return None
+ db = kwargs.get('using')
+
+ if db_field.name in self.raw_id_fields:
+ kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.remote_field,
+ self.admin_site, using=db)
+ kwargs['help_text'] = ''
+ elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
+ kwargs['widget'] = widgets.FilteredSelectMultiple(
+ db_field.verbose_name,
+ db_field.name in self.filter_vertical
+ )
+
+ if 'queryset' not in kwargs:
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
+
+ form_field = db_field.formfield(**kwargs)
+ if isinstance(form_field.widget, SelectMultiple) and not isinstance(form_field.widget, CheckboxSelectMultiple):
+ msg = _('Hold down "Control", or "Command" on a Mac, to select more than one.')
+ help_text = form_field.help_text
+ form_field.help_text = string_concat(help_text, ' ', msg) if help_text else msg
+ return form_field
+
+ def get_view_on_site_url(self, obj=None):
+ if obj is None or not self.view_on_site:
+ return None
+
+ if callable(self.view_on_site):
+ return self.view_on_site(obj)
+ elif self.view_on_site and hasattr(obj, 'get_absolute_url'):
+ # use the ContentType lookup if view_on_site is True
+ return reverse('admin:view_on_site', kwargs={
+ 'content_type_id': get_content_type_for_model(obj).pk,
+ 'object_id': obj.pk
+ })
+
+ def get_empty_value_display(self):
+ """
+ Return the empty_value_display set on ModelAdmin or AdminSite.
+ """
+ try:
+ return mark_safe(self.empty_value_display)
+ except AttributeError:
+ return mark_safe(self.admin_site.empty_value_display)
+
+ def get_fields(self, request, obj=None):
+ """
+ Hook for specifying fields.
+ """
+ return self.fields
+
+ def get_fieldsets(self, request, obj=None):
+ """
+ Hook for specifying fieldsets.
+ """
+ if self.fieldsets:
+ return self.fieldsets
+ return [(None, {'fields': self.get_fields(request, obj)})]
+
+ def get_ordering(self, request):
+ """
+ Hook for specifying field ordering.
+ """
+ return self.ordering or () # otherwise we might try to *None, which is bad ;)
+
+ def get_readonly_fields(self, request, obj=None):
+ """
+ Hook for specifying custom readonly fields.
+ """
+ return self.readonly_fields
+
+ def get_prepopulated_fields(self, request, obj=None):
+ """
+ Hook for specifying custom prepopulated fields.
+ """
+ return self.prepopulated_fields
+
+ def get_queryset(self, request):
+ """
+ Returns a QuerySet of all model instances that can be edited by the
+ admin site. This is used by changelist_view.
+ """
+ qs = self.model._default_manager.get_queryset()
+ # TODO: this should be handled by some parameter to the ChangeList.
+ ordering = self.get_ordering(request)
+ if ordering:
+ qs = qs.order_by(*ordering)
+ return qs
+
+ def lookup_allowed(self, lookup, value):
+ from django.contrib.admin.filters import SimpleListFilter
+
+ model = self.model
+ # Check FKey lookups that are allowed, so that popups produced by
+ # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to,
+ # are allowed to work.
+ for l in model._meta.related_fkey_lookups:
+ # As ``limit_choices_to`` can be a callable, invoke it here.
+ if callable(l):
+ l = l()
+ for k, v in widgets.url_params_from_lookup_dict(l).items():
+ if k == lookup and v == value:
+ return True
+
+ relation_parts = []
+ prev_field = None
+ for part in lookup.split(LOOKUP_SEP):
+ try:
+ field = model._meta.get_field(part)
+ except FieldDoesNotExist:
+ # Lookups on non-existent fields are ok, since they're ignored
+ # later.
+ break
+ # It is allowed to filter on values that would be found from local
+ # model anyways. For example, if you filter on employee__department__id,
+ # then the id value would be found already from employee__department_id.
+ if not prev_field or (prev_field.concrete and
+ field not in prev_field.get_path_info()[-1].target_fields):
+ relation_parts.append(part)
+ if not getattr(field, 'get_path_info', None):
+ # This is not a relational field, so further parts
+ # must be transforms.
+ break
+ prev_field = field
+ model = field.get_path_info()[-1].to_opts.model
+
+ if len(relation_parts) <= 1:
+ # Either a local field filter, or no fields at all.
+ return True
+ clean_lookup = LOOKUP_SEP.join(relation_parts)
+ valid_lookups = [self.date_hierarchy]
+ for filter_item in self.list_filter:
+ if isinstance(filter_item, type) and issubclass(filter_item, SimpleListFilter):
+ valid_lookups.append(filter_item.parameter_name)
+ elif isinstance(filter_item, (list, tuple)):
+ valid_lookups.append(filter_item[0])
+ else:
+ valid_lookups.append(filter_item)
+ return clean_lookup in valid_lookups
+
+ def to_field_allowed(self, request, to_field):
+ """
+ Returns True if the model associated with this admin should be
+ allowed to be referenced by the specified field.
+ """
+ opts = self.model._meta
+
+ try:
+ field = opts.get_field(to_field)
+ except FieldDoesNotExist:
+ return False
+
+ # Always allow referencing the primary key since it's already possible
+ # to get this information from the change view URL.
+ if field.primary_key:
+ return True
+
+ # Allow reverse relationships to models defining m2m fields if they
+ # target the specified field.
+ for many_to_many in opts.many_to_many:
+ if many_to_many.m2m_target_field_name() == to_field:
+ return True
+
+ # Make sure at least one of the models registered for this site
+ # references this field through a FK or a M2M relationship.
+ registered_models = set()
+ for model, admin in self.admin_site._registry.items():
+ registered_models.add(model)
+ for inline in admin.inlines:
+ registered_models.add(inline.model)
+
+ related_objects = (
+ f for f in opts.get_fields(include_hidden=True)
+ if (f.auto_created and not f.concrete)
+ )
+ for related_object in related_objects:
+ related_model = related_object.related_model
+ remote_field = related_object.field.remote_field
+ if (any(issubclass(model, related_model) for model in registered_models) and
+ hasattr(remote_field, 'get_related_field') and
+ remote_field.get_related_field() == field):
+ return True
+
+ return False
+
+ def has_add_permission(self, request):
+ """
+ Returns True if the given request has permission to add an object.
+ Can be overridden by the user in subclasses.
+ """
+ opts = self.opts
+ codename = get_permission_codename('add', opts)
+ return request.user.has_perm("%s.%s" % (opts.app_label, codename))
+
+ def has_change_permission(self, request, obj=None):
+ """
+ Returns True if the given request has permission to change the given
+ Django model instance, the default implementation doesn't examine the
+ `obj` parameter.
+
+ Can be overridden by the user in subclasses. In such case it should
+ return True if the given request has permission to change the `obj`
+ model instance. If `obj` is None, this should return True if the given
+ request has permission to change *any* object of the given type.
+ """
+ opts = self.opts
+ codename = get_permission_codename('change', opts)
+ return request.user.has_perm("%s.%s" % (opts.app_label, codename))
+
+ def has_delete_permission(self, request, obj=None):
+ """
+ Returns True if the given request has permission to change the given
+ Django model instance, the default implementation doesn't examine the
+ `obj` parameter.
+
+ Can be overridden by the user in subclasses. In such case it should
+ return True if the given request has permission to delete the `obj`
+ model instance. If `obj` is None, this should return True if the given
+ request has permission to delete *any* object of the given type.
+ """
+ opts = self.opts
+ codename = get_permission_codename('delete', opts)
+ return request.user.has_perm("%s.%s" % (opts.app_label, codename))
+
+ def has_module_permission(self, request):
+ """
+ Returns True if the given request has any permission in the given
+ app label.
+
+ Can be overridden by the user in subclasses. In such case it should
+ return True if the given request has permission to view the module on
+ the admin index page and access the module's index page. Overriding it
+ does not restrict access to the add, change or delete views. Use
+ `ModelAdmin.has_(add|change|delete)_permission` for that.
+ """
+ return request.user.has_module_perms(self.opts.app_label)
+
+
+@python_2_unicode_compatible
+class ModelAdmin(BaseModelAdmin):
+ "Encapsulates all admin options and functionality for a given model."
+
+ list_display = ('__str__',)
+ list_display_links = ()
+ list_filter = ()
+ list_select_related = False
+ list_per_page = 100
+ list_max_show_all = 200
+ list_editable = ()
+ search_fields = ()
+ date_hierarchy = None
+ save_as = False
+ save_on_top = False
+ paginator = Paginator
+ preserve_filters = True
+ inlines = []
+
+ # Custom templates (designed to be over-ridden in subclasses)
+ add_form_template = None
+ change_form_template = None
+ change_list_template = None
+ delete_confirmation_template = None
+ delete_selected_confirmation_template = None
+ object_history_template = None
+
+ # Actions
+ actions = []
+ action_form = helpers.ActionForm
+ actions_on_top = True
+ actions_on_bottom = False
+ actions_selection_counter = True
+ checks_class = ModelAdminChecks
+
+ def __init__(self, model, admin_site):
+ self.model = model
+ self.opts = model._meta
+ self.admin_site = admin_site
+ super(ModelAdmin, self).__init__()
+
+ def __str__(self):
+ return "%s.%s" % (self.model._meta.app_label, self.__class__.__name__)
+
+ def get_inline_instances(self, request, obj=None):
+ inline_instances = []
+ for inline_class in self.inlines:
+ inline = inline_class(self.model, self.admin_site)
+ if request:
+ if not (inline.has_add_permission(request) or
+ inline.has_change_permission(request, obj) or
+ inline.has_delete_permission(request, obj)):
+ continue
+ if not inline.has_add_permission(request):
+ inline.max_num = 0
+ inline_instances.append(inline)
+
+ return inline_instances
+
+ def get_urls(self):
+ from django.conf.urls import url
+
+ def wrap(view):
+ def wrapper(*args, **kwargs):
+ return self.admin_site.admin_view(view)(*args, **kwargs)
+ wrapper.model_admin = self
+ return update_wrapper(wrapper, view)
+
+ info = self.model._meta.app_label, self.model._meta.model_name
+
+ urlpatterns = [
+ url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info),
+ url(r'^add/$', wrap(self.add_view), name='%s_%s_add' % info),
+ url(r'^(.+)/history/$', wrap(self.history_view), name='%s_%s_history' % info),
+ url(r'^(.+)/delete/$', wrap(self.delete_view), name='%s_%s_delete' % info),
+ url(r'^(.+)/change/$', wrap(self.change_view), name='%s_%s_change' % info),
+ # For backwards compatibility (was the change url before 1.9)
+ url(r'^(.+)/$', wrap(RedirectView.as_view(
+ pattern_name='%s:%s_%s_change' % ((self.admin_site.name,) + info)
+ ))),
+ ]
+ return urlpatterns
+
+ def urls(self):
+ return self.get_urls()
+ urls = property(urls)
+
+ @property
+ def media(self):
+ extra = '' if settings.DEBUG else '.min'
+ js = [
+ 'core.js',
+ 'admin/RelatedObjectLookups.js',
+ 'vendor/jquery/jquery%s.js' % extra,
+ 'jquery.init.js',
+ 'actions%s.js' % extra,
+ 'urlify.js',
+ 'prepopulate%s.js' % extra,
+ 'vendor/xregexp/xregexp.min.js',
+ ]
+ return forms.Media(js=[static('admin/js/%s' % url) for url in js])
+
+ def get_model_perms(self, request):
+ """
+ Returns a dict of all perms for this model. This dict has the keys
+ ``add``, ``change``, and ``delete`` mapping to the True/False for each
+ of those actions.
+ """
+ return {
+ 'add': self.has_add_permission(request),
+ 'change': self.has_change_permission(request),
+ 'delete': self.has_delete_permission(request),
+ }
+
+ def get_fields(self, request, obj=None):
+ if self.fields:
+ return self.fields
+ form = self.get_form(request, obj, fields=None)
+ return list(form.base_fields) + list(self.get_readonly_fields(request, obj))
+
+ def get_form(self, request, obj=None, **kwargs):
+ """
+ Returns a Form class for use in the admin add view. This is used by
+ add_view and change_view.
+ """
+ if 'fields' in kwargs:
+ fields = kwargs.pop('fields')
+ else:
+ fields = flatten_fieldsets(self.get_fieldsets(request, obj))
+ if self.exclude is None:
+ exclude = []
+ else:
+ exclude = list(self.exclude)
+ readonly_fields = self.get_readonly_fields(request, obj)
+ exclude.extend(readonly_fields)
+ if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
+ # Take the custom ModelForm's Meta.exclude into account only if the
+ # ModelAdmin doesn't define its own.
+ exclude.extend(self.form._meta.exclude)
+ # if exclude is an empty list we pass None to be consistent with the
+ # default on modelform_factory
+ exclude = exclude or None
+
+ # Remove declared form fields which are in readonly_fields.
+ new_attrs = OrderedDict(
+ (f, None) for f in readonly_fields
+ if f in self.form.declared_fields
+ )
+ form = type(self.form.__name__, (self.form,), new_attrs)
+
+ defaults = {
+ "form": form,
+ "fields": fields,
+ "exclude": exclude,
+ "formfield_callback": partial(self.formfield_for_dbfield, request=request),
+ }
+ defaults.update(kwargs)
+
+ if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
+ defaults['fields'] = forms.ALL_FIELDS
+
+ try:
+ return modelform_factory(self.model, **defaults)
+ except FieldError as e:
+ raise FieldError('%s. Check fields/fieldsets/exclude attributes of class %s.'
+ % (e, self.__class__.__name__))
+
+ def get_changelist(self, request, **kwargs):
+ """
+ Returns the ChangeList class for use on the changelist page.
+ """
+ from django.contrib.admin.views.main import ChangeList
+ return ChangeList
+
+ def get_object(self, request, object_id, from_field=None):
+ """
+ Returns an instance matching the field and value provided, the primary
+ key is used if no field is provided. Returns ``None`` if no match is
+ found or the object_id fails validation.
+ """
+ queryset = self.get_queryset(request)
+ model = queryset.model
+ field = model._meta.pk if from_field is None else model._meta.get_field(from_field)
+ try:
+ object_id = field.to_python(object_id)
+ return queryset.get(**{field.name: object_id})
+ except (model.DoesNotExist, ValidationError, ValueError):
+ return None
+
+ def get_changelist_form(self, request, **kwargs):
+ """
+ Returns a Form class for use in the Formset on the changelist page.
+ """
+ defaults = {
+ "formfield_callback": partial(self.formfield_for_dbfield, request=request),
+ }
+ defaults.update(kwargs)
+ if (defaults.get('fields') is None
+ and not modelform_defines_fields(defaults.get('form'))):
+ defaults['fields'] = forms.ALL_FIELDS
+
+ return modelform_factory(self.model, **defaults)
+
+ def get_changelist_formset(self, request, **kwargs):
+ """
+ Returns a FormSet class for use on the changelist page if list_editable
+ is used.
+ """
+ defaults = {
+ "formfield_callback": partial(self.formfield_for_dbfield, request=request),
+ }
+ defaults.update(kwargs)
+ return modelformset_factory(self.model,
+ self.get_changelist_form(request), extra=0,
+ fields=self.list_editable, **defaults)
+
+ def get_formsets_with_inlines(self, request, obj=None):
+ """
+ Yields formsets and the corresponding inlines.
+ """
+ for inline in self.get_inline_instances(request, obj):
+ yield inline.get_formset(request, obj), inline
+
+ def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True):
+ return self.paginator(queryset, per_page, orphans, allow_empty_first_page)
+
+ def log_addition(self, request, object, message):
+ """
+ Log that an object has been successfully added.
+
+ The default implementation creates an admin LogEntry object.
+ """
+ from django.contrib.admin.models import LogEntry, ADDITION
+ LogEntry.objects.log_action(
+ user_id=request.user.pk,
+ content_type_id=get_content_type_for_model(object).pk,
+ object_id=object.pk,
+ object_repr=force_text(object),
+ action_flag=ADDITION,
+ change_message=message,
+ )
+
+ def log_change(self, request, object, message):
+ """
+ Log that an object has been successfully changed.
+
+ The default implementation creates an admin LogEntry object.
+ """
+ from django.contrib.admin.models import LogEntry, CHANGE
+ LogEntry.objects.log_action(
+ user_id=request.user.pk,
+ content_type_id=get_content_type_for_model(object).pk,
+ object_id=object.pk,
+ object_repr=force_text(object),
+ action_flag=CHANGE,
+ change_message=message,
+ )
+
+ def log_deletion(self, request, object, object_repr):
+ """
+ Log that an object will be deleted. Note that this method must be
+ called before the deletion.
+
+ The default implementation creates an admin LogEntry object.
+ """
+ from django.contrib.admin.models import LogEntry, DELETION
+ LogEntry.objects.log_action(
+ user_id=request.user.pk,
+ content_type_id=get_content_type_for_model(object).pk,
+ object_id=object.pk,
+ object_repr=object_repr,
+ action_flag=DELETION,
+ )
+
+ def action_checkbox(self, obj):
+ """
+ A list_display column containing a checkbox widget.
+ """
+ return helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, force_text(obj.pk))
+ action_checkbox.short_description = mark_safe('<input type="checkbox" id="action-toggle" />')
+
+ def get_actions(self, request):
+ """
+ Return a dictionary mapping the names of all actions for this
+ ModelAdmin to a tuple of (callable, name, description) for each action.
+ """
+ # If self.actions is explicitly set to None that means that we don't
+ # want *any* actions enabled on this page.
+ if self.actions is None or IS_POPUP_VAR in request.GET:
+ return OrderedDict()
+
+ actions = []
+
+ # Gather actions from the admin site first
+ for (name, func) in self.admin_site.actions:
+ description = getattr(func, 'short_description', name.replace('_', ' '))
+ actions.append((func, name, description))
+
+ # Then gather them from the model admin and all parent classes,
+ # starting with self and working back up.
+ for klass in self.__class__.mro()[::-1]:
+ class_actions = getattr(klass, 'actions', [])
+ # Avoid trying to iterate over None
+ if not class_actions:
+ continue
+ actions.extend(self.get_action(action) for action in class_actions)
+
+ # get_action might have returned None, so filter any of those out.
+ actions = filter(None, actions)
+
+ # Convert the actions into an OrderedDict keyed by name.
+ actions = OrderedDict(
+ (name, (func, name, desc))
+ for func, name, desc in actions
+ )
+
+ return actions
+
+ def get_action_choices(self, request, default_choices=BLANK_CHOICE_DASH):
+ """
+ Return a list of choices for use in a form object. Each choice is a
+ tuple (name, description).
+ """
+ choices = [] + default_choices
+ for func, name, description in six.itervalues(self.get_actions(request)):
+ choice = (name, description % model_format_dict(self.opts))
+ choices.append(choice)
+ return choices
+
+ def get_action(self, action):
+ """
+ Return a given action from a parameter, which can either be a callable,
+ or the name of a method on the ModelAdmin. Return is a tuple of
+ (callable, name, description).
+ """
+ # If the action is a callable, just use it.
+ if callable(action):
+ func = action
+ action = action.__name__
+
+ # Next, look for a method. Grab it off self.__class__ to get an unbound
+ # method instead of a bound one; this ensures that the calling
+ # conventions are the same for functions and methods.
+ elif hasattr(self.__class__, action):
+ func = getattr(self.__class__, action)
+
+ # Finally, look for a named method on the admin site
+ else:
+ try:
+ func = self.admin_site.get_action(action)
+ except KeyError:
+ return None
+
+ if hasattr(func, 'short_description'):
+ description = func.short_description
+ else:
+ description = capfirst(action.replace('_', ' '))
+ return func, action, description
+
+ def get_list_display(self, request):
+ """
+ Return a sequence containing the fields to be displayed on the
+ changelist.
+ """
+ return self.list_display
+
+ def get_list_display_links(self, request, list_display):
+ """
+ Return a sequence containing the fields to be displayed as links
+ on the changelist. The list_display parameter is the list of fields
+ returned by get_list_display().
+ """
+ if self.list_display_links or self.list_display_links is None or not list_display:
+ return self.list_display_links
+ else:
+ # Use only the first item in list_display as link
+ return list(list_display)[:1]
+
+ def get_list_filter(self, request):
+ """
+ Returns a sequence containing the fields to be displayed as filters in
+ the right sidebar of the changelist page.
+ """
+ return self.list_filter
+
+ def get_list_select_related(self, request):
+ """
+ Returns a list of fields to add to the select_related() part of the
+ changelist items query.
+ """
+ return self.list_select_related
+
+ def get_search_fields(self, request):
+ """
+ Returns a sequence containing the fields to be searched whenever
+ somebody submits a search query.
+ """
+ return self.search_fields
+
+ def get_search_results(self, request, queryset, search_term):
+ """
+ Returns a tuple containing a queryset to implement the search,
+ and a boolean indicating if the results may contain duplicates.
+ """
+ # Apply keyword searches.
+ def construct_search(field_name):
+ if field_name.startswith('^'):
+ return "%s__istartswith" % field_name[1:]
+ elif field_name.startswith('='):
+ return "%s__iexact" % field_name[1:]
+ elif field_name.startswith('@'):
+ return "%s__search" % field_name[1:]
+ else:
+ return "%s__icontains" % field_name
+
+ use_distinct = False
+ search_fields = self.get_search_fields(request)
+ if search_fields and search_term:
+ orm_lookups = [construct_search(str(search_field))
+ for search_field in search_fields]
+ for bit in search_term.split():
+ or_queries = [models.Q(**{orm_lookup: bit})
+ for orm_lookup in orm_lookups]
+ queryset = queryset.filter(reduce(operator.or_, or_queries))
+ if not use_distinct:
+ for search_spec in orm_lookups:
+ if lookup_needs_distinct(self.opts, search_spec):
+ use_distinct = True
+ break
+
+ return queryset, use_distinct
+
+ def get_preserved_filters(self, request):
+ """
+ Returns the preserved filters querystring.
+ """
+ match = request.resolver_match
+ if self.preserve_filters and match:
+ opts = self.model._meta
+ current_url = '%s:%s' % (match.app_name, match.url_name)
+ changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name)
+ if current_url == changelist_url:
+ preserved_filters = request.GET.urlencode()
+ else:
+ preserved_filters = request.GET.get('_changelist_filters')
+
+ if preserved_filters:
+ return urlencode({'_changelist_filters': preserved_filters})
+ return ''
+
+ def construct_change_message(self, request, form, formsets, add=False):
+ """
+ Construct a change message from a changed object.
+ """
+ change_message = []
+ if add:
+ change_message.append(_('Added.'))
+ elif form.changed_data:
+ change_message.append(_('Changed %s.') % get_text_list(form.changed_data, _('and')))
+
+ if formsets:
+ for formset in formsets:
+ for added_object in formset.new_objects:
+ change_message.append(_('Added %(name)s "%(object)s".')
+ % {'name': force_text(added_object._meta.verbose_name),
+ 'object': force_text(added_object)})
+ for changed_object, changed_fields in formset.changed_objects:
+ change_message.append(_('Changed %(list)s for %(name)s "%(object)s".')
+ % {'list': get_text_list(changed_fields, _('and')),
+ 'name': force_text(changed_object._meta.verbose_name),
+ 'object': force_text(changed_object)})
+ for deleted_object in formset.deleted_objects:
+ change_message.append(_('Deleted %(name)s "%(object)s".')
+ % {'name': force_text(deleted_object._meta.verbose_name),
+ 'object': force_text(deleted_object)})
+ change_message = ' '.join(change_message)
+ return change_message or _('No fields changed.')
+
+ def message_user(self, request, message, level=messages.INFO, extra_tags='',
+ fail_silently=False):
+ """
+ Send a message to the user. The default implementation
+ posts a message using the django.contrib.messages backend.
+
+ Exposes almost the same API as messages.add_message(), but accepts the
+ positional arguments in a different order to maintain backwards
+ compatibility. For convenience, it accepts the `level` argument as
+ a string rather than the usual level number.
+ """
+
+ if not isinstance(level, int):
+ # attempt to get the level if passed a string
+ try:
+ level = getattr(messages.constants, level.upper())
+ except AttributeError:
+ levels = messages.constants.DEFAULT_TAGS.values()
+ levels_repr = ', '.join('`%s`' % l for l in levels)
+ raise ValueError('Bad message level string: `%s`. '
+ 'Possible values are: %s' % (level, levels_repr))
+
+ messages.add_message(request, level, message, extra_tags=extra_tags,
+ fail_silently=fail_silently)
+
+ def save_form(self, request, form, change):
+ """
+ Given a ModelForm return an unsaved instance. ``change`` is True if
+ the object is being changed, and False if it's being added.
+ """
+ return form.save(commit=False)
+
+ def save_model(self, request, obj, form, change):
+ """
+ Given a model instance save it to the database.
+ """
+ obj.save()
+
+ def delete_model(self, request, obj):
+ """
+ Given a model instance delete it from the database.
+ """
+ obj.delete()
+
+ def save_formset(self, request, form, formset, change):
+ """
+ Given an inline formset save it to the database.
+ """
+ formset.save()
+
+ def save_related(self, request, form, formsets, change):
+ """
+ Given the ``HttpRequest``, the parent ``ModelForm`` instance, the
+ list of inline formsets and a boolean value based on whether the
+ parent is being added or changed, save the related objects to the
+ database. Note that at this point save_form() and save_model() have
+ already been called.
+ """
+ form.save_m2m()
+ for formset in formsets:
+ self.save_formset(request, form, formset, change=change)
+
+ def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
+ opts = self.model._meta
+ app_label = opts.app_label
+ preserved_filters = self.get_preserved_filters(request)
+ form_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, form_url)
+ view_on_site_url = self.get_view_on_site_url(obj)
+ context.update({
+ 'add': add,
+ 'change': change,
+ 'has_add_permission': self.has_add_permission(request),
+ 'has_change_permission': self.has_change_permission(request, obj),
+ 'has_delete_permission': self.has_delete_permission(request, obj),
+ 'has_file_field': True, # FIXME - this should check if form or formsets have a FileField,
+ 'has_absolute_url': view_on_site_url is not None,
+ 'absolute_url': view_on_site_url,
+ 'form_url': form_url,
+ 'opts': opts,
+ 'content_type_id': get_content_type_for_model(self.model).pk,
+ 'save_as': self.save_as,
+ 'save_on_top': self.save_on_top,
+ 'to_field_var': TO_FIELD_VAR,
+ 'is_popup_var': IS_POPUP_VAR,
+ 'app_label': app_label,
+ })
+ if add and self.add_form_template is not None:
+ form_template = self.add_form_template
+ else:
+ form_template = self.change_form_template
+
+ request.current_app = self.admin_site.name
+
+ return TemplateResponse(request, form_template or [
+ "admin/%s/%s/change_form.html" % (app_label, opts.model_name),
+ "admin/%s/change_form.html" % app_label,
+ "admin/change_form.html"
+ ], context)
+
+ def response_add(self, request, obj, post_url_continue=None):
+ """
+ Determines the HttpResponse for the add_view stage.
+ """
+ opts = obj._meta
+ pk_value = obj._get_pk_val()
+ preserved_filters = self.get_preserved_filters(request)
+ msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)}
+ # Here, we distinguish between different save types by checking for
+ # the presence of keys in request.POST.
+
+ if IS_POPUP_VAR in request.POST:
+ to_field = request.POST.get(TO_FIELD_VAR)
+ if to_field:
+ attr = str(to_field)
+ else:
+ attr = obj._meta.pk.attname
+ value = obj.serializable_value(attr)
+ return SimpleTemplateResponse('admin/popup_response.html', {
+ 'value': value,
+ 'obj': obj,
+ })
+
+ elif "_continue" in request.POST:
+ msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ if post_url_continue is None:
+ post_url_continue = reverse('admin:%s_%s_change' %
+ (opts.app_label, opts.model_name),
+ args=(quote(pk_value),),
+ current_app=self.admin_site.name)
+ post_url_continue = add_preserved_filters(
+ {'preserved_filters': preserved_filters, 'opts': opts},
+ post_url_continue
+ )
+ return HttpResponseRedirect(post_url_continue)
+
+ elif "_addanother" in request.POST:
+ msg = _('The %(name)s "%(obj)s" was added successfully. You may add another %(name)s below.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ redirect_url = request.path
+ redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url)
+ return HttpResponseRedirect(redirect_url)
+
+ else:
+ msg = _('The %(name)s "%(obj)s" was added successfully.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ return self.response_post_save_add(request, obj)
+
+ def response_change(self, request, obj):
+ """
+ Determines the HttpResponse for the change_view stage.
+ """
+
+ if IS_POPUP_VAR in request.POST:
+ to_field = request.POST.get(TO_FIELD_VAR)
+ attr = str(to_field) if to_field else obj._meta.pk.attname
+ # Retrieve the `object_id` from the resolved pattern arguments.
+ value = request.resolver_match.args[0]
+ new_value = obj.serializable_value(attr)
+ return SimpleTemplateResponse('admin/popup_response.html', {
+ 'action': 'change',
+ 'value': escape(value),
+ 'obj': escapejs(obj),
+ 'new_value': escape(new_value),
+ })
+
+ opts = self.model._meta
+ pk_value = obj._get_pk_val()
+ preserved_filters = self.get_preserved_filters(request)
+
+ msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)}
+ if "_continue" in request.POST:
+ msg = _('The %(name)s "%(obj)s" was changed successfully. You may edit it again below.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ redirect_url = request.path
+ redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url)
+ return HttpResponseRedirect(redirect_url)
+
+ elif "_saveasnew" in request.POST:
+ msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ redirect_url = reverse('admin:%s_%s_change' %
+ (opts.app_label, opts.model_name),
+ args=(pk_value,),
+ current_app=self.admin_site.name)
+ redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url)
+ return HttpResponseRedirect(redirect_url)
+
+ elif "_addanother" in request.POST:
+ msg = _('The %(name)s "%(obj)s" was changed successfully. You may add another %(name)s below.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ redirect_url = reverse('admin:%s_%s_add' %
+ (opts.app_label, opts.model_name),
+ current_app=self.admin_site.name)
+ redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url)
+ return HttpResponseRedirect(redirect_url)
+
+ else:
+ msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict
+ self.message_user(request, msg, messages.SUCCESS)
+ return self.response_post_save_change(request, obj)
+
+ def response_post_save_add(self, request, obj):
+ """
+ Figure out where to redirect after the 'Save' button has been pressed
+ when adding a new object.
+ """
+ opts = self.model._meta
+ if self.has_change_permission(request, None):
+ post_url = reverse('admin:%s_%s_changelist' %
+ (opts.app_label, opts.model_name),
+ current_app=self.admin_site.name)
+ preserved_filters = self.get_preserved_filters(request)
+ post_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, post_url)
+ else:
+ post_url = reverse('admin:index',
+ current_app=self.admin_site.name)
+ return HttpResponseRedirect(post_url)
+
+ def response_post_save_change(self, request, obj):
+ """
+ Figure out where to redirect after the 'Save' button has been pressed
+ when editing an existing object.
+ """
+ opts = self.model._meta
+
+ if self.has_change_permission(request, None):
+ post_url = reverse('admin:%s_%s_changelist' %
+ (opts.app_label, opts.model_name),
+ current_app=self.admin_site.name)
+ preserved_filters = self.get_preserved_filters(request)
+ post_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, post_url)
+ else:
+ post_url = reverse('admin:index',
+ current_app=self.admin_site.name)
+ return HttpResponseRedirect(post_url)
+
+ def response_action(self, request, queryset):
+ """
+ Handle an admin action. This is called if a request is POSTed to the
+ changelist; it returns an HttpResponse if the action was handled, and
+ None otherwise.
+ """
+
+ # There can be multiple action forms on the page (at the top
+ # and bottom of the change list, for example). Get the action
+ # whose button was pushed.
+ try:
+ action_index = int(request.POST.get('index', 0))
+ except ValueError:
+ action_index = 0
+
+ # Construct the action form.
+ data = request.POST.copy()
+ data.pop(helpers.ACTION_CHECKBOX_NAME, None)
+ data.pop("index", None)
+
+ # Use the action whose button was pushed
+ try:
+ data.update({'action': data.getlist('action')[action_index]})
+ except IndexError:
+ # If we didn't get an action from the chosen form that's invalid
+ # POST data, so by deleting action it'll fail the validation check
+ # below. So no need to do anything here
+ pass
+
+ action_form = self.action_form(data, auto_id=None)
+ action_form.fields['action'].choices = self.get_action_choices(request)
+
+ # If the form's valid we can handle the action.
+ if action_form.is_valid():
+ action = action_form.cleaned_data['action']
+ select_across = action_form.cleaned_data['select_across']
+ func = self.get_actions(request)[action][0]
+
+ # Get the list of selected PKs. If nothing's selected, we can't
+ # perform an action on it, so bail. Except we want to perform
+ # the action explicitly on all objects.
+ selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)
+ if not selected and not select_across:
+ # Reminder that something needs to be selected or nothing will happen
+ msg = _("Items must be selected in order to perform "
+ "actions on them. No items have been changed.")
+ self.message_user(request, msg, messages.WARNING)
+ return None
+
+ if not select_across:
+ # Perform the action only on the selected objects
+ queryset = queryset.filter(pk__in=selected)
+
+ response = func(self, request, queryset)
+
+ # Actions may return an HttpResponse-like object, which will be
+ # used as the response from the POST. If not, we'll be a good
+ # little HTTP citizen and redirect back to the changelist page.
+ if isinstance(response, HttpResponseBase):
+ return response
+ else:
+ return HttpResponseRedirect(request.get_full_path())
+ else:
+ msg = _("No action selected.")
+ self.message_user(request, msg, messages.WARNING)
+ return None
+
+ def response_delete(self, request, obj_display, obj_id):
+ """
+ Determines the HttpResponse for the delete_view stage.
+ """
+
+ opts = self.model._meta
+
+ if IS_POPUP_VAR in request.POST:
+ return SimpleTemplateResponse('admin/popup_response.html', {
+ 'action': 'delete',
+ 'value': escape(obj_id),
+ })
+
+ self.message_user(request,
+ _('The %(name)s "%(obj)s" was deleted successfully.') % {
+ 'name': force_text(opts.verbose_name),
+ 'obj': force_text(obj_display),
+ }, messages.SUCCESS)
+
+ if self.has_change_permission(request, None):
+ post_url = reverse('admin:%s_%s_changelist' %
+ (opts.app_label, opts.model_name),
+ current_app=self.admin_site.name)
+ preserved_filters = self.get_preserved_filters(request)
+ post_url = add_preserved_filters(
+ {'preserved_filters': preserved_filters, 'opts': opts}, post_url
+ )
+ else:
+ post_url = reverse('admin:index',
+ current_app=self.admin_site.name)
+ return HttpResponseRedirect(post_url)
+
+ def render_delete_form(self, request, context):
+ opts = self.model._meta
+ app_label = opts.app_label
+
+ request.current_app = self.admin_site.name
+ context.update(
+ to_field_var=TO_FIELD_VAR,
+ is_popup_var=IS_POPUP_VAR,
+ )
+
+ return TemplateResponse(request,
+ self.delete_confirmation_template or [
+ "admin/{}/{}/delete_confirmation.html".format(app_label, opts.model_name),
+ "admin/{}/delete_confirmation.html".format(app_label),
+ "admin/delete_confirmation.html"
+ ], context)
+
+ def get_inline_formsets(self, request, formsets, inline_instances,
+ obj=None):
+ inline_admin_formsets = []
+ for inline, formset in zip(inline_instances, formsets):
+ fieldsets = list(inline.get_fieldsets(request, obj))
+ readonly = list(inline.get_readonly_fields(request, obj))
+ prepopulated = dict(inline.get_prepopulated_fields(request, obj))
+ inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
+ fieldsets, prepopulated, readonly, model_admin=self)
+ inline_admin_formsets.append(inline_admin_formset)
+ return inline_admin_formsets
+
+ def get_changeform_initial_data(self, request):
+ """
+ Get the initial form data.
+ Unless overridden, this populates from the GET params.
+ """
+ initial = dict(request.GET.items())
+ for k in initial:
+ try:
+ f = self.model._meta.get_field(k)
+ except FieldDoesNotExist:
+ continue
+ # We have to special-case M2Ms as a list of comma-separated PKs.
+ if isinstance(f, models.ManyToManyField):
+ initial[k] = initial[k].split(",")
+ return initial
+
+ @csrf_protect_m
+ @transaction.atomic
+ def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
+
+ to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR))
+ if to_field and not self.to_field_allowed(request, to_field):
+ raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field)
+
+ model = self.model
+ opts = model._meta
+ add = object_id is None
+
+ if add:
+ if not self.has_add_permission(request):
+ raise PermissionDenied
+ obj = None
+
+ else:
+ obj = self.get_object(request, unquote(object_id), to_field)
+
+ if not self.has_change_permission(request, obj):
+ raise PermissionDenied
+
+ if obj is None:
+ raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {
+ 'name': force_text(opts.verbose_name), 'key': escape(object_id)})
+
+ if request.method == 'POST' and "_saveasnew" in request.POST:
+ object_id = None
+ obj = None
+
+ ModelForm = self.get_form(request, obj)
+ if request.method == 'POST':
+ form = ModelForm(request.POST, request.FILES, instance=obj)
+ if form.is_valid():
+ form_validated = True
+ new_object = self.save_form(request, form, change=not add)
+ else:
+ form_validated = False
+ new_object = form.instance
+ formsets, inline_instances = self._create_formsets(request, new_object, change=not add)
+ if all_valid(formsets) and form_validated:
+ self.save_model(request, new_object, form, not add)
+ self.save_related(request, form, formsets, not add)
+ change_message = self.construct_change_message(request, form, formsets, add)
+ if add:
+ self.log_addition(request, new_object, change_message)
+ return self.response_add(request, new_object)
+ else:
+ self.log_change(request, new_object, change_message)
+ return self.response_change(request, new_object)
+ else:
+ form_validated = False
+ else:
+ if add:
+ initial = self.get_changeform_initial_data(request)
+ form = ModelForm(initial=initial)
+ formsets, inline_instances = self._create_formsets(request, form.instance, change=False)
+ else:
+ form = ModelForm(instance=obj)
+ formsets, inline_instances = self._create_formsets(request, obj, change=True)
+
+ adminForm = helpers.AdminForm(
+ form,
+ list(self.get_fieldsets(request, obj)),
+ self.get_prepopulated_fields(request, obj),
+ self.get_readonly_fields(request, obj),
+ model_admin=self)
+ media = self.media + adminForm.media
+
+ inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj)
+ for inline_formset in inline_formsets:
+ media = media + inline_formset.media
+
+ context = dict(self.admin_site.each_context(request),
+ title=(_('Add %s') if add else _('Change %s')) % force_text(opts.verbose_name),
+ adminform=adminForm,
+ object_id=object_id,
+ original=obj,
+ is_popup=(IS_POPUP_VAR in request.POST or
+ IS_POPUP_VAR in request.GET),
+ to_field=to_field,
+ media=media,
+ inline_admin_formsets=inline_formsets,
+ errors=helpers.AdminErrorList(form, formsets),
+ preserved_filters=self.get_preserved_filters(request),
+ )
+
+ # Hide the "Save" and "Save and continue" buttons if "Save as New" was
+ # previously chosen to prevent the interface from getting confusing.
+ if request.method == 'POST' and not form_validated and "_saveasnew" in request.POST:
+ context['show_save'] = False
+ context['show_save_and_continue'] = False
+
+ context.update(extra_context or {})
+
+ return self.render_change_form(request, context, add=add, change=not add, obj=obj, form_url=form_url)
+
+ def add_view(self, request, form_url='', extra_context=None):
+ return self.changeform_view(request, None, form_url, extra_context)
+
+ def change_view(self, request, object_id, form_url='', extra_context=None):
+ return self.changeform_view(request, object_id, form_url, extra_context)
+
+ @csrf_protect_m
+ def changelist_view(self, request, extra_context=None):
+ """
+ The 'change list' admin view for this model.
+ """
+ from django.contrib.admin.views.main import ERROR_FLAG
+ opts = self.model._meta
+ app_label = opts.app_label
+ if not self.has_change_permission(request, None):
+ raise PermissionDenied
+
+ list_display = self.get_list_display(request)
+ list_display_links = self.get_list_display_links(request, list_display)
+ list_filter = self.get_list_filter(request)
+ search_fields = self.get_search_fields(request)
+ list_select_related = self.get_list_select_related(request)
+
+ # Check actions to see if any are available on this changelist
+ actions = self.get_actions(request)
+ if actions:
+ # Add the action checkboxes if there are any actions available.
+ list_display = ['action_checkbox'] + list(list_display)
+
+ ChangeList = self.get_changelist(request)
+ try:
+ cl = ChangeList(request, self.model, list_display,
+ list_display_links, list_filter, self.date_hierarchy,
+ search_fields, list_select_related, self.list_per_page,
+ self.list_max_show_all, self.list_editable, self)
+
+ except IncorrectLookupParameters:
+ # Wacky lookup parameters were given, so redirect to the main
+ # changelist page, without parameters, and pass an 'invalid=1'
+ # parameter via the query string. If wacky parameters were given
+ # and the 'invalid=1' parameter was already in the query string,
+ # something is screwed up with the database, so display an error
+ # page.
+ if ERROR_FLAG in request.GET.keys():
+ return SimpleTemplateResponse('admin/invalid_setup.html', {
+ 'title': _('Database error'),
+ })
+ return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
+
+ # If the request was POSTed, this might be a bulk action or a bulk
+ # edit. Try to look up an action or confirmation first, but if this
+ # isn't an action the POST will fall through to the bulk edit check,
+ # below.
+ action_failed = False
+ selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)
+
+ # Actions with no confirmation
+ if (actions and request.method == 'POST' and
+ 'index' in request.POST and '_save' not in request.POST):
+ if selected:
+ response = self.response_action(request, queryset=cl.get_queryset(request))
+ if response:
+ return response
+ else:
+ action_failed = True
+ else:
+ msg = _("Items must be selected in order to perform "
+ "actions on them. No items have been changed.")
+ self.message_user(request, msg, messages.WARNING)
+ action_failed = True
+
+ # Actions with confirmation
+ if (actions and request.method == 'POST' and
+ helpers.ACTION_CHECKBOX_NAME in request.POST and
+ 'index' not in request.POST and '_save' not in request.POST):
+ if selected:
+ response = self.response_action(request, queryset=cl.get_queryset(request))
+ if response:
+ return response
+ else:
+ action_failed = True
+
+ # If we're allowing changelist editing, we need to construct a formset
+ # for the changelist given all the fields to be edited. Then we'll
+ # use the formset to validate/process POSTed data.
+ formset = cl.formset = None
+
+ # Handle POSTed bulk-edit data.
+ if (request.method == "POST" and cl.list_editable and
+ '_save' in request.POST and not action_failed):
+ FormSet = self.get_changelist_formset(request)
+ formset = cl.formset = FormSet(request.POST, request.FILES, queryset=cl.result_list)
+ if formset.is_valid():
+ changecount = 0
+ for form in formset.forms:
+ if form.has_changed():
+ obj = self.save_form(request, form, change=True)
+ self.save_model(request, obj, form, change=True)
+ self.save_related(request, form, formsets=[], change=True)
+ change_msg = self.construct_change_message(request, form, None)
+ self.log_change(request, obj, change_msg)
+ changecount += 1
+
+ if changecount:
+ if changecount == 1:
+ name = force_text(opts.verbose_name)
+ else:
+ name = force_text(opts.verbose_name_plural)
+ msg = ungettext("%(count)s %(name)s was changed successfully.",
+ "%(count)s %(name)s were changed successfully.",
+ changecount) % {'count': changecount,
+ 'name': name,
+ 'obj': force_text(obj)}
+ self.message_user(request, msg, messages.SUCCESS)
+
+ return HttpResponseRedirect(request.get_full_path())
+
+ # Handle GET -- construct a formset for display.
+ elif cl.list_editable:
+ FormSet = self.get_changelist_formset(request)
+ formset = cl.formset = FormSet(queryset=cl.result_list)
+
+ # Build the list of media to be used by the formset.
+ if formset:
+ media = self.media + formset.media
+ else:
+ media = self.media
+
+ # Build the action form and populate it with available actions.
+ if actions:
+ action_form = self.action_form(auto_id=None)
+ action_form.fields['action'].choices = self.get_action_choices(request)
+ else:
+ action_form = None
+
+ selection_note_all = ungettext('%(total_count)s selected',
+ 'All %(total_count)s selected', cl.result_count)
+
+ context = dict(
+ self.admin_site.each_context(request),
+ module_name=force_text(opts.verbose_name_plural),
+ selection_note=_('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
+ selection_note_all=selection_note_all % {'total_count': cl.result_count},
+ title=cl.title,
+ is_popup=cl.is_popup,
+ to_field=cl.to_field,
+ cl=cl,
+ media=media,
+ has_add_permission=self.has_add_permission(request),
+ opts=cl.opts,
+ action_form=action_form,
+ actions_on_top=self.actions_on_top,
+ actions_on_bottom=self.actions_on_bottom,
+ actions_selection_counter=self.actions_selection_counter,
+ preserved_filters=self.get_preserved_filters(request),
+ )
+ context.update(extra_context or {})
+
+ request.current_app = self.admin_site.name
+
+ return TemplateResponse(request, self.change_list_template or [
+ 'admin/%s/%s/change_list.html' % (app_label, opts.model_name),
+ 'admin/%s/change_list.html' % app_label,
+ 'admin/change_list.html'
+ ], context)
+
+ @csrf_protect_m
+ @transaction.atomic
+ def delete_view(self, request, object_id, extra_context=None):
+ "The 'delete' admin view for this model."
+ opts = self.model._meta
+ app_label = opts.app_label
+
+ to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR))
+ if to_field and not self.to_field_allowed(request, to_field):
+ raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field)
+
+ obj = self.get_object(request, unquote(object_id), to_field)
+
+ if not self.has_delete_permission(request, obj):
+ raise PermissionDenied
+
+ if obj is None:
+ raise Http404(
+ _('%(name)s object with primary key %(key)r does not exist.') %
+ {'name': force_text(opts.verbose_name), 'key': escape(object_id)}
+ )
+
+ using = router.db_for_write(self.model)
+
+ # Populate deleted_objects, a data structure of all related objects that
+ # will also be deleted.
+ (deleted_objects, model_count, perms_needed, protected) = get_deleted_objects(
+ [obj], opts, request.user, self.admin_site, using)
+
+ if request.POST: # The user has already confirmed the deletion.
+ if perms_needed:
+ raise PermissionDenied
+ obj_display = force_text(obj)
+ attr = str(to_field) if to_field else opts.pk.attname
+ obj_id = obj.serializable_value(attr)
+ self.log_deletion(request, obj, obj_display)
+ self.delete_model(request, obj)
+
+ return self.response_delete(request, obj_display, obj_id)
+
+ object_name = force_text(opts.verbose_name)
+
+ if perms_needed or protected:
+ title = _("Cannot delete %(name)s") % {"name": object_name}
+ else:
+ title = _("Are you sure?")
+
+ context = dict(
+ self.admin_site.each_context(request),
+ title=title,
+ object_name=object_name,
+ object=obj,
+ deleted_objects=deleted_objects,
+ model_count=dict(model_count).items(),
+ perms_lacking=perms_needed,
+ protected=protected,
+ opts=opts,
+ app_label=app_label,
+ preserved_filters=self.get_preserved_filters(request),
+ is_popup=(IS_POPUP_VAR in request.POST or
+ IS_POPUP_VAR in request.GET),
+ to_field=to_field,
+ )
+ context.update(extra_context or {})
+
+ return self.render_delete_form(request, context)
+
+ def history_view(self, request, object_id, extra_context=None):
+ "The 'history' admin view for this model."
+ from django.contrib.admin.models import LogEntry
+ # First check if the user can see this history.
+ model = self.model
+ obj = self.get_object(request, unquote(object_id))
+ if obj is None:
+ raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {
+ 'name': force_text(model._meta.verbose_name),
+ 'key': escape(object_id),
+ })
+
+ if not self.has_change_permission(request, obj):
+ raise PermissionDenied
+
+ # Then get the history for this object.
+ opts = model._meta
+ app_label = opts.app_label
+ action_list = LogEntry.objects.filter(
+ object_id=unquote(object_id),
+ content_type=get_content_type_for_model(model)
+ ).select_related().order_by('action_time')
+
+ context = dict(self.admin_site.each_context(request),
+ title=_('Change history: %s') % force_text(obj),
+ action_list=action_list,
+ module_name=capfirst(force_text(opts.verbose_name_plural)),
+ object=obj,
+ opts=opts,
+ preserved_filters=self.get_preserved_filters(request),
+ )
+ context.update(extra_context or {})
+
+ request.current_app = self.admin_site.name
+
+ return TemplateResponse(request, self.object_history_template or [
+ "admin/%s/%s/object_history.html" % (app_label, opts.model_name),
+ "admin/%s/object_history.html" % app_label,
+ "admin/object_history.html"
+ ], context)
+
+ def _create_formsets(self, request, obj, change):
+ "Helper function to generate formsets for add/change_view."
+ formsets = []
+ inline_instances = []
+ prefixes = {}
+ get_formsets_args = [request]
+ if change:
+ get_formsets_args.append(obj)
+ for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args):
+ prefix = FormSet.get_default_prefix()
+ prefixes[prefix] = prefixes.get(prefix, 0) + 1
+ if prefixes[prefix] != 1 or not prefix:
+ prefix = "%s-%s" % (prefix, prefixes[prefix])
+ formset_params = {
+ 'instance': obj,
+ 'prefix': prefix,
+ 'queryset': inline.get_queryset(request),
+ }
+ if request.method == 'POST':
+ formset_params.update({
+ 'data': request.POST,
+ 'files': request.FILES,
+ 'save_as_new': '_saveasnew' in request.POST
+ })
+ formsets.append(FormSet(**formset_params))
+ inline_instances.append(inline)
+ return formsets, inline_instances
+
+
+class InlineModelAdmin(BaseModelAdmin):
+ """
+ Options for inline editing of ``model`` instances.
+
+ Provide ``fk_name`` to specify the attribute name of the ``ForeignKey``
+ from ``model`` to its parent. This is required if ``model`` has more than
+ one ``ForeignKey`` to its parent.
+ """
+ model = None
+ fk_name = None
+ formset = BaseInlineFormSet
+ extra = 3
+ min_num = None
+ max_num = None
+ template = None
+ verbose_name = None
+ verbose_name_plural = None
+ can_delete = True
+ show_change_link = False
+ checks_class = InlineModelAdminChecks
+
+ def __init__(self, parent_model, admin_site):
+ self.admin_site = admin_site
+ self.parent_model = parent_model
+ self.opts = self.model._meta
+ self.has_registered_model = admin_site.is_registered(self.model)
+ super(InlineModelAdmin, self).__init__()
+ if self.verbose_name is None:
+ self.verbose_name = self.model._meta.verbose_name
+ if self.verbose_name_plural is None:
+ self.verbose_name_plural = self.model._meta.verbose_name_plural
+
+ @property
+ def media(self):
+ extra = '' if settings.DEBUG else '.min'
+ js = ['vendor/jquery/jquery%s.js' % extra, 'jquery.init.js',
+ 'inlines%s.js' % extra]
+ if self.filter_vertical or self.filter_horizontal:
+ js.extend(['SelectBox.js', 'SelectFilter2.js'])
+ return forms.Media(js=[static('admin/js/%s' % url) for url in js])
+
+ def get_extra(self, request, obj=None, **kwargs):
+ """Hook for customizing the number of extra inline forms."""
+ return self.extra
+
+ def get_min_num(self, request, obj=None, **kwargs):
+ """Hook for customizing the min number of inline forms."""
+ return self.min_num
+
+ def get_max_num(self, request, obj=None, **kwargs):
+ """Hook for customizing the max number of extra inline forms."""
+ return self.max_num
+
+ def get_formset(self, request, obj=None, **kwargs):
+ """Returns a BaseInlineFormSet class for use in admin add/change views."""
+ if 'fields' in kwargs:
+ fields = kwargs.pop('fields')
+ else:
+ fields = flatten_fieldsets(self.get_fieldsets(request, obj))
+ if self.exclude is None:
+ exclude = []
+ else:
+ exclude = list(self.exclude)
+ exclude.extend(self.get_readonly_fields(request, obj))
+ if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
+ # Take the custom ModelForm's Meta.exclude into account only if the
+ # InlineModelAdmin doesn't define its own.
+ exclude.extend(self.form._meta.exclude)
+ # If exclude is an empty list we use None, since that's the actual
+ # default.
+ exclude = exclude or None
+ can_delete = self.can_delete and self.has_delete_permission(request, obj)
+ defaults = {
+ "form": self.form,
+ "formset": self.formset,
+ "fk_name": self.fk_name,
+ "fields": fields,
+ "exclude": exclude,
+ "formfield_callback": partial(self.formfield_for_dbfield, request=request),
+ "extra": self.get_extra(request, obj, **kwargs),
+ "min_num": self.get_min_num(request, obj, **kwargs),
+ "max_num": self.get_max_num(request, obj, **kwargs),
+ "can_delete": can_delete,
+ }
+
+ defaults.update(kwargs)
+ base_model_form = defaults['form']
+
+ class DeleteProtectedModelForm(base_model_form):
+ def hand_clean_DELETE(self):
+ """
+ We don't validate the 'DELETE' field itself because on
+ templates it's not rendered using the field information, but
+ just using a generic "deletion_field" of the InlineModelAdmin.
+ """
+ if self.cleaned_data.get(DELETION_FIELD_NAME, False):
+ using = router.db_for_write(self._meta.model)
+ collector = NestedObjects(using=using)
+ if self.instance.pk is None:
+ return
+ collector.collect([self.instance])
+ if collector.protected:
+ objs = []
+ for p in collector.protected:
+ objs.append(
+ # Translators: Model verbose name and instance representation,
+ # suitable to be an item in a list.
+ _('%(class_name)s %(instance)s') % {
+ 'class_name': p._meta.verbose_name,
+ 'instance': p}
+ )
+ params = {'class_name': self._meta.model._meta.verbose_name,
+ 'instance': self.instance,
+ 'related_objects': get_text_list(objs, _('and'))}
+ msg = _("Deleting %(class_name)s %(instance)s would require "
+ "deleting the following protected related objects: "
+ "%(related_objects)s")
+ raise ValidationError(msg, code='deleting_protected', params=params)
+
+ def is_valid(self):
+ result = super(DeleteProtectedModelForm, self).is_valid()
+ self.hand_clean_DELETE()
+ return result
+
+ defaults['form'] = DeleteProtectedModelForm
+
+ if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
+ defaults['fields'] = forms.ALL_FIELDS
+
+ return inlineformset_factory(self.parent_model, self.model, **defaults)
+
+ def get_fields(self, request, obj=None):
+ if self.fields:
+ return self.fields
+ form = self.get_formset(request, obj, fields=None).form
+ return list(form.base_fields) + list(self.get_readonly_fields(request, obj))
+
+ def get_queryset(self, request):
+ queryset = super(InlineModelAdmin, self).get_queryset(request)
+ if not self.has_change_permission(request):
+ queryset = queryset.none()
+ return queryset
+
+ def has_add_permission(self, request):
+ if self.opts.auto_created:
+ # We're checking the rights to an auto-created intermediate model,
+ # which doesn't have its own individual permissions. The user needs
+ # to have the change permission for the related model in order to
+ # be able to do anything with the intermediate model.
+ return self.has_change_permission(request)
+ return super(InlineModelAdmin, self).has_add_permission(request)
+
+ def has_change_permission(self, request, obj=None):
+ opts = self.opts
+ if opts.auto_created:
+ # The model was auto-created as intermediary for a
+ # ManyToMany-relationship, find the target model
+ for field in opts.fields:
+ if field.remote_field and field.remote_field.model != self.parent_model:
+ opts = field.remote_field.model._meta
+ break
+ codename = get_permission_codename('change', opts)
+ return request.user.has_perm("%s.%s" % (opts.app_label, codename))
+
+ def has_delete_permission(self, request, obj=None):
+ if self.opts.auto_created:
+ # We're checking the rights to an auto-created intermediate model,
+ # which doesn't have its own individual permissions. The user needs
+ # to have the change permission for the related model in order to
+ # be able to do anything with the intermediate model.
+ return self.has_change_permission(request, obj)
+ return super(InlineModelAdmin, self).has_delete_permission(request, obj)
+
+
+class StackedInline(InlineModelAdmin):
+ template = 'admin/edit_inline/stacked.html'
+
+
+class TabularInline(InlineModelAdmin):
+ template = 'admin/edit_inline/tabular.html'
diff --git a/tbc/static/admin/sites.py b/tbc/static/admin/sites.py
new file mode 100644
index 0000000..39f22b8
--- /dev/null
+++ b/tbc/static/admin/sites.py
@@ -0,0 +1,535 @@
+from functools import update_wrapper
+
+from django.apps import apps
+from django.conf import settings
+from django.contrib.admin import ModelAdmin, actions
+from django.contrib.auth import REDIRECT_FIELD_NAME
+from django.core.exceptions import ImproperlyConfigured, PermissionDenied
+from django.core.urlresolvers import NoReverseMatch, reverse
+from django.db.models.base import ModelBase
+from django.http import Http404, HttpResponseRedirect
+from django.template.engine import Engine
+from django.template.response import TemplateResponse
+from django.utils import six
+from django.utils.text import capfirst
+from django.utils.translation import ugettext as _, ugettext_lazy
+from django.views.decorators.cache import never_cache
+from django.views.decorators.csrf import csrf_protect
+
+system_check_errors = []
+
+
+class AlreadyRegistered(Exception):
+ pass
+
+
+class NotRegistered(Exception):
+ pass
+
+
+class AdminSite(object):
+ """
+ An AdminSite object encapsulates an instance of the Django admin application, ready
+ to be hooked in to your URLconf. Models are registered with the AdminSite using the
+ register() method, and the get_urls() method can then be used to access Django view
+ functions that present a full admin interface for the collection of registered
+ models.
+ """
+
+ # Text to put at the end of each page's <title>.
+ site_title = ugettext_lazy('Django site admin')
+
+ # Text to put in each page's <h1>.
+ site_header = ugettext_lazy('Django administration')
+
+ # Text to put at the top of the admin index page.
+ index_title = ugettext_lazy('Site administration')
+
+ # URL for the "View site" link at the top of each admin page.
+ site_url = '/'
+
+ _empty_value_display = '-'
+
+ login_form = None
+ index_template = None
+ app_index_template = None
+ login_template = None
+ logout_template = None
+ password_change_template = None
+ password_change_done_template = None
+
+ def __init__(self, name='admin'):
+ self._registry = {} # model_class class -> admin_class instance
+ self.name = name
+ self._actions = {'delete_selected': actions.delete_selected}
+ self._global_actions = self._actions.copy()
+
+ def register(self, model_or_iterable, admin_class=None, **options):
+ """
+ Registers the given model(s) with the given admin class.
+
+ The model(s) should be Model classes, not instances.
+
+ If an admin class isn't given, it will use ModelAdmin (the default
+ admin options). If keyword arguments are given -- e.g., list_display --
+ they'll be applied as options to the admin class.
+
+ If a model is already registered, this will raise AlreadyRegistered.
+
+ If a model is abstract, this will raise ImproperlyConfigured.
+ """
+ if not admin_class:
+ admin_class = ModelAdmin
+
+ if isinstance(model_or_iterable, ModelBase):
+ model_or_iterable = [model_or_iterable]
+ for model in model_or_iterable:
+ if model._meta.abstract:
+ raise ImproperlyConfigured('The model %s is abstract, so it '
+ 'cannot be registered with admin.' % model.__name__)
+
+ if model in self._registry:
+ raise AlreadyRegistered('The model %s is already registered' % model.__name__)
+
+ # Ignore the registration if the model has been
+ # swapped out.
+ if not model._meta.swapped:
+ # If we got **options then dynamically construct a subclass of
+ # admin_class with those **options.
+ if options:
+ # For reasons I don't quite understand, without a __module__
+ # the created class appears to "live" in the wrong place,
+ # which causes issues later on.
+ options['__module__'] = __name__
+ admin_class = type("%sAdmin" % model.__name__, (admin_class,), options)
+
+ # Instantiate the admin class to save in the registry
+ admin_obj = admin_class(model, self)
+ if admin_class is not ModelAdmin and settings.DEBUG:
+ system_check_errors.extend(admin_obj.check())
+
+ self._registry[model] = admin_obj
+
+ def unregister(self, model_or_iterable):
+ """
+ Unregisters the given model(s).
+
+ If a model isn't already registered, this will raise NotRegistered.
+ """
+ if isinstance(model_or_iterable, ModelBase):
+ model_or_iterable = [model_or_iterable]
+ for model in model_or_iterable:
+ if model not in self._registry:
+ raise NotRegistered('The model %s is not registered' % model.__name__)
+ del self._registry[model]
+
+ def is_registered(self, model):
+ """
+ Check if a model class is registered with this `AdminSite`.
+ """
+ return model in self._registry
+
+ def add_action(self, action, name=None):
+ """
+ Register an action to be available globally.
+ """
+ name = name or action.__name__
+ self._actions[name] = action
+ self._global_actions[name] = action
+
+ def disable_action(self, name):
+ """
+ Disable a globally-registered action. Raises KeyError for invalid names.
+ """
+ del self._actions[name]
+
+ def get_action(self, name):
+ """
+ Explicitly get a registered global action whether it's enabled or
+ not. Raises KeyError for invalid names.
+ """
+ return self._global_actions[name]
+
+ @property
+ def actions(self):
+ """
+ Get all the enabled actions as an iterable of (name, func).
+ """
+ return six.iteritems(self._actions)
+
+ @property
+ def empty_value_display(self):
+ return self._empty_value_display
+
+ @empty_value_display.setter
+ def empty_value_display(self, empty_value_display):
+ self._empty_value_display = empty_value_display
+
+ def has_permission(self, request):
+ """
+ Returns True if the given HttpRequest has permission to view
+ *at least one* page in the admin site.
+ """
+ return request.user.is_active and request.user.is_staff
+
+ def check_dependencies(self):
+ """
+ Check that all things needed to run the admin have been correctly installed.
+
+ The default implementation checks that admin and contenttypes apps are
+ installed, as well as the auth context processor.
+ """
+ if not apps.is_installed('django.contrib.admin'):
+ raise ImproperlyConfigured(
+ "Put 'django.contrib.admin' in your INSTALLED_APPS "
+ "setting in order to use the admin application.")
+ if not apps.is_installed('django.contrib.contenttypes'):
+ raise ImproperlyConfigured(
+ "Put 'django.contrib.contenttypes' in your INSTALLED_APPS "
+ "setting in order to use the admin application.")
+ try:
+ default_template_engine = Engine.get_default()
+ except Exception:
+ # Skip this non-critical check:
+ # 1. if the user has a non-trivial TEMPLATES setting and Django
+ # can't find a default template engine
+ # 2. if anything goes wrong while loading template engines, in
+ # order to avoid raising an exception from a confusing location
+ # Catching ImproperlyConfigured suffices for 1. but 2. requires
+ # catching all exceptions.
+ pass
+ else:
+ if ('django.contrib.auth.context_processors.auth'
+ not in default_template_engine.context_processors):
+ raise ImproperlyConfigured(
+ "Enable 'django.contrib.auth.context_processors.auth' "
+ "in your TEMPLATES setting in order to use the admin "
+ "application.")
+
+ def admin_view(self, view, cacheable=False):
+ """
+ Decorator to create an admin view attached to this ``AdminSite``. This
+ wraps the view and provides permission checking by calling
+ ``self.has_permission``.
+
+ You'll want to use this from within ``AdminSite.get_urls()``:
+
+ class MyAdminSite(AdminSite):
+
+ def get_urls(self):
+ from django.conf.urls import url
+
+ urls = super(MyAdminSite, self).get_urls()
+ urls += [
+ url(r'^my_view/$', self.admin_view(some_view))
+ ]
+ return urls
+
+ By default, admin_views are marked non-cacheable using the
+ ``never_cache`` decorator. If the view can be safely cached, set
+ cacheable=True.
+ """
+ def inner(request, *args, **kwargs):
+ if not self.has_permission(request):
+ if request.path == reverse('admin:logout', current_app=self.name):
+ index_path = reverse('admin:index', current_app=self.name)
+ return HttpResponseRedirect(index_path)
+ # Inner import to prevent django.contrib.admin (app) from
+ # importing django.contrib.auth.models.User (unrelated model).
+ from django.contrib.auth.views import redirect_to_login
+ return redirect_to_login(
+ request.get_full_path(),
+ reverse('admin:login', current_app=self.name)
+ )
+ return view(request, *args, **kwargs)
+ if not cacheable:
+ inner = never_cache(inner)
+ # We add csrf_protect here so this function can be used as a utility
+ # function for any view, without having to repeat 'csrf_protect'.
+ if not getattr(view, 'csrf_exempt', False):
+ inner = csrf_protect(inner)
+ return update_wrapper(inner, view)
+
+ def get_urls(self):
+ from django.conf.urls import url, include
+ # Since this module gets imported in the application's root package,
+ # it cannot import models from other applications at the module level,
+ # and django.contrib.contenttypes.views imports ContentType.
+ from django.contrib.contenttypes import views as contenttype_views
+
+ if settings.DEBUG:
+ self.check_dependencies()
+
+ def wrap(view, cacheable=False):
+ def wrapper(*args, **kwargs):
+ return self.admin_view(view, cacheable)(*args, **kwargs)
+ wrapper.admin_site = self
+ return update_wrapper(wrapper, view)
+
+ # Admin-site-wide views.
+ urlpatterns = [
+ url(r'^$', wrap(self.index), name='index'),
+ url(r'^login/$', self.login, name='login'),
+ url(r'^logout/$', wrap(self.logout), name='logout'),
+ url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
+ url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True),
+ name='password_change_done'),
+ url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
+ url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut),
+ name='view_on_site'),
+ ]
+
+ # Add in each model's views, and create a list of valid URLS for the
+ # app_index
+ valid_app_labels = []
+ for model, model_admin in self._registry.items():
+ urlpatterns += [
+ url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
+ ]
+ if model._meta.app_label not in valid_app_labels:
+ valid_app_labels.append(model._meta.app_label)
+
+ # If there were ModelAdmins registered, we should have a list of app
+ # labels for which we need to allow access to the app_index view,
+ if valid_app_labels:
+ regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
+ urlpatterns += [
+ url(regex, wrap(self.app_index), name='app_list'),
+ ]
+ return urlpatterns
+
+ @property
+ def urls(self):
+ return self.get_urls(), 'admin', self.name
+
+ def each_context(self, request):
+ """
+ Returns a dictionary of variables to put in the template context for
+ *every* page in the admin site.
+ """
+ return {
+ 'site_title': self.site_title,
+ 'site_header': self.site_header,
+ 'site_url': self.site_url,
+ 'has_permission': self.has_permission(request),
+ 'available_apps': self.get_app_list(request),
+ }
+
+ def password_change(self, request, extra_context=None):
+ """
+ Handles the "change password" task -- both form display and validation.
+ """
+ from django.contrib.admin.forms import AdminPasswordChangeForm
+ from django.contrib.auth.views import password_change
+ url = reverse('admin:password_change_done', current_app=self.name)
+ defaults = {
+ 'password_change_form': AdminPasswordChangeForm,
+ 'post_change_redirect': url,
+ 'extra_context': dict(self.each_context(request), **(extra_context or {})),
+ }
+ if self.password_change_template is not None:
+ defaults['template_name'] = self.password_change_template
+ request.current_app = self.name
+ return password_change(request, **defaults)
+
+ def password_change_done(self, request, extra_context=None):
+ """
+ Displays the "success" page after a password change.
+ """
+ from django.contrib.auth.views import password_change_done
+ defaults = {
+ 'extra_context': dict(self.each_context(request), **(extra_context or {})),
+ }
+ if self.password_change_done_template is not None:
+ defaults['template_name'] = self.password_change_done_template
+ request.current_app = self.name
+ return password_change_done(request, **defaults)
+
+ def i18n_javascript(self, request):
+ """
+ Displays the i18n JavaScript that the Django admin requires.
+
+ This takes into account the USE_I18N setting. If it's set to False, the
+ generated JavaScript will be leaner and faster.
+ """
+ if settings.USE_I18N:
+ from django.views.i18n import javascript_catalog
+ else:
+ from django.views.i18n import null_javascript_catalog as javascript_catalog
+ return javascript_catalog(request, packages=['django.conf', 'django.contrib.admin'])
+
+ @never_cache
+ def logout(self, request, extra_context=None):
+ """
+ Logs out the user for the given HttpRequest.
+
+ This should *not* assume the user is already logged in.
+ """
+ from django.contrib.auth.views import logout
+ defaults = {
+ 'extra_context': dict(self.each_context(request), **(extra_context or {})),
+ }
+ if self.logout_template is not None:
+ defaults['template_name'] = self.logout_template
+ request.current_app = self.name
+ return logout(request, **defaults)
+
+ @never_cache
+ def login(self, request, extra_context=None):
+ """
+ Displays the login form for the given HttpRequest.
+ """
+ if request.method == 'GET' and self.has_permission(request):
+ # Already logged-in, redirect to admin index
+ index_path = reverse('admin:index', current_app=self.name)
+ return HttpResponseRedirect(index_path)
+
+ from django.contrib.auth.views import login
+ # Since this module gets imported in the application's root package,
+ # it cannot import models from other applications at the module level,
+ # and django.contrib.admin.forms eventually imports User.
+ from django.contrib.admin.forms import AdminAuthenticationForm
+ context = dict(self.each_context(request),
+ title=_('Log in'),
+ app_path=request.get_full_path(),
+ )
+ if (REDIRECT_FIELD_NAME not in request.GET and
+ REDIRECT_FIELD_NAME not in request.POST):
+ context[REDIRECT_FIELD_NAME] = reverse('admin:index', current_app=self.name)
+ context.update(extra_context or {})
+
+ defaults = {
+ 'extra_context': context,
+ 'authentication_form': self.login_form or AdminAuthenticationForm,
+ 'template_name': self.login_template or 'admin/login.html',
+ }
+ request.current_app = self.name
+ return login(request, **defaults)
+
+ def _build_app_dict(self, request, label=None):
+ """
+ Builds the app dictionary. Takes an optional label parameters to filter
+ models of a specific app.
+ """
+ app_dict = {}
+
+ if label:
+ models = {
+ m: m_a for m, m_a in self._registry.items()
+ if m._meta.app_label == label
+ }
+ else:
+ models = self._registry
+
+ for model, model_admin in models.items():
+ app_label = model._meta.app_label
+
+ has_module_perms = model_admin.has_module_permission(request)
+ if not has_module_perms:
+ if label:
+ raise PermissionDenied
+ continue
+
+ perms = model_admin.get_model_perms(request)
+
+ # Check whether user has any perm for this module.
+ # If so, add the module to the model_list.
+ if True not in perms.values():
+ continue
+
+ info = (app_label, model._meta.model_name)
+ model_dict = {
+ 'name': capfirst(model._meta.verbose_name_plural),
+ 'object_name': model._meta.object_name,
+ 'perms': perms,
+ }
+ if perms.get('change'):
+ try:
+ model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
+ except NoReverseMatch:
+ pass
+ if perms.get('add'):
+ try:
+ model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name)
+ except NoReverseMatch:
+ pass
+
+ if app_label in app_dict:
+ app_dict[app_label]['models'].append(model_dict)
+ else:
+ app_dict[app_label] = {
+ 'name': apps.get_app_config(app_label).verbose_name,
+ 'app_label': app_label,
+ 'app_url': reverse(
+ 'admin:app_list',
+ kwargs={'app_label': app_label},
+ current_app=self.name,
+ ),
+ 'has_module_perms': has_module_perms,
+ 'models': [model_dict],
+ }
+
+ if label:
+ return app_dict.get(label)
+ return app_dict
+
+ def get_app_list(self, request):
+ """
+ Returns a sorted list of all the installed apps that have been
+ registered in this site.
+ """
+ app_dict = self._build_app_dict(request)
+
+ # Sort the apps alphabetically.
+ app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())
+
+ # Sort the models alphabetically within each app.
+ for app in app_list:
+ app['models'].sort(key=lambda x: x['name'])
+
+ return app_list
+
+ @never_cache
+ def index(self, request, extra_context=None):
+ """
+ Displays the main admin index page, which lists all of the installed
+ apps that have been registered in this site.
+ """
+ app_list = self.get_app_list(request)
+
+ context = dict(
+ self.each_context(request),
+ title=self.index_title,
+ app_list=app_list,
+ )
+ context.update(extra_context or {})
+
+ request.current_app = self.name
+
+ return TemplateResponse(request, self.index_template or
+ 'admin/index.html', context)
+
+ def app_index(self, request, app_label, extra_context=None):
+ app_dict = self._build_app_dict(request, app_label)
+ if not app_dict:
+ raise Http404('The requested admin page does not exist.')
+ # Sort the models alphabetically within each app.
+ app_dict['models'].sort(key=lambda x: x['name'])
+ app_name = apps.get_app_config(app_label).verbose_name
+ context = dict(self.each_context(request),
+ title=_('%(app)s administration') % {'app': app_name},
+ app_list=[app_dict],
+ app_label=app_label,
+ )
+ context.update(extra_context or {})
+
+ request.current_app = self.name
+
+ return TemplateResponse(request, self.app_index_template or [
+ 'admin/%s/app_index.html' % app_label,
+ 'admin/app_index.html'
+ ], context)
+
+# This global object represents the default admin site, for the common case.
+# You can instantiate AdminSite in your own code to create a custom admin site.
+site = AdminSite()
diff --git a/tbc/static/admin/static/admin/css/base.css b/tbc/static/admin/static/admin/css/base.css
new file mode 100644
index 0000000..a37555a
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/base.css
@@ -0,0 +1,967 @@
+/*
+ DJANGO Admin styles
+*/
+
+@import url(fonts.css);
+
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+ color: #333;
+ background: #fff;
+}
+
+/* LINKS */
+
+a:link, a:visited {
+ color: #447e9b;
+ text-decoration: none;
+}
+
+a:focus, a:hover {
+ color: #036;
+}
+
+a:focus {
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+a.section:link, a.section:visited {
+ color: #fff;
+ text-decoration: none;
+}
+
+a.section:focus, a.section:hover {
+ text-decoration: underline;
+}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+ margin: .2em 0 .8em 0;
+}
+
+p {
+ padding: 0;
+ line-height: 140%;
+}
+
+h1,h2,h3,h4,h5 {
+ font-weight: bold;
+}
+
+h1 {
+ margin: 0 0 20px;
+ font-weight: 300;
+ font-size: 20px;
+ color: #666;
+}
+
+h2 {
+ font-size: 16px;
+ margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+ font-weight: normal;
+ margin-top: 0;
+}
+
+h3 {
+ font-size: 14px;
+ margin: .8em 0 .3em 0;
+ color: #666;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 12px;
+ margin: 1em 0 .8em 0;
+ padding-bottom: 3px;
+}
+
+h5 {
+ font-size: 10px;
+ margin: 1.5em 0 .5em 0;
+ color: #666;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+ul li {
+ list-style-type: square;
+ padding: 1px 0;
+}
+
+li ul {
+ margin-bottom: 0;
+}
+
+li, dt, dd {
+ font-size: 13px;
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 4px;
+}
+
+dd {
+ margin-left: 0;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+blockquote {
+ font-size: 11px;
+ color: #777;
+ margin-left: 2px;
+ padding-left: 10px;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+ color: #666;
+ font-size: 12px;
+}
+
+pre.literal-block {
+ margin: 10px;
+ background: #eee;
+ padding: 6px 8px;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ clear: both;
+ color: #eee;
+ background-color: #eee;
+ height: 1px;
+ border: none;
+ margin: 0;
+ padding: 0;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
+.small {
+ font-size: 11px;
+}
+
+.tiny {
+ font-size: 10px;
+}
+
+p.tiny {
+ margin-top: -2px;
+}
+
+.mini {
+ font-size: 10px;
+}
+
+p.mini {
+ margin-top: -3px;
+}
+
+.help, p.help, form p.help {
+ font-size: 11px;
+ color: #999;
+}
+
+.help-tooltip {
+ cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+ vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+ color: #999;
+ font-weight: normal;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.clear {
+ clear: both;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.example {
+ margin: 10px 0;
+ padding: 5px 10px;
+ background: #efefef;
+}
+
+.nowrap {
+ white-space: nowrap;
+}
+
+/* TABLES */
+
+table {
+ border-collapse: collapse;
+ border-color: #ccc;
+}
+
+td, th {
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #eee;
+ vertical-align: top;
+ padding: 8px;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+}
+
+th {
+ font-weight: 600;
+ text-align: left;
+}
+
+thead th,
+tfoot td {
+ color: #666;
+ padding: 5px 10px;
+ font-size: 11px;
+ background: #fff;
+ border: none;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+tfoot td {
+ border-bottom: none;
+ border-top: 1px solid #eee;
+}
+
+tr.alt {
+ background: #f6f6f6;
+}
+
+.row1 {
+ background: #fff;
+}
+
+.row2 {
+ background: #f9f9f9;
+}
+
+/* SORTABLE TABLES */
+
+thead th {
+ padding: 5px 10px;
+ line-height: normal;
+ text-transform: uppercase;
+ background: #f6f6f6;
+}
+
+thead th a:link, thead th a:visited {
+ color: #666;
+}
+
+thead th.sorted {
+ background: #eee;
+}
+
+thead th.sorted .text {
+ padding-right: 42px;
+}
+
+table thead th .text span {
+ padding: 8px 10px;
+ display: block;
+}
+
+table thead th .text a {
+ display: block;
+ cursor: pointer;
+ padding: 8px 10px;
+}
+
+table thead th .text a:focus, table thead th .text a:hover {
+ background: #eee;
+}
+
+thead th.sorted a.sortremove {
+ visibility: hidden;
+}
+
+table thead th.sorted:hover a.sortremove {
+ visibility: visible;
+}
+
+table thead th.sorted .sortoptions {
+ display: block;
+ padding: 9px 5px 0 5px;
+ float: right;
+ text-align: right;
+}
+
+table thead th.sorted .sortpriority {
+ font-size: .8em;
+ min-width: 12px;
+ text-align: center;
+ vertical-align: 3px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+table thead th.sorted .sortoptions a {
+ position: relative;
+ width: 14px;
+ height: 14px;
+ display: inline-block;
+ background: url(../img/sorting-icons.svg) 0 0 no-repeat;
+ background-size: 14px auto;
+}
+
+table thead th.sorted .sortoptions a.sortremove {
+ background-position: 0 0;
+}
+
+table thead th.sorted .sortoptions a.sortremove:after {
+ content: '\\';
+ position: absolute;
+ top: -6px;
+ left: 3px;
+ font-weight: 200;
+ font-size: 18px;
+ color: #999;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus:after,
+table thead th.sorted .sortoptions a.sortremove:hover:after {
+ color: #447e9b;
+}
+
+table thead th.sorted .sortoptions a.sortremove:focus,
+table thead th.sorted .sortoptions a.sortremove:hover {
+ background-position: 0 -14px;
+}
+
+table thead th.sorted .sortoptions a.ascending {
+ background-position: 0 -28px;
+}
+
+table thead th.sorted .sortoptions a.ascending:focus,
+table thead th.sorted .sortoptions a.ascending:hover {
+ background-position: 0 -42px;
+}
+
+table thead th.sorted .sortoptions a.descending {
+ top: 1px;
+ background-position: 0 -56px;
+}
+
+table thead th.sorted .sortoptions a.descending:focus,
+table thead th.sorted .sortoptions a.descending:hover {
+ background-position: 0 -70px;
+}
+
+/* FORM DEFAULTS */
+
+input, textarea, select, .form-row p, form .button {
+ margin: 2px 0;
+ padding: 2px 3px;
+ vertical-align: middle;
+ font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 13px;
+}
+
+textarea {
+ vertical-align: top;
+}
+
+input[type=text], input[type=password], input[type=email], input[type=url],
+input[type=number], textarea, select, .vTextField {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ padding: 5px 6px;
+ margin-top: 0;
+}
+
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
+input[type=url]:focus, input[type=number]:focus, textarea:focus, select:focus,
+.vTextField:focus {
+ border-color: #999;
+}
+
+select {
+ height: 30px;
+}
+
+select[multiple] {
+ min-height: 150px;
+}
+
+/* FORM BUTTONS */
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #79aec8;
+ padding: 10px 15px;
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+}
+
+a.button {
+ padding: 4px 5px;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active,
+.button:focus, input[type=submit]:focus, input[type=button]:focus,
+.button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #609ab6;
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+ opacity: 0.4;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ float: right;
+ border: none;
+ font-weight: 400;
+ background: #417690;
+}
+
+.button.default:active, input[type=submit].default:active,
+.button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #205067;
+}
+
+.button[disabled].default,
+input[type=submit][disabled].default,
+input[type=button][disabled].default {
+ opacity: 0.4;
+}
+
+
+/* MODULES */
+
+.module {
+ border: none;
+ margin-bottom: 30px;
+ background: #fff;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.module blockquote {
+ margin-left: 12px;
+}
+
+.module ul, .module ol {
+ margin-left: 1.5em;
+}
+
+.module h3 {
+ margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ margin: 0;
+ padding: 8px;
+ font-weight: 400;
+ font-size: 13px;
+ text-align: left;
+ background: #79aec8;
+ color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+ font-size: 12px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+}
+
+.module table {
+ border-collapse: collapse;
+}
+
+/* MESSAGES & ERRORS */
+
+ul.messagelist {
+ padding: 0;
+ margin: 0;
+}
+
+ul.messagelist li {
+ display: block;
+ font-weight: 400;
+ font-size: 13px;
+ padding: 10px 10px 10px 65px;
+ margin: 0 0 10px 0;
+ background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+ color: #333;
+}
+
+ul.messagelist li.warning {
+ background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat;
+ background-size: 14px auto;
+}
+
+ul.messagelist li.error {
+ background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat;
+ background-size: 16px auto;
+}
+
+.errornote {
+ font-size: 14px;
+ font-weight: 700;
+ display: block;
+ padding: 10px 12px;
+ margin: 0 0 10px 0;
+ color: #ba2121;
+ border: 1px solid #ba2121;
+ border-radius: 4px;
+ background-color: #fff;
+ background-position: 5px 12px;
+}
+
+ul.errorlist {
+ margin: 0 0 4px;
+ padding: 0;
+ color: #ba2121;
+ background: #fff;
+}
+
+ul.errorlist li {
+ font-size: 13px;
+ display: block;
+ margin-bottom: 4px;
+}
+
+ul.errorlist li:first-child {
+ margin-top: 0;
+}
+
+ul.errorlist li a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td ul.errorlist {
+ margin: 0;
+ padding: 0;
+}
+
+td ul.errorlist li {
+ margin: 0;
+}
+
+.form-row.errors {
+ margin: 0;
+ border: none;
+ border-bottom: 1px solid #eee;
+ background: none;
+}
+
+.form-row.errors ul.errorlist li {
+ padding-left: 0;
+}
+
+.errors input, .errors select, .errors textarea {
+ border: 1px solid #ba2121;
+}
+
+div.system-message {
+ background: #ffc;
+ margin: 10px;
+ padding: 6px 8px;
+ font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+ padding: 4px 5px 4px 25px;
+ margin: 0;
+ color: #c11;
+ background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
+}
+
+.description {
+ font-size: 12px;
+ padding: 5px 0 0 12px;
+}
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+ background: #79aec8;
+ padding: 10px 40px;
+ border: none;
+ font-size: 14px;
+ color: #c4dce8;
+ text-align: left;
+}
+
+div.breadcrumbs a {
+ color: #fff;
+}
+
+div.breadcrumbs a:focus, div.breadcrumbs a:hover {
+ color: #c4dce8;
+}
+
+/* ACTION ICONS */
+
+.addlink {
+ padding-left: 16px;
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+}
+
+.changelink, .inlinechangelink {
+ padding-left: 16px;
+ background: url(../img/icon-changelink.svg) 0 1px no-repeat;
+}
+
+.deletelink {
+ padding-left: 16px;
+ background: url(../img/icon-deletelink.svg) 0 1px no-repeat;
+}
+
+a.deletelink:link, a.deletelink:visited {
+ color: #CC3434;
+}
+
+a.deletelink:focus, a.deletelink:hover {
+ color: #993333;
+ text-decoration: none;
+}
+
+/* OBJECT TOOLS */
+
+.object-tools {
+ font-size: 10px;
+ font-weight: bold;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin-top: -48px;
+}
+
+.form-row .object-tools {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ float: none;
+ height: 2em;
+ padding-left: 3.5em;
+}
+
+.object-tools li {
+ display: block;
+ float: left;
+ margin-left: 5px;
+ height: 16px;
+}
+
+.object-tools a {
+ border-radius: 15px;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ padding: 3px 12px;
+ background: #999;
+ font-weight: 400;
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #fff;
+}
+
+.object-tools a:focus, .object-tools a:hover {
+ background-color: #417690;
+}
+
+.object-tools a:focus{
+ text-decoration: none;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
+ background-repeat: no-repeat;
+ background-position: 93% center;
+ padding-right: 26px;
+}
+
+.object-tools a.viewsitelink, .object-tools a.golink {
+ background-image: url(../img/tooltag-arrowright.svg);
+}
+
+.object-tools a.addlink {
+ background-image: url(../img/tooltag-add.svg);
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+ width: 100%;
+}
+
+table#change-history tbody th {
+ width: 16em;
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+ position: relative;
+ width: 100%;
+ min-width: 980px;
+ padding: 0;
+}
+
+#content {
+ padding: 20px 40px;
+}
+
+.dashboard #content {
+ width: 600px;
+}
+
+#content-main {
+ float: left;
+ width: 100%;
+}
+
+#content-related {
+ float: right;
+ width: 260px;
+ position: relative;
+ margin-right: -300px;
+}
+
+#footer {
+ clear: both;
+ padding: 10px;
+}
+
+/* COLUMN TYPES */
+
+.colMS {
+ margin-right: 300px;
+}
+
+.colSM {
+ margin-left: 300px;
+}
+
+.colSM #content-related {
+ float: left;
+ margin-right: 0;
+ margin-left: -300px;
+}
+
+.colSM #content-main {
+ float: right;
+}
+
+.popup .colM {
+ width: auto;
+}
+
+/* HEADER */
+
+#header {
+ width: auto;
+ height: 40px;
+ padding: 10px 40px;
+ background: #417690;
+ line-height: 40px;
+ color: #ffc;
+ overflow: hidden;
+}
+
+#header a:link, #header a:visited {
+ color: #fff;
+}
+
+#header a:focus , #header a:hover {
+ text-decoration: underline;
+}
+
+#branding {
+ float: left;
+}
+
+#branding h1 {
+ padding: 0;
+ margin: 0 20px 0 0;
+ font-weight: 300;
+ font-size: 24px;
+ color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+ color: #f5dd5d;
+}
+
+#branding h2 {
+ padding: 0 10px;
+ font-size: 14px;
+ margin: -8px 0 8px 0;
+ font-weight: normal;
+ color: #ffc;
+}
+
+#branding a:hover {
+ text-decoration: none;
+}
+
+#user-tools {
+ float: right;
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: right;
+}
+
+#user-tools a {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.25);
+}
+
+#user-tools a:focus, #user-tools a:hover {
+ text-decoration: none;
+ border-bottom-color: #79aec8;
+ color: #79aec8;
+}
+
+/* SIDEBAR */
+
+#content-related {
+ background: #f8f8f8;
+}
+
+#content-related .module {
+ background: none;
+}
+
+#content-related h3 {
+ font-size: 14px;
+ color: #666;
+ padding: 0 16px;
+ margin: 0 0 16px;
+}
+
+#content-related h4 {
+ font-size: 13px;
+}
+
+#content-related p {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+#content-related .actionlist {
+ padding: 0;
+ margin: 16px;
+}
+
+#content-related .actionlist li {
+ line-height: 1.2;
+ margin-bottom: 10px;
+ padding-left: 18px;
+}
+
+#content-related .module h2 {
+ background: none;
+ padding: 16px;
+ margin-bottom: 16px;
+ border-bottom: 1px solid #eaeaea;
+ font-size: 18px;
+ color: #333;
+}
+
+.delete-confirmation form input[type="submit"] {
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #fff;
+}
+
+.delete-confirmation form input[type="submit"]:active,
+.delete-confirmation form input[type="submit"]:focus,
+.delete-confirmation form input[type="submit"]:hover {
+ background: #a41515;
+}
+
+.delete-confirmation form .cancel-link {
+ display: inline-block;
+ vertical-align: middle;
+ height: 15px;
+ line-height: 15px;
+ background: #ddd;
+ border-radius: 4px;
+ padding: 10px 15px;
+ color: #333;
+ margin: 0 0 0 10px;
+}
+
+.delete-confirmation form .cancel-link:active,
+.delete-confirmation form .cancel-link:focus,
+.delete-confirmation form .cancel-link:hover {
+ background: #ccc;
+}
+
+/* POPUP */
+.popup #content {
+ padding: 20px;
+}
+
+.popup #container {
+ min-width: 0;
+}
+
+.popup #header {
+ padding: 10px 20px;
+}
diff --git a/tbc/static/admin/static/admin/css/changelists.css b/tbc/static/admin/static/admin/css/changelists.css
new file mode 100644
index 0000000..fd9e784
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/changelists.css
@@ -0,0 +1,341 @@
+/* CHANGELISTS */
+
+#changelist {
+ position: relative;
+ width: 100%;
+}
+
+#changelist table {
+ width: 100%;
+}
+
+.change-list .hiddenfields { display:none; }
+
+.change-list .filtered table {
+ border-right: none;
+}
+
+.change-list .filtered {
+ min-height: 400px;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator,
+.filtered #toolbar, .filtered div.xfull {
+ margin-right: 280px;
+ width: auto;
+}
+
+.change-list .filtered table tbody th {
+ padding-right: 1em;
+}
+
+#changelist-form .results {
+ overflow-x: auto;
+}
+
+#changelist .toplinks {
+ border-bottom: 1px solid #ddd;
+}
+
+#changelist .paginator {
+ color: #666;
+ border-bottom: 1px solid #eee;
+ background: #fff;
+ overflow: hidden;
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table thead th {
+ padding: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+#changelist table thead th.action-checkbox-column {
+ width: 1.5em;
+ text-align: center;
+}
+
+#changelist table tbody td.action-checkbox {
+ text-align: center;
+}
+
+#changelist table tfoot {
+ color: #666;
+}
+
+/* TOOLBAR */
+
+#changelist #toolbar {
+ padding: 8px 10px;
+ margin-bottom: 15px;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+ background: #f8f8f8;
+ color: #666;
+}
+
+#changelist #toolbar form input {
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 5px;
+ color: #333;
+}
+
+#changelist #toolbar form #searchbar {
+ height: 19px;
+ border: 1px solid #ccc;
+ padding: 2px 5px;
+ margin: 0;
+ vertical-align: top;
+ font-size: 13px;
+}
+
+#changelist #toolbar form #searchbar:focus {
+ border-color: #999;
+}
+
+#changelist #toolbar form input[type="submit"] {
+ border: 1px solid #ccc;
+ padding: 2px 10px;
+ margin: 0;
+ vertical-align: middle;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ color: #333;
+}
+
+#changelist #toolbar form input[type="submit"]:focus,
+#changelist #toolbar form input[type="submit"]:hover {
+ border-color: #999;
+}
+
+#changelist #changelist-search img {
+ vertical-align: middle;
+ margin-right: 4px;
+}
+
+/* FILTER COLUMN */
+
+#changelist-filter {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 1000;
+ width: 240px;
+ background: #f8f8f8;
+ border-left: none;
+ margin: 0;
+}
+
+#changelist-filter h2 {
+ font-size: 14px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ padding: 5px 15px;
+ margin-bottom: 12px;
+ border-bottom: none;
+}
+
+#changelist-filter h3 {
+ font-weight: 400;
+ font-size: 14px;
+ padding: 0 15px;
+ margin-bottom: 10px;
+}
+
+#changelist-filter ul {
+ margin: 5px 0;
+ padding: 0 15px 15px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+#changelist-filter ul:last-child {
+ border-bottom: none;
+ padding-bottom: none;
+}
+
+#changelist-filter li {
+ list-style-type: none;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+#changelist-filter a {
+ display: block;
+ color: #999;
+}
+
+#changelist-filter li.selected {
+ border-left: 5px solid #eaeaea;
+ padding-left: 10px;
+ margin-left: -15px;
+}
+
+#changelist-filter li.selected a {
+ color: #5b80b2;
+}
+
+#changelist-filter a:focus, #changelist-filter a:hover,
+#changelist-filter li.selected a:focus,
+#changelist-filter li.selected a:hover {
+ color: #036;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+ display: block;
+ float: left;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+}
+
+.change-list ul.toplinks li {
+ padding: 3px 6px;
+ font-weight: bold;
+ list-style-type: none;
+ display: inline-block;
+}
+
+.change-list ul.toplinks .date-back a {
+ color: #999;
+}
+
+.change-list ul.toplinks .date-back a:focus,
+.change-list ul.toplinks .date-back a:hover {
+ color: #036;
+}
+
+/* PAGINATOR */
+
+.paginator {
+ font-size: 13px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 22px;
+ margin: 0;
+ border-top: 1px solid #ddd;
+}
+
+.paginator a:link, .paginator a:visited {
+ padding: 2px 6px;
+ background: #79aec8;
+ text-decoration: none;
+ color: #fff;
+}
+
+.paginator a.showall {
+ padding: 0;
+ border: none;
+ background: none;
+ color: #5b80b2;
+}
+
+.paginator a.showall:focus, .paginator a.showall:hover {
+ background: none;
+ color: #036;
+}
+
+.paginator .end {
+ margin-right: 6px;
+}
+
+.paginator .this-page {
+ padding: 2px 6px;
+ font-weight: bold;
+ font-size: 13px;
+ vertical-align: top;
+}
+
+.paginator a:focus, .paginator a:hover {
+ color: white;
+ background: #036;
+}
+
+/* ACTIONS */
+
+.filtered .actions {
+ margin-right: 280px;
+ border-right: none;
+}
+
+#changelist table input {
+ margin: 0;
+ vertical-align: baseline;
+}
+
+#changelist table tbody tr.selected {
+ background-color: #FFFFCC;
+}
+
+#changelist .actions {
+ padding: 10px;
+ background: #fff;
+ border-top: none;
+ border-bottom: none;
+ line-height: 24px;
+ color: #999;
+}
+
+#changelist .actions.selected {
+ background: #fffccf;
+ border-top: 1px solid #fffee8;
+ border-bottom: 1px solid #edecd6;
+}
+
+#changelist .actions span.all,
+#changelist .actions span.action-counter,
+#changelist .actions span.clear,
+#changelist .actions span.question {
+ font-size: 13px;
+ margin: 0 0.5em;
+ display: none;
+}
+
+#changelist .actions:last-child {
+ border-bottom: none;
+}
+
+#changelist .actions select {
+ vertical-align: top;
+ height: 24px;
+ background: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 0 0 0 4px;
+ margin: 0;
+ margin-left: 10px;
+}
+
+#changelist .actions select:focus {
+ border-color: #999;
+}
+
+#changelist .actions label {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 13px;
+}
+
+#changelist .actions .button {
+ font-size: 13px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background: #fff;
+ box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
+ cursor: pointer;
+ height: 24px;
+ line-height: 1;
+ padding: 4px 8px;
+ margin: 0;
+ color: #333;
+}
+
+#changelist .actions .button:focus, #changelist .actions .button:hover {
+ border-color: #999;
+}
diff --git a/tbc/static/admin/static/admin/css/dashboard.css b/tbc/static/admin/static/admin/css/dashboard.css
new file mode 100644
index 0000000..05808bc
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/dashboard.css
@@ -0,0 +1,30 @@
+/* DASHBOARD */
+
+.dashboard .module table th {
+ width: 100%;
+}
+
+.dashboard .module table td {
+ white-space: nowrap;
+}
+
+.dashboard .module table td a {
+ display: block;
+ padding-right: .6em;
+}
+
+/* RECENT ACTIONS MODULE */
+
+.module ul.actionlist {
+ margin-left: 0;
+}
+
+ul.actionlist li {
+ list-style-type: none;
+}
+
+ul.actionlist li {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+}
diff --git a/tbc/static/admin/static/admin/css/fonts.css b/tbc/static/admin/static/admin/css/fonts.css
new file mode 100644
index 0000000..c837e01
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/fonts.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Bold-webfont.woff');
+ font-weight: 700;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Regular-webfont.woff');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url('../fonts/Roboto-Light-webfont.woff');
+ font-weight: 300;
+ font-style: normal;
+}
diff --git a/tbc/static/admin/static/admin/css/forms.css b/tbc/static/admin/static/admin/css/forms.css
new file mode 100644
index 0000000..2a21257
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/forms.css
@@ -0,0 +1,499 @@
+@import url('widgets.css');
+
+/* FORM ROWS */
+
+.form-row {
+ overflow: hidden;
+ padding: 10px;
+ font-size: 13px;
+ border-bottom: 1px solid #eee;
+}
+
+.form-row img, .form-row input {
+ vertical-align: middle;
+}
+
+.form-row label input[type="checkbox"] {
+ margin-top: 0;
+ vertical-align: 0;
+}
+
+form .form-row p {
+ padding-left: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* FORM LABELS */
+
+label {
+ font-weight: normal;
+ color: #666;
+ font-size: 13px;
+}
+
+.required label, label.required {
+ font-weight: bold;
+ color: #333;
+}
+
+/* RADIO BUTTONS */
+
+form ul.radiolist li {
+ list-style-type: none;
+}
+
+form ul.radiolist label {
+ float: none;
+ display: inline;
+}
+
+form ul.radiolist input[type="radio"] {
+ margin: -2px 4px 0 0;
+ padding: 0;
+}
+
+form ul.inline {
+ margin-left: 0;
+ padding: 0;
+}
+
+form ul.inline li {
+ float: left;
+ padding-right: 7px;
+}
+
+/* ALIGNED FIELDSETS */
+
+.aligned label {
+ display: block;
+ padding: 4px 10px 0 0;
+ float: left;
+ width: 160px;
+ word-wrap: break-word;
+ line-height: 1;
+}
+
+.aligned label:not(.vCheckboxLabel):after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 26px;
+}
+
+.aligned label + p {
+ padding: 6px 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 170px;
+}
+
+.aligned ul label {
+ display: inline;
+ float: none;
+ width: auto;
+}
+
+.aligned .form-row input {
+ margin-bottom: 0;
+}
+
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+ width: 350px;
+}
+
+form .aligned ul {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul.radiolist {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+}
+
+form .aligned p.help {
+ clear: left;
+ margin-top: 0;
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned label + p.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+form .aligned p.help:last-child {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+form .aligned input + p.help,
+form .aligned textarea + p.help,
+form .aligned select + p.help {
+ margin-left: 160px;
+ padding-left: 10px;
+}
+
+form .aligned ul li {
+ list-style: none;
+}
+
+form .aligned table p {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.aligned .vCheckboxLabel {
+ float: none;
+ width: auto;
+ display: inline-block;
+ vertical-align: -3px;
+ padding: 0 0 5px 5px;
+}
+
+.aligned .vCheckboxLabel + p.help {
+ margin-top: -4px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+ width: 610px;
+}
+
+.checkbox-row p.help {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+fieldset .field-box {
+ float: left;
+ margin-right: 20px;
+}
+
+/* WIDE FIELDSETS */
+
+.wide label {
+ width: 200px;
+}
+
+form .wide p, form .wide input + p.help {
+ margin-left: 200px;
+}
+
+form .wide p.help {
+ padding-left: 38px;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+ width: 450px;
+}
+
+/* COLLAPSED FIELDSETS */
+
+fieldset.collapsed * {
+ display: none;
+}
+
+fieldset.collapsed h2, fieldset.collapsed {
+ display: block;
+}
+
+fieldset.collapsed {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+fieldset.collapsed h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+fieldset .collapse-toggle {
+ color: #fff;
+}
+
+fieldset.collapsed .collapse-toggle {
+ background: transparent;
+ display: inline;
+ color: #447e9b;
+}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+ font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+ padding: 12px 14px;
+ margin: 0 0 20px;
+ background: #f8f8f8;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ text-align: right;
+ overflow: hidden;
+}
+
+body.popup .submit-row {
+ overflow: auto;
+}
+
+.submit-row input {
+ height: 35px;
+ line-height: 15px;
+ margin: 0 0 0 5px;
+}
+
+.submit-row input.default {
+ margin: 0 0 0 8px;
+ text-transform: uppercase;
+}
+
+.submit-row p {
+ margin: 0.3em;
+}
+
+.submit-row p.deletelink-box {
+ float: left;
+ margin: 0;
+}
+
+.submit-row a.deletelink {
+ display: block;
+ background: #ba2121;
+ border-radius: 4px;
+ padding: 10px 15px;
+ height: 15px;
+ line-height: 15px;
+ color: #fff;
+}
+
+.submit-row a.deletelink:focus,
+.submit-row a.deletelink:hover,
+.submit-row a.deletelink:active {
+ background: #a41515;
+}
+
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+ vertical-align: top;
+}
+
+.vCheckboxField {
+ border: none;
+}
+
+.vDateField, .vTimeField {
+ margin-right: 2px;
+ margin-bottom: 4px;
+}
+
+.vDateField {
+ min-width: 6.85em;
+}
+
+.vTimeField {
+ min-width: 4.7em;
+}
+
+.vURLField {
+ width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+ width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+ height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+ width: 2.2em;
+}
+
+.vTextField {
+ width: 20em;
+}
+
+.vIntegerField {
+ width: 5em;
+}
+
+.vBigIntegerField {
+ width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+ width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+ padding: 0;
+ margin: 0 0 30px;
+}
+
+.inline-group thead th {
+ padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+ width: 160px;
+}
+
+.inline-related {
+ position: relative;
+}
+
+.inline-related h3 {
+ margin: 0;
+ color: #666;
+ padding: 5px;
+ font-size: 13px;
+ background: #f8f8f8;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-related h3 span.delete {
+ float: right;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: 2px;
+ font-size: 11px;
+}
+
+.inline-related fieldset {
+ margin: 0;
+ background: #fff;
+ border: none;
+ width: 100%;
+}
+
+.inline-related fieldset.module h3 {
+ margin: 0;
+ padding: 2px 5px 3px 5px;
+ font-size: 11px;
+ text-align: left;
+ font-weight: bold;
+ background: #bcd;
+ color: #fff;
+}
+
+.inline-group .tabular fieldset.module {
+ border: none;
+}
+
+.inline-related.tabular fieldset.module table {
+ width: 100%;
+}
+
+.last-related fieldset {
+ border: none;
+}
+
+.inline-group .tabular tr.has_original td {
+ padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+ padding: 2px 0 0 0;
+ width: 0;
+ _position: relative;
+}
+
+.inline-group .tabular th.original {
+ width: 0px;
+ padding: 0;
+}
+
+.inline-group .tabular td.original p {
+ position: absolute;
+ left: 0;
+ height: 1.1em;
+ padding: 2px 9px;
+ overflow: hidden;
+ font-size: 9px;
+ font-weight: bold;
+ color: #666;
+ _width: 700px;
+}
+
+.inline-group ul.tools {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.inline-group ul.tools li {
+ display: inline;
+ padding: 0 5px;
+}
+
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+ color: #666;
+ background: #f8f8f8;
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+ padding: 8px 10px;
+ border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+ background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+ padding-left: 16px;
+ font-size: 12px;
+}
+
+.empty-form {
+ display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+ margin-left: 5px;
+ display: inline-block;
+ vertical-align: middle;
+ background-repeat: no-repeat;
+ background-size: 14px;
+}
+
+.add-another {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/icon-addlink.svg);
+}
+
+.related-lookup {
+ width: 16px;
+ height: 16px;
+ background-image: url(../img/search.svg);
+}
+
+form .related-widget-wrapper ul {
+ display: inline-block;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.clearable-file-input input {
+ margin-top: 0;
+}
diff --git a/tbc/static/admin/static/admin/css/login.css b/tbc/static/admin/static/admin/css/login.css
new file mode 100644
index 0000000..cab3bbf
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/login.css
@@ -0,0 +1,78 @@
+/* LOGIN FORM */
+
+body.login {
+ background: #f8f8f8;
+}
+
+.login #header {
+ height: auto;
+ padding: 5px 16px;
+}
+
+.login #header h1 {
+ font-size: 18px;
+}
+
+.login #header h1 a {
+ color: #fff;
+}
+
+.login #content {
+ padding: 20px 20px 0;
+}
+
+.login #container {
+ background: #fff;
+ border: 1px solid #eaeaea;
+ border-radius: 4px;
+ overflow: hidden;
+ width: 28em;
+ min-width: 300px;
+ margin: 100px auto;
+}
+
+.login #content-main {
+ width: 100%;
+}
+
+.login .form-row {
+ padding: 4px 0;
+ float: left;
+ width: 100%;
+ border-bottom: none;
+}
+
+.login .form-row label {
+ padding-right: 0.5em;
+ line-height: 2em;
+ font-size: 1em;
+ clear: both;
+ color: #333;
+}
+
+.login .form-row #id_username, .login .form-row #id_password {
+ clear: both;
+ padding: 8px;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.login span.help {
+ font-size: 10px;
+ display: block;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 0 0 9.4em;
+ margin: 0;
+ border: none;
+ background: none;
+ text-align: left;
+}
+
+.login .password-reset-link {
+ text-align: center;
+}
diff --git a/tbc/static/admin/static/admin/css/rtl.css b/tbc/static/admin/static/admin/css/rtl.css
new file mode 100644
index 0000000..8c1ceb4
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/rtl.css
@@ -0,0 +1,256 @@
+body {
+ direction: rtl;
+}
+
+/* LOGIN */
+
+.login .form-row {
+ float: right;
+}
+
+.login .form-row label {
+ float: right;
+ padding-left: 0.5em;
+ padding-right: 0;
+ text-align: left;
+}
+
+.login .submit-row {
+ clear: both;
+ padding: 1em 9.4em 0 0;
+}
+
+/* GLOBAL */
+
+th {
+ text-align: right;
+}
+
+.module h2, .module caption {
+ text-align: right;
+}
+
+.module ul, .module ol {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+.addlink, .changelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.deletelink {
+ padding-left: 0;
+ padding-right: 16px;
+ background-position: 100% 1px;
+}
+
+.object-tools {
+ float: left;
+}
+
+thead th:first-child,
+tfoot td:first-child {
+ border-left: none;
+}
+
+/* LAYOUT */
+
+#user-tools {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
+
+div.breadcrumbs {
+ text-align: right;
+}
+
+#content-main {
+ float: right;
+}
+
+#content-related {
+ float: left;
+ margin-left: -300px;
+ margin-right: auto;
+}
+
+.colMS {
+ margin-left: 300px;
+ margin-right: 0;
+}
+
+/* SORTABLE TABLES */
+
+table thead th.sorted .sortoptions {
+ float: left;
+}
+
+thead th.sorted .text {
+ padding-right: 0;
+ padding-left: 42px;
+}
+
+/* dashboard styles */
+
+.dashboard .module table td a {
+ padding-left: .6em;
+ padding-right: 16px;
+}
+
+/* changelists styles */
+
+.change-list .filtered table {
+ border-left: none;
+ border-right: 0px none;
+}
+
+#changelist-filter {
+ right: auto;
+ left: 0;
+ border-left: none;
+ border-right: none;
+}
+
+.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
+ margin-right: 0;
+ margin-left: 280px;
+}
+
+#changelist-filter li.selected {
+ border-left: none;
+ padding-left: 10px;
+ margin-left: 0;
+ border-right: 5px solid #eaeaea;
+ padding-right: 10px;
+ margin-right: -15px;
+}
+
+.filtered .actions {
+ margin-left: 280px;
+ margin-right: 0;
+}
+
+#changelist table tbody td:first-child, #changelist table tbody th:first-child {
+ border-right: none;
+ border-left: none;
+}
+
+/* FORMS */
+
+.aligned label {
+ padding: 0 0 3px 1em;
+ float: right;
+}
+
+.submit-row {
+ text-align: left
+}
+
+.submit-row p.deletelink-box {
+ float: right;
+}
+
+.submit-row input.default {
+ margin-left: 0;
+}
+
+.vDateField, .vTimeField {
+ margin-left: 2px;
+}
+
+.aligned .form-row input {
+ margin-left: 5px;
+}
+
+form ul.inline li {
+ float: right;
+ padding-right: 0;
+ padding-left: 7px;
+}
+
+input[type=submit].default, .submit-row input.default {
+ float: left;
+}
+
+fieldset .field-box {
+ float: right;
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.errorlist li {
+ background-position: 100% 12px;
+ padding: 0;
+}
+
+.errornote {
+ background-position: 100% 12px;
+ padding: 10px 12px;
+}
+
+/* WIDGETS */
+
+.calendarnav-previous {
+ top: 0;
+ left: auto;
+ right: 10px;
+}
+
+.calendarnav-next {
+ top: 0;
+ right: auto;
+ left: 10px;
+}
+
+.calendar caption, .calendarbox h2 {
+ text-align: center;
+}
+
+.selector {
+ float: right;
+}
+
+.selector .selector-filter {
+ text-align: right;
+}
+
+.inline-deletelink {
+ float: left;
+}
+
+form .form-row p.datetime {
+ overflow: hidden;
+}
+
+/* MISC */
+
+.inline-related h2, .inline-group h2 {
+ text-align: right
+}
+
+.inline-related h3 span.delete {
+ padding-right: 20px;
+ padding-left: inherit;
+ left: 10px;
+ right: inherit;
+ float:left;
+}
+
+.inline-related h3 span.delete label {
+ margin-left: inherit;
+ margin-right: 2px;
+}
+
+/* IE7 specific bug fixes */
+
+div.colM {
+ position: relative;
+}
+
+.submit-row input {
+ float: left;
+}
diff --git a/tbc/static/admin/static/admin/css/widgets.css b/tbc/static/admin/static/admin/css/widgets.css
new file mode 100644
index 0000000..d3bd67a
--- /dev/null
+++ b/tbc/static/admin/static/admin/css/widgets.css
@@ -0,0 +1,565 @@
+/* SELECTOR (FILTER INTERFACE) */
+
+.selector {
+ width: 800px;
+ float: left;
+}
+
+.selector select {
+ width: 380px;
+ height: 17.2em;
+}
+
+.selector-available, .selector-chosen {
+ float: left;
+ width: 380px;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.selector-chosen select {
+ border-top: none;
+}
+
+.selector-available h2, .selector-chosen h2 {
+ border: 1px solid #ccc;
+ border-radius: 4px 4px 0 0;
+}
+
+.selector-chosen h2 {
+ background: #79aec8;
+ color: #fff;
+}
+
+.selector .selector-available h2 {
+ background: #f8f8f8;
+ color: #666;
+}
+
+.selector .selector-filter {
+ background: white;
+ border: 1px solid #ccc;
+ border-width: 0 1px;
+ padding: 8px;
+ color: #999;
+ font-size: 10px;
+ margin: 0;
+ text-align: left;
+}
+
+.selector .selector-filter label,
+.inline-group .aligned .selector .selector-filter label {
+ float: left;
+ margin: 7px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+ overflow: hidden;
+ line-height: 1;
+}
+
+.selector .selector-available input {
+ width: 320px;
+ margin-left: 8px;
+}
+
+.selector ul.selector-chooser {
+ float: left;
+ width: 22px;
+ background-color: #eee;
+ border-radius: 10px;
+ margin: 10em 5px 0 5px;
+ padding: 0;
+}
+
+.selector-chooser li {
+ margin: 0;
+ padding: 3px;
+ list-style-type: none;
+}
+
+.selector select {
+ padding: 0 10px;
+ margin: 0 0 10px;
+ border-radius: 0 0 4px 4px;
+}
+
+.selector-add, .selector-remove {
+ width: 16px;
+ height: 16px;
+ display: block;
+ text-indent: -3000px;
+ overflow: hidden;
+ cursor: default;
+ opacity: 0.3;
+}
+
+.active.selector-add, .active.selector-remove {
+ opacity: 1;
+}
+
+.active.selector-add:hover, .active.selector-remove:hover {
+ cursor: pointer;
+}
+
+.selector-add {
+ background: url(../img/selector-icons.svg) 0 -96px no-repeat;
+}
+
+.active.selector-add:focus, .active.selector-add:hover {
+ background-position: 0 -112px;
+}
+
+.selector-remove {
+ background: url(../img/selector-icons.svg) 0 -64px no-repeat;
+}
+
+.active.selector-remove:focus, .active.selector-remove:hover {
+ background-position: 0 -80px;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ display: inline-block;
+ height: 16px;
+ text-align: left;
+ margin: 1px auto 3px;
+ overflow: hidden;
+ font-weight: bold;
+ line-height: 16px;
+ color: #666;
+ text-decoration: none;
+ opacity: 0.3;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ color: #447e9b;
+}
+
+a.active.selector-chooseall, a.active.selector-clearall {
+ opacity: 1;
+}
+
+a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
+ cursor: pointer;
+}
+
+a.selector-chooseall {
+ padding: 0 18px 0 0;
+ background: url(../img/selector-icons.svg) right -160px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
+ background-position: 100% -176px;
+}
+
+a.selector-clearall {
+ padding: 0 0 0 18px;
+ background: url(../img/selector-icons.svg) 0 -128px no-repeat;
+ cursor: default;
+}
+
+a.active.selector-clearall:focus, a.active.selector-clearall:hover {
+ background-position: 0 -144px;
+}
+
+/* STACKED SELECTORS */
+
+.stacked {
+ float: left;
+ width: 490px;
+}
+
+.stacked select {
+ width: 480px;
+ height: 10.1em;
+}
+
+.stacked .selector-available, .stacked .selector-chosen {
+ width: 480px;
+}
+
+.stacked .selector-available {
+ margin-bottom: 0;
+}
+
+.stacked .selector-available input {
+ width: 422px;
+}
+
+.stacked ul.selector-chooser {
+ height: 22px;
+ width: 50px;
+ margin: 0 0 10px 40%;
+ background-color: #eee;
+ border-radius: 10px;
+}
+
+.stacked .selector-chooser li {
+ float: left;
+ padding: 3px 3px 3px 5px;
+}
+
+.stacked .selector-chooseall, .stacked .selector-clearall {
+ display: none;
+}
+
+.stacked .selector-add {
+ background: url(../img/selector-icons.svg) 0 -32px no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-add {
+ background-position: 0 -48px;
+ cursor: pointer;
+}
+
+.stacked .selector-remove {
+ background: url(../img/selector-icons.svg) 0 0 no-repeat;
+ cursor: default;
+}
+
+.stacked .active.selector-remove {
+ background-position: 0 -16px;
+ cursor: pointer;
+}
+
+.selector .help-icon {
+ background: url(../img/icon-unknown.svg) 0 0 no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 2px;
+ width: 13px;
+ height: 13px;
+}
+
+.selector .selector-chosen .help-icon {
+ background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat;
+}
+
+.selector .search-label-icon {
+ background: url(../img/search.svg) 0 0 no-repeat;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+}
+
+/* DATE AND TIME */
+
+p.datetime {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-weight: bold;
+}
+
+.datetime span {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 11px;
+ color: #ccc;
+}
+
+.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ min-width: 0;
+ margin-left: 5px;
+ margin-bottom: 4px;
+}
+
+table p.datetime {
+ font-size: 11px;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+}
+
+.datetimeshortcuts .clock-icon {
+ background: url(../img/icon-clock.svg) 0 0 no-repeat;
+}
+
+.datetimeshortcuts a:focus .clock-icon,
+.datetimeshortcuts a:hover .clock-icon {
+ background-position: 0 -16px;
+}
+
+.datetimeshortcuts .date-icon {
+ background: url(../img/icon-calendar.svg) 0 0 no-repeat;
+ top: -1px;
+}
+
+.datetimeshortcuts a:focus .date-icon,
+.datetimeshortcuts a:hover .date-icon {
+ background-position: 0 -16px;
+}
+
+.timezonewarning {
+ font-size: 11px;
+ color: #999;
+}
+
+/* URL */
+
+p.url {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.url a {
+ font-weight: normal;
+}
+
+/* FILE UPLOADS */
+
+p.file-upload {
+ line-height: 20px;
+ margin: 0;
+ padding: 0;
+ color: #666;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.aligned p.file-upload {
+ margin-left: 170px;
+}
+
+.file-upload a {
+ font-weight: normal;
+}
+
+.file-upload .deletelink {
+ margin-left: 5px;
+}
+
+span.clearable-file-input label {
+ color: #333;
+ font-size: 11px;
+ display: inline;
+ float: none;
+}
+
+/* CALENDARS & CLOCKS */
+
+.calendarbox, .clockbox {
+ margin: 5px auto;
+ font-size: 12px;
+ width: 19em;
+ text-align: center;
+ background: white;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+ overflow: hidden;
+ position: relative;
+}
+
+.clockbox {
+ width: auto;
+}
+
+.calendar {
+ margin: 0;
+ padding: 0;
+}
+
+.calendar table {
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+ background: white;
+ width: 100%;
+}
+
+.calendar caption, .calendarbox h2 {
+ margin: 0;
+ text-align: center;
+ border-top: none;
+ background: #f5dd5d;
+ font-weight: 700;
+ font-size: 12px;
+ color: #333;
+}
+
+.calendar th {
+ padding: 8px 5px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #ddd;
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ color: #666;
+}
+
+.calendar td {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ padding: 0;
+ border-top: 1px solid #eee;
+ border-bottom: none;
+}
+
+.calendar td.selected a {
+ background: #79aec8;
+ color: #fff;
+}
+
+.calendar td.nonday {
+ background: #f8f8f8;
+}
+
+.calendar td.today a {
+ font-weight: 700;
+}
+
+.calendar td a, .timelist a {
+ display: block;
+ font-weight: 400;
+ padding: 6px;
+ text-decoration: none;
+ color: #444;
+}
+
+.calendar td a:focus, .timelist a:focus,
+.calendar td a:hover, .timelist a:hover {
+ background: #79aec8;
+ color: white;
+}
+
+.calendar td a:active, .timelist a:active {
+ background: #417690;
+ color: white;
+}
+
+.calendarnav {
+ font-size: 10px;
+ text-align: center;
+ color: #ccc;
+ margin: 0;
+ padding: 1px 3px;
+}
+
+.calendarnav a:link, #calendarnav a:visited,
+#calendarnav a:focus, #calendarnav a:hover {
+ color: #999;
+}
+
+.calendar-shortcuts {
+ background: white;
+ font-size: 11px;
+ line-height: 11px;
+ border-top: 1px solid #eee;
+ padding: 8px 0;
+ color: #ccc;
+}
+
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
+ display: block;
+ position: absolute;
+ top: 8px;
+ width: 15px;
+ height: 15px;
+ text-indent: -9999px;
+ padding: 0;
+}
+
+.calendarnav-previous {
+ left: 10px;
+ background: url(../img/calendar-icons.svg) 0 0 no-repeat;
+}
+
+.calendarbox .calendarnav-previous:focus,
+.calendarbox .calendarnav-previous:hover {
+ background-position: 0 -15px;
+}
+
+.calendarnav-next {
+ right: 10px;
+ background: url(../img/calendar-icons.svg) 0 -30px no-repeat;
+}
+
+.calendarbox .calendarnav-next:focus,
+.calendarbox .calendarnav-next:hover {
+ background-position: 0 -45px;
+}
+
+.calendar-cancel {
+ margin: 0;
+ padding: 4px 0;
+ font-size: 12px;
+ background: #eee;
+ border-top: 1px solid #ddd;
+ color: #333;
+}
+
+.calendar-cancel:focus, .calendar-cancel:hover {
+ background: #ddd;
+}
+
+.calendar-cancel a {
+ color: black;
+ display: block;
+}
+
+ul.timelist, .timelist li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.timelist a {
+ padding: 2px;
+}
+
+/* EDIT INLINE */
+
+.inline-deletelink {
+ float: right;
+ text-indent: -9999px;
+ background: url(../img/inline-delete.svg) 0 0 no-repeat;
+ width: 16px;
+ height: 16px;
+ border: 0px none;
+}
+
+.inline-deletelink:focus, .inline-deletelink:hover {
+ cursor: pointer;
+}
+
+/* RELATED WIDGET WRAPPER */
+.related-widget-wrapper {
+ float: left; /* display properly in form rows with multiple fields */
+ overflow: hidden; /* clear floated contents */
+}
+
+.related-widget-wrapper-link {
+ opacity: 0.3;
+}
+
+.related-widget-wrapper-link:link {
+ opacity: .8;
+}
+
+.related-widget-wrapper-link:link:focus,
+.related-widget-wrapper-link:link:hover {
+ opacity: 1;
+}
+
+select + .related-widget-wrapper-link,
+.related-widget-wrapper-link + .related-widget-wrapper-link {
+ margin-left: 7px;
+}
diff --git a/tbc/static/admin/static/admin/fonts/LICENSE.txt b/tbc/static/admin/static/admin/fonts/LICENSE.txt
new file mode 100755
index 0000000..75b5248
--- /dev/null
+++ b/tbc/static/admin/static/admin/fonts/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/tbc/static/admin/static/admin/fonts/README.txt b/tbc/static/admin/static/admin/fonts/README.txt
new file mode 100644
index 0000000..cc2135a
--- /dev/null
+++ b/tbc/static/admin/static/admin/fonts/README.txt
@@ -0,0 +1,2 @@
+Roboto webfont source: https://www.google.com/fonts/specimen/Roboto
+Weights used in this project: Light (300), Regular (400), Bold (700)
diff --git a/tbc/static/admin/static/admin/fonts/Roboto-Bold-webfont.woff b/tbc/static/admin/static/admin/fonts/Roboto-Bold-webfont.woff
new file mode 100644
index 0000000..03357ce
--- /dev/null
+++ b/tbc/static/admin/static/admin/fonts/Roboto-Bold-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/static/admin/fonts/Roboto-Light-webfont.woff b/tbc/static/admin/static/admin/fonts/Roboto-Light-webfont.woff
new file mode 100644
index 0000000..f6abd87
--- /dev/null
+++ b/tbc/static/admin/static/admin/fonts/Roboto-Light-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/static/admin/fonts/Roboto-Regular-webfont.woff b/tbc/static/admin/static/admin/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..6ff6afd
--- /dev/null
+++ b/tbc/static/admin/static/admin/fonts/Roboto-Regular-webfont.woff
Binary files differ
diff --git a/tbc/static/admin/static/admin/img/LICENSE b/tbc/static/admin/static/admin/img/LICENSE
new file mode 100644
index 0000000..a4faaa1
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Code Charm Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tbc/static/admin/static/admin/img/README.txt b/tbc/static/admin/static/admin/img/README.txt
new file mode 100644
index 0000000..43373ad
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/README.txt
@@ -0,0 +1,7 @@
+All icons are taken from Font Awesome (http://fontawesome.io/) project.
+The Font Awesome font is licensed under the SIL OFL 1.1:
+- http://scripts.sil.org/OFL
+
+SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
+Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
+in current folder).
diff --git a/tbc/static/admin/static/admin/img/calendar-icons.svg b/tbc/static/admin/static/admin/img/calendar-icons.svg
new file mode 100644
index 0000000..dbf21c3
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/calendar-icons.svg
@@ -0,0 +1,14 @@
+<svg width="15" height="60" viewBox="0 0 1792 7168" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="previous">
+ <path d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="next">
+ <path d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#previous" x="0" y="0" fill="#333333" />
+ <use xlink:href="#previous" x="0" y="1792" fill="#000000" />
+ <use xlink:href="#next" x="0" y="3584" fill="#333333" />
+ <use xlink:href="#next" x="0" y="5376" fill="#000000" />
+</svg>
diff --git a/tbc/static/admin/static/admin/img/gis/move_vertex_off.svg b/tbc/static/admin/static/admin/img/gis/move_vertex_off.svg
new file mode 100644
index 0000000..228854f
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/gis/move_vertex_off.svg
@@ -0,0 +1 @@
+<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file
diff --git a/tbc/static/admin/static/admin/img/gis/move_vertex_on.svg b/tbc/static/admin/static/admin/img/gis/move_vertex_on.svg
new file mode 100644
index 0000000..96b87fd
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/gis/move_vertex_on.svg
@@ -0,0 +1 @@
+<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file
diff --git a/tbc/static/admin/static/admin/img/icon-addlink.svg b/tbc/static/admin/static/admin/img/icon-addlink.svg
new file mode 100644
index 0000000..e004fb1
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-addlink.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#70bf2b" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-alert.svg b/tbc/static/admin/static/admin/img/icon-alert.svg
new file mode 100644
index 0000000..e51ea83
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-alert.svg
@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#efb80b" d="M1024 1375v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-calendar.svg b/tbc/static/admin/static/admin/img/icon-calendar.svg
new file mode 100644
index 0000000..97910a9
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-calendar.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="icon">
+ <path d="M192 1664h288v-288h-288v288zm352 0h320v-288h-320v288zm-352-352h288v-320h-288v320zm352 0h320v-320h-320v320zm-352-384h288v-288h-288v288zm736 736h320v-288h-320v288zm-384-736h320v-288h-320v288zm768 736h288v-288h-288v288zm-384-352h320v-320h-320v320zm-352-864v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm736 864h288v-320h-288v320zm-384-384h320v-288h-320v288zm384 0h288v-288h-288v288zm32-480v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z"/>
+ </g>
+ </defs>
+ <use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
+ <use xlink:href="#icon" x="0" y="1792" fill="#003366" />
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-changelink.svg b/tbc/static/admin/static/admin/img/icon-changelink.svg
new file mode 100644
index 0000000..bbb137a
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-changelink.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#efb80b" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-clock.svg b/tbc/static/admin/static/admin/img/icon-clock.svg
new file mode 100644
index 0000000..bf9985d
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-clock.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="icon">
+ <path d="M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#icon" x="0" y="0" fill="#447e9b" />
+ <use xlink:href="#icon" x="0" y="1792" fill="#003366" />
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-deletelink.svg b/tbc/static/admin/static/admin/img/icon-deletelink.svg
new file mode 100644
index 0000000..4059b15
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-deletelink.svg
@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#dd4646" d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-no.svg b/tbc/static/admin/static/admin/img/icon-no.svg
new file mode 100644
index 0000000..2e0d383
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-no.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-unknown-alt.svg b/tbc/static/admin/static/admin/img/icon-unknown-alt.svg
new file mode 100644
index 0000000..1c6b99f
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-unknown-alt.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-unknown.svg b/tbc/static/admin/static/admin/img/icon-unknown.svg
new file mode 100644
index 0000000..50b4f97
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-unknown.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#666666" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/icon-yes.svg b/tbc/static/admin/static/admin/img/icon-yes.svg
new file mode 100644
index 0000000..5883d87
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/icon-yes.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/inline-delete.svg b/tbc/static/admin/static/admin/img/inline-delete.svg
new file mode 100644
index 0000000..17d1ad6
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/inline-delete.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/search.svg b/tbc/static/admin/static/admin/img/search.svg
new file mode 100644
index 0000000..c8c69b2
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/search.svg
@@ -0,0 +1,3 @@
+<svg width="15" height="15" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#555555" d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/selector-icons.svg b/tbc/static/admin/static/admin/img/selector-icons.svg
new file mode 100644
index 0000000..926b8e2
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/selector-icons.svg
@@ -0,0 +1,34 @@
+<svg width="16" height="192" viewBox="0 0 1792 21504" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="up">
+ <path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="down">
+ <path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="left">
+ <path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="right">
+ <path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="clearall">
+ <path transform="translate(336, 336) scale(0.75)" d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ <g id="chooseall">
+ <path transform="translate(336, 336) scale(0.75)" d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
+ </g>
+ </defs>
+ <use xlink:href="#up" x="0" y="0" fill="#666666" />
+ <use xlink:href="#up" x="0" y="1792" fill="#447e9b" />
+ <use xlink:href="#down" x="0" y="3584" fill="#666666" />
+ <use xlink:href="#down" x="0" y="5376" fill="#447e9b" />
+ <use xlink:href="#left" x="0" y="7168" fill="#666666" />
+ <use xlink:href="#left" x="0" y="8960" fill="#447e9b" />
+ <use xlink:href="#right" x="0" y="10752" fill="#666666" />
+ <use xlink:href="#right" x="0" y="12544" fill="#447e9b" />
+ <use xlink:href="#clearall" x="0" y="14336" fill="#666666" />
+ <use xlink:href="#clearall" x="0" y="16128" fill="#447e9b" />
+ <use xlink:href="#chooseall" x="0" y="17920" fill="#666666" />
+ <use xlink:href="#chooseall" x="0" y="19712" fill="#447e9b" />
+</svg>
diff --git a/tbc/static/admin/static/admin/img/sorting-icons.svg b/tbc/static/admin/static/admin/img/sorting-icons.svg
new file mode 100644
index 0000000..7c31ec9
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/sorting-icons.svg
@@ -0,0 +1,19 @@
+<svg width="14" height="84" viewBox="0 0 1792 10752" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="sort">
+ <path d="M1408 1088q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45zm0-384q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
+ </g>
+ <g id="ascending">
+ <path d="M1408 1216q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/>
+ </g>
+ <g id="descending">
+ <path d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/>
+ </g>
+ </defs>
+ <use xlink:href="#sort" x="0" y="0" fill="#999999" />
+ <use xlink:href="#sort" x="0" y="1792" fill="#447e9b" />
+ <use xlink:href="#ascending" x="0" y="3584" fill="#999999" />
+ <use xlink:href="#ascending" x="0" y="5376" fill="#447e9b" />
+ <use xlink:href="#descending" x="0" y="7168" fill="#999999" />
+ <use xlink:href="#descending" x="0" y="8960" fill="#447e9b" />
+</svg>
diff --git a/tbc/static/admin/static/admin/img/tooltag-add.svg b/tbc/static/admin/static/admin/img/tooltag-add.svg
new file mode 100644
index 0000000..1ca64ae
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/tooltag-add.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/img/tooltag-arrowright.svg b/tbc/static/admin/static/admin/img/tooltag-arrowright.svg
new file mode 100644
index 0000000..b664d61
--- /dev/null
+++ b/tbc/static/admin/static/admin/img/tooltag-arrowright.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ffffff" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45l166-166q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/>
+</svg>
diff --git a/tbc/static/admin/static/admin/js/SelectBox.js b/tbc/static/admin/static/admin/js/SelectBox.js
new file mode 100644
index 0000000..95825d8
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/SelectBox.js
@@ -0,0 +1,135 @@
+(function() {
+ 'use strict';
+ var SelectBox = {
+ cache: {},
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = [];
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = box.options.length; i < j; i++) {
+ node = box.options[i];
+ cache.push({value: node.value, text: node.text, displayed: 1});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+ var node;
+ box.options.length = 0; // clear all options
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.displayed) {
+ var new_option = new Option(node.text, node.value, false, false);
+ // Shows a tooltip when hovering over the option
+ new_option.setAttribute("title", node.text);
+ box.options[box.options.length] = new_option;
+ }
+ }
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ node.displayed = 1;
+ var numTokens = tokens.length;
+ for (var k = 0; k < numTokens; k++) {
+ token = tokens[k];
+ if (node.text.toLowerCase().indexOf(token) === -1) {
+ node.displayed = 0;
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ delete_index = i;
+ break;
+ }
+ }
+ var k = cache.length - 1;
+ for (i = delete_index; i < k; i++) {
+ cache[i] = cache[i + 1];
+ }
+ cache.length--;
+ },
+ add_to_cache: function(id, option) {
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ var cache = SelectBox.cache[id];
+ for (var i = 0, j = cache.length; i < j; i++) {
+ node = cache[i];
+ if (node.value === value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ for (var i = 0, j = boxOptions.length; i < j; i++) {
+ option = boxOptions[i];
+ if (option.selected && SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var option;
+ var boxOptions = from_box.options;
+ for (var i = 0, j = boxOptions.length; i < j; i++) {
+ option = boxOptions[i];
+ if (SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort(function(a, b) {
+ a = a.text.toLowerCase();
+ b = b.text.toLowerCase();
+ try {
+ if (a > b) {
+ return 1;
+ }
+ if (a < b) {
+ return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ for (var i = 0; i < box.options.length; i++) {
+ box.options[i].selected = 'selected';
+ }
+ }
+ };
+ window.SelectBox = SelectBox;
+})();
diff --git a/tbc/static/admin/static/admin/js/SelectFilter2.js b/tbc/static/admin/static/admin/js/SelectFilter2.js
new file mode 100644
index 0000000..acf3996
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/SelectFilter2.js
@@ -0,0 +1,198 @@
+/*global SelectBox, addEvent, gettext, interpolate, quickElement, SelectFilter*/
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Requires core.js, SelectBox.js and addevent.js.
+*/
+(function($) {
+ 'use strict';
+ function findForm(node) {
+ // returns the node of the form containing the given node
+ if (node.tagName.toLowerCase() !== 'form') {
+ return findForm(node.parentNode);
+ }
+ return node;
+ }
+
+ window.SelectFilter = {
+ init: function(field_id, field_name, is_stacked) {
+ if (field_id.match(/__prefix__/)) {
+ // Don't initialize on empty forms.
+ return;
+ }
+ var from_box = document.getElementById(field_id);
+ from_box.id += '_from'; // change its ID
+ from_box.className = 'filtered';
+
+ var ps = from_box.parentNode.getElementsByTagName('p');
+ for (var i = 0; i < ps.length; i++) {
+ if (ps[i].className.indexOf("info") !== -1) {
+ // Remove <p class="info">, because it just gets in the way.
+ from_box.parentNode.removeChild(ps[i]);
+ } else if (ps[i].className.indexOf("help") !== -1) {
+ // Move help text up to the top so it isn't below the select
+ // boxes or wrapped off on the side to the right of the add
+ // button:
+ from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
+ }
+ }
+
+ // <div class="selector"> or <div class="selector stacked">
+ var selector_div = quickElement('div', from_box.parentNode);
+ selector_div.className = is_stacked ? 'selector stacked' : 'selector';
+
+ // <div class="selector-available">
+ var selector_available = quickElement('div', selector_div);
+ selector_available.className = 'selector-available';
+ var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
+ quickElement(
+ 'span', title_available, '',
+ 'class', 'help help-tooltip help-icon',
+ 'title', interpolate(
+ gettext(
+ 'This is the list of available %s. You may choose some by ' +
+ 'selecting them in the box below and then clicking the ' +
+ '"Choose" arrow between the two boxes.'
+ ),
+ [field_name]
+ )
+ );
+
+ var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
+ filter_p.className = 'selector-filter';
+
+ var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input');
+
+ quickElement(
+ 'span', search_filter_label, '',
+ 'class', 'help-tooltip search-label-icon',
+ 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])
+ );
+
+ filter_p.appendChild(document.createTextNode(' '));
+
+ var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
+ filter_input.id = field_id + '_input';
+
+ selector_available.appendChild(from_box);
+ var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript:void(0);', 'id', field_id + '_add_all_link');
+ choose_all.className = 'selector-chooseall';
+
+ // <ul class="selector-chooser">
+ var selector_chooser = quickElement('ul', selector_div);
+ selector_chooser.className = 'selector-chooser';
+ var add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript:void(0);', 'id', field_id + '_add_link');
+ add_link.className = 'selector-add';
+ var remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript:void(0);', 'id', field_id + '_remove_link');
+ remove_link.className = 'selector-remove';
+
+ // <div class="selector-chosen">
+ var selector_chosen = quickElement('div', selector_div);
+ selector_chosen.className = 'selector-chosen';
+ var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
+ quickElement(
+ 'span', title_chosen, '',
+ 'class', 'help help-tooltip help-icon',
+ 'title', interpolate(
+ gettext(
+ 'This is the list of chosen %s. You may remove some by ' +
+ 'selecting them in the box below and then clicking the ' +
+ '"Remove" arrow between the two boxes.'
+ ),
+ [field_name]
+ )
+ );
+
+ var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
+ to_box.className = 'filtered';
+ var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript:void(0);', 'id', field_id + '_remove_all_link');
+ clear_all.className = 'selector-clearall';
+
+ from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+
+ // Set up the JavaScript event handlers for the select box filter interface
+ addEvent(choose_all, 'click', function() { SelectBox.move_all(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(add_link, 'click', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(remove_link, 'click', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(clear_all, 'click', function() { SelectBox.move_all(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(filter_input, 'keypress', function(e) { SelectFilter.filter_key_press(e, field_id); });
+ addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
+ addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
+ addEvent(from_box, 'change', function(e) { SelectFilter.refresh_icons(field_id); });
+ addEvent(to_box, 'change', function(e) { SelectFilter.refresh_icons(field_id); });
+ addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
+ addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
+ addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
+ SelectBox.init(field_id + '_from');
+ SelectBox.init(field_id + '_to');
+ // Move selected from_box options to to_box
+ SelectBox.move(field_id + '_from', field_id + '_to');
+
+ if (!is_stacked) {
+ // In horizontal mode, give the same height to the two boxes.
+ var j_from_box = $(from_box);
+ var j_to_box = $(to_box);
+ var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); };
+ if (j_from_box.outerHeight() > 0) {
+ resize_filters(); // This fieldset is already open. Resize now.
+ } else {
+ // This fieldset is probably collapsed. Wait for its 'show' event.
+ j_to_box.closest('fieldset').one('show.fieldset', resize_filters);
+ }
+ }
+
+ // Initial icon refresh
+ SelectFilter.refresh_icons(field_id);
+ },
+ refresh_icons: function(field_id) {
+ var from = $('#' + field_id + '_from');
+ var to = $('#' + field_id + '_to');
+ var is_from_selected = from.find('option:selected').length > 0;
+ var is_to_selected = to.find('option:selected').length > 0;
+ // Active if at least one item is selected
+ $('#' + field_id + '_add_link').toggleClass('active', is_from_selected);
+ $('#' + field_id + '_remove_link').toggleClass('active', is_to_selected);
+ // Active if the corresponding box isn't empty
+ $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0);
+ $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0);
+ },
+ filter_key_press: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // don't submit form if user pressed Enter
+ if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
+ from.selectedIndex = 0;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = 0;
+ event.preventDefault();
+ return false;
+ }
+ },
+ filter_key_up: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ var temp = from.selectedIndex;
+ SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+ from.selectedIndex = temp;
+ return true;
+ },
+ filter_key_down: function(event, field_id) {
+ var from = document.getElementById(field_id + '_from');
+ // right arrow -- move across
+ if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) {
+ var old_index = from.selectedIndex;
+ SelectBox.move(field_id + '_from', field_id + '_to');
+ from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index;
+ return false;
+ }
+ // down arrow -- wrap around
+ if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
+ from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+ }
+ // up arrow -- wrap around
+ if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
+ from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
+ }
+ return true;
+ }
+ };
+
+})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/actions.js b/tbc/static/admin/static/admin/js/actions.js
new file mode 100644
index 0000000..95e8492
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/actions.js
@@ -0,0 +1,146 @@
+/*global _actions_icnt, gettext, interpolate, ngettext*/
+(function($) {
+ 'use strict';
+ var lastChecked;
+
+ $.fn.actions = function(opts) {
+ var options = $.extend({}, $.fn.actions.defaults, opts);
+ var actionCheckboxes = $(this);
+ var list_editable_changed = false;
+ var showQuestion = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).show();
+ $(options.allContainer).hide();
+ },
+ showClear = function() {
+ $(options.acrossClears).show();
+ $(options.acrossQuestions).hide();
+ $(options.actionContainer).toggleClass(options.selectedClass);
+ $(options.allContainer).show();
+ $(options.counterContainer).hide();
+ },
+ reset = function() {
+ $(options.acrossClears).hide();
+ $(options.acrossQuestions).hide();
+ $(options.allContainer).hide();
+ $(options.counterContainer).show();
+ },
+ clearAcross = function() {
+ reset();
+ $(options.acrossInput).val(0);
+ $(options.actionContainer).removeClass(options.selectedClass);
+ },
+ checker = function(checked) {
+ if (checked) {
+ showQuestion();
+ } else {
+ reset();
+ }
+ $(actionCheckboxes).prop("checked", checked)
+ .parent().parent().toggleClass(options.selectedClass, checked);
+ },
+ updateCounter = function() {
+ var sel = $(actionCheckboxes).filter(":checked").length;
+ // _actions_icnt is defined in the generated HTML
+ // and contains the total amount of objects in the queryset
+ $(options.counterContainer).html(interpolate(
+ ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
+ sel: sel,
+ cnt: _actions_icnt
+ }, true));
+ $(options.allToggle).prop("checked", function() {
+ var value;
+ if (sel === actionCheckboxes.length) {
+ value = true;
+ showQuestion();
+ } else {
+ value = false;
+ clearAcross();
+ }
+ return value;
+ });
+ };
+ // Show counter by default
+ $(options.counterContainer).show();
+ // Check state of checkboxes and reinit state if needed
+ $(this).filter(":checked").each(function(i) {
+ $(this).parent().parent().toggleClass(options.selectedClass);
+ updateCounter();
+ if ($(options.acrossInput).val() === 1) {
+ showClear();
+ }
+ });
+ $(options.allToggle).show().click(function() {
+ checker($(this).prop("checked"));
+ updateCounter();
+ });
+ $("a", options.acrossQuestions).click(function(event) {
+ event.preventDefault();
+ $(options.acrossInput).val(1);
+ showClear();
+ });
+ $("a", options.acrossClears).click(function(event) {
+ event.preventDefault();
+ $(options.allToggle).prop("checked", false);
+ clearAcross();
+ checker(0);
+ updateCounter();
+ });
+ lastChecked = null;
+ $(actionCheckboxes).click(function(event) {
+ if (!event) { event = window.event; }
+ var target = event.target ? event.target : event.srcElement;
+ if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) {
+ var inrange = false;
+ $(lastChecked).prop("checked", target.checked)
+ .parent().parent().toggleClass(options.selectedClass, target.checked);
+ $(actionCheckboxes).each(function() {
+ if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) {
+ inrange = (inrange) ? false : true;
+ }
+ if (inrange) {
+ $(this).prop("checked", target.checked)
+ .parent().parent().toggleClass(options.selectedClass, target.checked);
+ }
+ });
+ }
+ $(target).parent().parent().toggleClass(options.selectedClass, target.checked);
+ lastChecked = target;
+ updateCounter();
+ });
+ $('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() {
+ list_editable_changed = true;
+ });
+ $('form#changelist-form button[name="index"]').click(function(event) {
+ if (list_editable_changed) {
+ return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
+ }
+ });
+ $('form#changelist-form input[name="_save"]').click(function(event) {
+ var action_changed = false;
+ $('select option:selected', options.actionContainer).each(function() {
+ if ($(this).val()) {
+ action_changed = true;
+ }
+ });
+ if (action_changed) {
+ if (list_editable_changed) {
+ return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action."));
+ } else {
+ return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."));
+ }
+ }
+ });
+ };
+ /* Setup plugin defaults */
+ $.fn.actions.defaults = {
+ actionContainer: "div.actions",
+ counterContainer: "span.action-counter",
+ allContainer: "div.actions span.all",
+ acrossInput: "div.actions input.select-across",
+ acrossQuestions: "div.actions span.question",
+ acrossClears: "div.actions span.clear",
+ allToggle: "#action-toggle",
+ selectedClass: "selected"
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/actions.min.js b/tbc/static/admin/static/admin/js/actions.min.js
new file mode 100644
index 0000000..d0e87bc
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/actions.min.js
@@ -0,0 +1,6 @@
+(function(a){var f;a.fn.actions=function(q){var b=a.extend({},a.fn.actions.defaults,q),g=a(this),e=!1,k=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},l=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},m=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},n=function(){m();
+a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},p=function(c){c?k():m();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,k()):(a=!1,n());return a})};a(b.counterContainer).show();a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);
+h();1===a(b.acrossInput).val()&&l()});a(b.allToggle).show().click(function(){p(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);l()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);n();p(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&&a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,
+d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){e=!0});a('form#changelist-form button[name="index"]').click(function(a){if(e)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});
+a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return e?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};
+a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/admin/DateTimeShortcuts.js b/tbc/static/admin/static/admin/js/admin/DateTimeShortcuts.js
new file mode 100644
index 0000000..d0acc23
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/admin/DateTimeShortcuts.js
@@ -0,0 +1,364 @@
+/*global addEvent, Calendar, cancelEventPropagation, findPosX, findPosY, getStyle, get_format, gettext, interpolate, ngettext, quickElement, removeEvent*/
+// Inserts shortcut buttons after all of the following:
+// <input type="text" class="vDateField">
+// <input type="text" class="vTimeField">
+(function() {
+ 'use strict';
+ var DateTimeShortcuts = {
+ calendars: [],
+ calendarInputs: [],
+ clockInputs: [],
+ dismissClockFunc: [],
+ dismissCalendarFunc: [],
+ calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
+ calendarDivName2: 'calendarin', // name of <div> that contains calendar
+ calendarLinkName: 'calendarlink',// name of the link that is used to toggle
+ clockDivName: 'clockbox', // name of clock <div> that gets toggled
+ clockLinkName: 'clocklink', // name of the link that is used to toggle
+ shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
+ timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
+ timezoneOffset: 0,
+ init: function() {
+ var body = document.getElementsByTagName('body')[0];
+ var serverOffset = body.getAttribute('data-admin-utc-offset');
+ if (serverOffset !== undefined) {
+ var localOffset = new Date().getTimezoneOffset() * -60;
+ DateTimeShortcuts.timezoneOffset = localOffset - serverOffset;
+ }
+
+ var inputs = document.getElementsByTagName('input');
+ for (var i = 0; i < inputs.length; i++) {
+ var inp = inputs[i];
+ if (inp.getAttribute('type') === 'text' && inp.className.match(/vTimeField/)) {
+ DateTimeShortcuts.addClock(inp);
+ DateTimeShortcuts.addTimezoneWarning(inp);
+ }
+ else if (inp.getAttribute('type') === 'text' && inp.className.match(/vDateField/)) {
+ DateTimeShortcuts.addCalendar(inp);
+ DateTimeShortcuts.addTimezoneWarning(inp);
+ }
+ }
+ },
+ // Return the current time while accounting for the server timezone.
+ now: function() {
+ var body = document.getElementsByTagName('body')[0];
+ var serverOffset = body.getAttribute('data-admin-utc-offset');
+ if (serverOffset !== undefined) {
+ var localNow = new Date();
+ var localOffset = localNow.getTimezoneOffset() * -60;
+ localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset));
+ return localNow;
+ } else {
+ return new Date();
+ }
+ },
+ // Add a warning when the time zone in the browser and backend do not match.
+ addTimezoneWarning: function(inp) {
+ var $ = django.jQuery;
+ var warningClass = DateTimeShortcuts.timezoneWarningClass;
+ var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;
+
+ // Only warn if there is a time zone mismatch.
+ if (!timezoneOffset) {
+ return;
+ }
+
+ // Check if warning is already there.
+ if ($(inp).siblings('.' + warningClass).length) {
+ return;
+ }
+
+ var message;
+ if (timezoneOffset > 0) {
+ message = ngettext(
+ 'Note: You are %s hour ahead of server time.',
+ 'Note: You are %s hours ahead of server time.',
+ timezoneOffset
+ );
+ }
+ else {
+ timezoneOffset *= -1;
+ message = ngettext(
+ 'Note: You are %s hour behind server time.',
+ 'Note: You are %s hours behind server time.',
+ timezoneOffset
+ );
+ }
+ message = interpolate(message, [timezoneOffset]);
+
+ var $warning = $('<span>');
+ $warning.attr('class', warningClass);
+ $warning.text(message);
+
+ $(inp).parent()
+ .append($('<br>'))
+ .append($warning);
+ },
+ // Add clock widget to a given field
+ addClock: function(inp) {
+ var num = DateTimeShortcuts.clockInputs.length;
+ DateTimeShortcuts.clockInputs[num] = inp;
+ DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };
+
+ // Shortcut links (clock icon and "Now" link)
+ var shortcuts_span = document.createElement('span');
+ shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
+ inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+ var now_link = document.createElement('a');
+ now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
+ now_link.appendChild(document.createTextNode(gettext('Now')));
+ var clock_link = document.createElement('a');
+ clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
+ clock_link.id = DateTimeShortcuts.clockLinkName + num;
+ quickElement(
+ 'span', clock_link, '',
+ 'class', 'clock-icon',
+ 'title', gettext('Choose a Time')
+ );
+ shortcuts_span.appendChild(document.createTextNode('\u00A0'));
+ shortcuts_span.appendChild(now_link);
+ shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ shortcuts_span.appendChild(clock_link);
+
+ // Create clock link div
+ //
+ // Markup looks like:
+ // <div id="clockbox1" class="clockbox module">
+ // <h2>Choose a time</h2>
+ // <ul class="timelist">
+ // <li><a href="#">Now</a></li>
+ // <li><a href="#">Midnight</a></li>
+ // <li><a href="#">6 a.m.</a></li>
+ // <li><a href="#">Noon</a></li>
+ // <li><a href="#">6 p.m.</a></li>
+ // </ul>
+ // <p class="calendar-cancel"><a href="#">Cancel</a></p>
+ // </div>
+
+ var clock_box = document.createElement('div');
+ clock_box.style.display = 'none';
+ clock_box.style.position = 'absolute';
+ clock_box.className = 'clockbox module';
+ clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
+ document.body.appendChild(clock_box);
+ addEvent(clock_box, 'click', cancelEventPropagation);
+
+ quickElement('h2', clock_box, gettext('Choose a time'));
+ var time_list = quickElement('ul', clock_box);
+ time_list.className = 'timelist';
+ quickElement("a", quickElement("li", time_list), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
+ quickElement("a", quickElement("li", time_list), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 0);");
+ quickElement("a", quickElement("li", time_list), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 6);");
+ quickElement("a", quickElement("li", time_list), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 12);");
+ quickElement("a", quickElement("li", time_list), gettext("6 p.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 18);");
+
+ var cancel_p = quickElement('p', clock_box);
+ cancel_p.className = 'calendar-cancel';
+ quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
+ django.jQuery(document).bind('keyup', function(event) {
+ if (event.which === 27) {
+ // ESC key closes popup
+ DateTimeShortcuts.dismissClock(num);
+ event.preventDefault();
+ }
+ });
+ },
+ openClock: function(num) {
+ var clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num);
+ var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num);
+
+ // Recalculate the clockbox position
+ // is it left-to-right or right-to-left layout ?
+ if (getStyle(document.body, 'direction') !== 'rtl') {
+ clock_box.style.left = findPosX(clock_link) + 17 + 'px';
+ }
+ else {
+ // since style's width is in em, it'd be tough to calculate
+ // px value of it. let's use an estimated px for now
+ // TODO: IE returns wrong value for findPosX when in rtl mode
+ // (it returns as it was left aligned), needs to be fixed.
+ clock_box.style.left = findPosX(clock_link) - 110 + 'px';
+ }
+ clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';
+
+ // Show the clock box
+ clock_box.style.display = 'block';
+ addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
+ },
+ dismissClock: function(num) {
+ document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
+ removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
+ },
+ handleClockQuicklink: function(num, val) {
+ var d;
+ if (val === -1) {
+ d = DateTimeShortcuts.now();
+ }
+ else {
+ d = new Date(1970, 1, 1, val, 0, 0, 0);
+ }
+ DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
+ DateTimeShortcuts.clockInputs[num].focus();
+ DateTimeShortcuts.dismissClock(num);
+ },
+ // Add calendar widget to a given field.
+ addCalendar: function(inp) {
+ var num = DateTimeShortcuts.calendars.length;
+
+ DateTimeShortcuts.calendarInputs[num] = inp;
+ DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };
+
+ // Shortcut links (calendar icon and "Today" link)
+ var shortcuts_span = document.createElement('span');
+ shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
+ inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+ var today_link = document.createElement('a');
+ today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+ today_link.appendChild(document.createTextNode(gettext('Today')));
+ var cal_link = document.createElement('a');
+ cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
+ cal_link.id = DateTimeShortcuts.calendarLinkName + num;
+ quickElement(
+ 'span', cal_link, '',
+ 'class', 'date-icon',
+ 'title', gettext('Choose a Date')
+ );
+ shortcuts_span.appendChild(document.createTextNode('\u00A0'));
+ shortcuts_span.appendChild(today_link);
+ shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ shortcuts_span.appendChild(cal_link);
+
+ // Create calendarbox div.
+ //
+ // Markup looks like:
+ //
+ // <div id="calendarbox3" class="calendarbox module">
+ // <h2>
+ // <a href="#" class="link-previous">&lsaquo;</a>
+ // <a href="#" class="link-next">&rsaquo;</a> February 2003
+ // </h2>
+ // <div class="calendar" id="calendarin3">
+ // <!-- (cal) -->
+ // </div>
+ // <div class="calendar-shortcuts">
+ // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
+ // </div>
+ // <p class="calendar-cancel"><a href="#">Cancel</a></p>
+ // </div>
+ var cal_box = document.createElement('div');
+ cal_box.style.display = 'none';
+ cal_box.style.position = 'absolute';
+ cal_box.className = 'calendarbox module';
+ cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
+ document.body.appendChild(cal_box);
+ addEvent(cal_box, 'click', cancelEventPropagation);
+
+ // next-prev links
+ var cal_nav = quickElement('div', cal_box);
+ var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev(' + num + ');');
+ cal_nav_prev.className = 'calendarnav-previous';
+ var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext(' + num + ');');
+ cal_nav_next.className = 'calendarnav-next';
+
+ // main box
+ var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
+ cal_main.className = 'calendar';
+ DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
+ DateTimeShortcuts.calendars[num].drawCurrent();
+
+ // calendar shortcuts
+ var shortcuts = quickElement('div', cal_box);
+ shortcuts.className = 'calendar-shortcuts';
+ quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
+ shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+ shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'));
+ quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
+
+ // cancel bar
+ var cancel_p = quickElement('p', cal_box);
+ cancel_p.className = 'calendar-cancel';
+ quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
+ django.jQuery(document).bind('keyup', function(event) {
+ if (event.which === 27) {
+ // ESC key closes popup
+ DateTimeShortcuts.dismissCalendar(num);
+ event.preventDefault();
+ }
+ });
+ },
+ openCalendar: function(num) {
+ var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num);
+ var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num);
+ var inp = DateTimeShortcuts.calendarInputs[num];
+
+ // Determine if the current value in the input has a valid date.
+ // If so, draw the calendar with that date's year and month.
+ if (inp.value) {
+ var format = get_format('DATE_INPUT_FORMATS')[0];
+ var selected = inp.value.strptime(format);
+ var year = selected.getFullYear();
+ var month = selected.getMonth() + 1;
+ var re = /\d{4}/;
+ if (re.test(year.toString()) && month >= 1 && month <= 12) {
+ DateTimeShortcuts.calendars[num].drawDate(month, year, selected);
+ }
+ }
+
+ // Recalculate the clockbox position
+ // is it left-to-right or right-to-left layout ?
+ if (getStyle(document.body, 'direction') !== 'rtl') {
+ cal_box.style.left = findPosX(cal_link) + 17 + 'px';
+ }
+ else {
+ // since style's width is in em, it'd be tough to calculate
+ // px value of it. let's use an estimated px for now
+ // TODO: IE returns wrong value for findPosX when in rtl mode
+ // (it returns as it was left aligned), needs to be fixed.
+ cal_box.style.left = findPosX(cal_link) - 180 + 'px';
+ }
+ cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';
+
+ cal_box.style.display = 'block';
+ addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
+ },
+ dismissCalendar: function(num) {
+ document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none';
+ removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
+ },
+ drawPrev: function(num) {
+ DateTimeShortcuts.calendars[num].drawPreviousMonth();
+ },
+ drawNext: function(num) {
+ DateTimeShortcuts.calendars[num].drawNextMonth();
+ },
+ handleCalendarCallback: function(num) {
+ var format = get_format('DATE_INPUT_FORMATS')[0];
+ // the format needs to be escaped a little
+ format = format.replace('\\', '\\\\');
+ format = format.replace('\r', '\\r');
+ format = format.replace('\n', '\\n');
+ format = format.replace('\t', '\\t');
+ format = format.replace("'", "\\'");
+ return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",
+ num,
+ "].value = new Date(y, m-1, d).strftime('",
+ format,
+ "');DateTimeShortcuts.calendarInputs[",
+ num,
+ "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
+ num,
+ ").style.display='none';}"].join('');
+ },
+ handleCalendarQuickLink: function(num, offset) {
+ var d = DateTimeShortcuts.now();
+ d.setDate(d.getDate() + offset);
+ DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
+ DateTimeShortcuts.calendarInputs[num].focus();
+ DateTimeShortcuts.dismissCalendar(num);
+ }
+ };
+
+ addEvent(window, 'load', DateTimeShortcuts.init);
+ window.DateTimeShortcuts = DateTimeShortcuts;
+})();
diff --git a/tbc/static/admin/static/admin/js/admin/RelatedObjectLookups.js b/tbc/static/admin/static/admin/js/admin/RelatedObjectLookups.js
new file mode 100644
index 0000000..fa782fe
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/admin/RelatedObjectLookups.js
@@ -0,0 +1,160 @@
+/*global SelectBox, interpolate*/
+// Handles related-objects functionality: lookup link for raw_id_fields
+// and Add Another links.
+
+(function() {
+ 'use strict';
+
+ function html_unescape(text) {
+ // Unescape a string that was escaped using django.utils.html.escape.
+ text = text.replace(/&lt;/g, '<');
+ text = text.replace(/&gt;/g, '>');
+ text = text.replace(/&quot;/g, '"');
+ text = text.replace(/&#39;/g, "'");
+ text = text.replace(/&amp;/g, '&');
+ return text;
+ }
+
+ // IE doesn't accept periods or dashes in the window name, but the element IDs
+ // we use to generate popup window names may contain them, therefore we map them
+ // to allowed characters in a reversible way so that we can locate the correct
+ // element when the popup window is dismissed.
+ function id_to_windowname(text) {
+ text = text.replace(/\./g, '__dot__');
+ text = text.replace(/\-/g, '__dash__');
+ return text;
+ }
+
+ function windowname_to_id(text) {
+ text = text.replace(/__dot__/g, '.');
+ text = text.replace(/__dash__/g, '-');
+ return text;
+ }
+
+ function showAdminPopup(triggeringLink, name_regexp, add_popup) {
+ var name = triggeringLink.id.replace(name_regexp, '');
+ name = id_to_windowname(name);
+ var href = triggeringLink.href;
+ if (add_popup) {
+ if (href.indexOf('?') === -1) {
+ href += '?_popup=1';
+ } else {
+ href += '&_popup=1';
+ }
+ }
+ var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+ win.focus();
+ return false;
+ }
+
+ function showRelatedObjectLookupPopup(triggeringLink) {
+ return showAdminPopup(triggeringLink, /^lookup_/, true);
+ }
+
+ function dismissRelatedLookupPopup(win, chosenId) {
+ var name = windowname_to_id(win.name);
+ var elem = document.getElementById(name);
+ if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) {
+ elem.value += ',' + chosenId;
+ } else {
+ document.getElementById(name).value = chosenId;
+ }
+ win.close();
+ }
+
+ function showRelatedObjectPopup(triggeringLink) {
+ return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
+ }
+
+ function updateRelatedObjectLinks(triggeringLink) {
+ var $this = django.jQuery(triggeringLink);
+ var siblings = $this.nextAll('.change-related, .delete-related');
+ if (!siblings.length) {
+ return;
+ }
+ var value = $this.val();
+ if (value) {
+ siblings.each(function() {
+ var elm = django.jQuery(this);
+ elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
+ });
+ } else {
+ siblings.removeAttr('href');
+ }
+ }
+
+ function dismissAddRelatedObjectPopup(win, newId, newRepr) {
+ // newId and newRepr are expected to have previously been escaped by
+ // django.utils.html.escape.
+ newId = html_unescape(newId);
+ newRepr = html_unescape(newRepr);
+ var name = windowname_to_id(win.name);
+ var elem = document.getElementById(name);
+ if (elem) {
+ var elemName = elem.nodeName.toUpperCase();
+ if (elemName === 'SELECT') {
+ elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
+ } else if (elemName === 'INPUT') {
+ if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) {
+ elem.value += ',' + newId;
+ } else {
+ elem.value = newId;
+ }
+ }
+ // Trigger a change event to update related links if required.
+ django.jQuery(elem).trigger('change');
+ } else {
+ var toId = name + "_to";
+ var o = new Option(newRepr, newId);
+ SelectBox.add_to_cache(toId, o);
+ SelectBox.redisplay(toId);
+ }
+ win.close();
+ }
+
+ function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
+ objId = html_unescape(objId);
+ newRepr = html_unescape(newRepr);
+ var id = windowname_to_id(win.name).replace(/^edit_/, '');
+ var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+ var selects = django.jQuery(selectsSelector);
+ selects.find('option').each(function() {
+ if (this.value === objId) {
+ this.innerHTML = newRepr;
+ this.value = newId;
+ }
+ });
+ win.close();
+ }
+
+ function dismissDeleteRelatedObjectPopup(win, objId) {
+ objId = html_unescape(objId);
+ var id = windowname_to_id(win.name).replace(/^delete_/, '');
+ var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+ var selects = django.jQuery(selectsSelector);
+ selects.find('option').each(function() {
+ if (this.value === objId) {
+ django.jQuery(this).remove();
+ }
+ }).trigger('change');
+ win.close();
+ }
+
+ // Global for testing purposes
+ window.html_unescape = html_unescape;
+ window.id_to_windowname = id_to_windowname;
+ window.windowname_to_id = windowname_to_id;
+
+ window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
+ window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
+ window.showRelatedObjectPopup = showRelatedObjectPopup;
+ window.updateRelatedObjectLinks = updateRelatedObjectLinks;
+ window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
+ window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
+ window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
+
+ // Kept for backward compatibility
+ window.showAddAnotherPopup = showRelatedObjectPopup;
+ window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
+
+})();
diff --git a/tbc/static/admin/static/admin/js/calendar.js b/tbc/static/admin/static/admin/js/calendar.js
new file mode 100644
index 0000000..1043dd6
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/calendar.js
@@ -0,0 +1,178 @@
+/*global gettext, get_format, quickElement, removeChildren*/
+/*
+calendar.js - Calendar functions by Adrian Holovaty
+depends on core.js for utility functions like removeChildren or quickElement
+*/
+
+(function() {
+ 'use strict';
+ // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
+ var CalendarNamespace = {
+ monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
+ daysOfWeek: gettext('S M T W T F S').split(' '),
+ firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
+ isLeapYear: function(year) {
+ return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0));
+ },
+ getDaysInMonth: function(month, year) {
+ var days;
+ if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) {
+ days = 31;
+ }
+ else if (month === 4 || month === 6 || month === 9 || month === 11) {
+ days = 30;
+ }
+ else if (month === 2 && CalendarNamespace.isLeapYear(year)) {
+ days = 29;
+ }
+ else {
+ days = 28;
+ }
+ return days;
+ },
+ draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999
+ var today = new Date();
+ var todayDay = today.getDate();
+ var todayMonth = today.getMonth() + 1;
+ var todayYear = today.getFullYear();
+ var todayClass = '';
+
+ // Use UTC functions here because the date field does not contain time
+ // and using the UTC function variants prevent the local time offset
+ // from altering the date, specifically the day field. For example:
+ //
+ // ```
+ // var x = new Date('2013-10-02');
+ // var day = x.getDate();
+ // ```
+ //
+ // The day variable above will be 1 instead of 2 in, say, US Pacific time
+ // zone.
+ var isSelectedMonth = false;
+ if (typeof selected !== 'undefined') {
+ isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month);
+ }
+
+ month = parseInt(month);
+ year = parseInt(year);
+ var calDiv = document.getElementById(div_id);
+ removeChildren(calDiv);
+ var calTable = document.createElement('table');
+ quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year);
+ var tableBody = quickElement('tbody', calTable);
+
+ // Draw days-of-week header
+ var tableRow = quickElement('tr', tableBody);
+ for (var i = 0; i < 7; i++) {
+ quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);
+ }
+
+ var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
+ var days = CalendarNamespace.getDaysInMonth(month, year);
+
+ var nonDayCell;
+
+ // Draw blanks before first of month
+ tableRow = quickElement('tr', tableBody);
+ for (i = 0; i < startingPos; i++) {
+ nonDayCell = quickElement('td', tableRow, ' ');
+ nonDayCell.className = "nonday";
+ }
+
+ // Draw days of month
+ var currentDay = 1;
+ for (i = startingPos; currentDay <= days; i++) {
+ if (i % 7 === 0 && currentDay !== 1) {
+ tableRow = quickElement('tr', tableBody);
+ }
+ if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) {
+ todayClass = 'today';
+ } else {
+ todayClass = '';
+ }
+
+ // use UTC function; see above for explanation.
+ if (isSelectedMonth && currentDay === selected.getUTCDate()) {
+ if (todayClass !== '') {
+ todayClass += " ";
+ }
+ todayClass += "selected";
+ }
+
+ var cell = quickElement('td', tableRow, '', 'class', todayClass);
+
+ quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '(' + year + ',' + month + ',' + currentDay + '));');
+ currentDay++;
+ }
+
+ // Draw blanks after end of month (optional, but makes for valid code)
+ while (tableRow.childNodes.length < 7) {
+ nonDayCell = quickElement('td', tableRow, ' ');
+ nonDayCell.className = "nonday";
+ }
+
+ calDiv.appendChild(calTable);
+ }
+ };
+
+ // Calendar -- A calendar instance
+ function Calendar(div_id, callback, selected) {
+ // div_id (string) is the ID of the element in which the calendar will
+ // be displayed
+ // callback (string) is the name of a JavaScript function that will be
+ // called with the parameters (year, month, day) when a day in the
+ // calendar is clicked
+ this.div_id = div_id;
+ this.callback = callback;
+ this.today = new Date();
+ this.currentMonth = this.today.getMonth() + 1;
+ this.currentYear = this.today.getFullYear();
+ if (typeof selected !== 'undefined') {
+ this.selected = selected;
+ }
+ }
+ Calendar.prototype = {
+ drawCurrent: function() {
+ CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected);
+ },
+ drawDate: function(month, year, selected) {
+ this.currentMonth = month;
+ this.currentYear = year;
+
+ if(selected) {
+ this.selected = selected;
+ }
+
+ this.drawCurrent();
+ },
+ drawPreviousMonth: function() {
+ if (this.currentMonth === 1) {
+ this.currentMonth = 12;
+ this.currentYear--;
+ }
+ else {
+ this.currentMonth--;
+ }
+ this.drawCurrent();
+ },
+ drawNextMonth: function() {
+ if (this.currentMonth === 12) {
+ this.currentMonth = 1;
+ this.currentYear++;
+ }
+ else {
+ this.currentMonth++;
+ }
+ this.drawCurrent();
+ },
+ drawPreviousYear: function() {
+ this.currentYear--;
+ this.drawCurrent();
+ },
+ drawNextYear: function() {
+ this.currentYear++;
+ this.drawCurrent();
+ }
+ };
+ window.Calendar = Calendar;
+})();
diff --git a/tbc/static/admin/static/admin/js/collapse.js b/tbc/static/admin/static/admin/js/collapse.js
new file mode 100644
index 0000000..7cb9362
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/collapse.js
@@ -0,0 +1,26 @@
+/*global gettext*/
+(function($) {
+ 'use strict';
+ $(document).ready(function() {
+ // Add anchor tag for Show/Hide link
+ $("fieldset.collapse").each(function(i, elem) {
+ // Don't hide if fields in this fieldset have errors
+ if ($(elem).find("div.errors").length === 0) {
+ $(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' +
+ i + '" class="collapse-toggle" href="#">' + gettext("Show") +
+ '</a>)');
+ }
+ });
+ // Add toggle to anchor tag
+ $("fieldset.collapse a.collapse-toggle").click(function(ev) {
+ if ($(this).closest("fieldset").hasClass("collapsed")) {
+ // Show
+ $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]);
+ } else {
+ // Hide
+ $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]);
+ }
+ return false;
+ });
+ });
+})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/collapse.min.js b/tbc/static/admin/static/admin/js/collapse.min.js
new file mode 100644
index 0000000..6251d91
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/collapse.min.js
@@ -0,0 +1,2 @@
+(function(a){a(document).ready(function(){a("fieldset.collapse").each(function(b,c){0===a(c).find("div.errors").length&&a(c).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser'+b+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")});a("fieldset.collapse a.collapse-toggle").click(function(b){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset",
+[a(this).attr("id")]);return!1})})})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/core.js b/tbc/static/admin/static/admin/js/core.js
new file mode 100644
index 0000000..34f9926
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/core.js
@@ -0,0 +1,263 @@
+// Core javascript helper functions
+
+// basic browser identification & version
+var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion);
+var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
+
+// Cross-browser event handlers.
+function addEvent(obj, evType, fn) {
+ 'use strict';
+ if (obj.addEventListener) {
+ obj.addEventListener(evType, fn, false);
+ return true;
+ } else if (obj.attachEvent) {
+ var r = obj.attachEvent("on" + evType, fn);
+ return r;
+ } else {
+ return false;
+ }
+}
+
+function removeEvent(obj, evType, fn) {
+ 'use strict';
+ if (obj.removeEventListener) {
+ obj.removeEventListener(evType, fn, false);
+ return true;
+ } else if (obj.detachEvent) {
+ obj.detachEvent("on" + evType, fn);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+function cancelEventPropagation(e) {
+ 'use strict';
+ if (!e) {
+ e = window.event;
+ }
+ e.cancelBubble = true;
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+}
+
+// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
+function quickElement() {
+ 'use strict';
+ var obj = document.createElement(arguments[0]);
+ if (arguments[2]) {
+ var textNode = document.createTextNode(arguments[2]);
+ obj.appendChild(textNode);
+ }
+ var len = arguments.length;
+ for (var i = 3; i < len; i += 2) {
+ obj.setAttribute(arguments[i], arguments[i + 1]);
+ }
+ arguments[1].appendChild(obj);
+ return obj;
+}
+
+// "a" is reference to an object
+function removeChildren(a) {
+ 'use strict';
+ while (a.hasChildNodes()) {
+ a.removeChild(a.lastChild);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Cross-browser xmlhttp object
+// from http://jibbering.com/2002/4/httprequest.html
+// ----------------------------------------------------------------------------
+var xmlhttp;
+/*@cc_on @*/
+/*@if (@_jscript_version >= 5)
+ try {
+ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ try {
+ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (E) {
+ xmlhttp = false;
+ }
+ }
+@else
+ xmlhttp = false;
+@end @*/
+if (!xmlhttp && typeof XMLHttpRequest !== 'undefined') {
+ xmlhttp = new XMLHttpRequest();
+}
+
+// ----------------------------------------------------------------------------
+// Find-position functions by PPK
+// See http://www.quirksmode.org/js/findpos.html
+// ----------------------------------------------------------------------------
+function findPosX(obj) {
+ 'use strict';
+ var curleft = 0;
+ if (obj.offsetParent) {
+ while (obj.offsetParent) {
+ curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
+ obj = obj.offsetParent;
+ }
+ // IE offsetParent does not include the top-level
+ if (isIE && obj.parentElement) {
+ curleft += obj.offsetLeft - obj.scrollLeft;
+ }
+ } else if (obj.x) {
+ curleft += obj.x;
+ }
+ return curleft;
+}
+
+function findPosY(obj) {
+ 'use strict';
+ var curtop = 0;
+ if (obj.offsetParent) {
+ while (obj.offsetParent) {
+ curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
+ obj = obj.offsetParent;
+ }
+ // IE offsetParent does not include the top-level
+ if (isIE && obj.parentElement) {
+ curtop += obj.offsetTop - obj.scrollTop;
+ }
+ } else if (obj.y) {
+ curtop += obj.y;
+ }
+ return curtop;
+}
+
+//-----------------------------------------------------------------------------
+// Date object extensions
+// ----------------------------------------------------------------------------
+(function() {
+ 'use strict';
+ Date.prototype.getTwelveHours = function() {
+ var hours = this.getHours();
+ if (hours === 0) {
+ return 12;
+ }
+ else {
+ return hours <= 12 ? hours : hours - 12;
+ }
+ };
+
+ Date.prototype.getTwoDigitMonth = function() {
+ return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
+ };
+
+ Date.prototype.getTwoDigitDate = function() {
+ return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
+ };
+
+ Date.prototype.getTwoDigitTwelveHour = function() {
+ return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
+ };
+
+ Date.prototype.getTwoDigitHour = function() {
+ return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
+ };
+
+ Date.prototype.getTwoDigitMinute = function() {
+ return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
+ };
+
+ Date.prototype.getTwoDigitSecond = function() {
+ return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
+ };
+
+ Date.prototype.getHourMinute = function() {
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
+ };
+
+ Date.prototype.getHourMinuteSecond = function() {
+ return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
+ };
+
+ Date.prototype.strftime = function(format) {
+ var fields = {
+ c: this.toString(),
+ d: this.getTwoDigitDate(),
+ H: this.getTwoDigitHour(),
+ I: this.getTwoDigitTwelveHour(),
+ m: this.getTwoDigitMonth(),
+ M: this.getTwoDigitMinute(),
+ p: (this.getHours() >= 12) ? 'PM' : 'AM',
+ S: this.getTwoDigitSecond(),
+ w: '0' + this.getDay(),
+ x: this.toLocaleDateString(),
+ X: this.toLocaleTimeString(),
+ y: ('' + this.getFullYear()).substr(2, 4),
+ Y: '' + this.getFullYear(),
+ '%': '%'
+ };
+ var result = '', i = 0;
+ while (i < format.length) {
+ if (format.charAt(i) === '%') {
+ result = result + fields[format.charAt(i + 1)];
+ ++i;
+ }
+ else {
+ result = result + format.charAt(i);
+ }
+ ++i;
+ }
+ return result;
+ };
+
+// ----------------------------------------------------------------------------
+// String object extensions
+// ----------------------------------------------------------------------------
+ String.prototype.pad_left = function(pad_length, pad_string) {
+ var new_string = this;
+ for (var i = 0; new_string.length < pad_length; i++) {
+ new_string = pad_string + new_string;
+ }
+ return new_string;
+ };
+
+ String.prototype.strptime = function(format) {
+ var split_format = format.split(/[.\-/]/);
+ var date = this.split(/[.\-/]/);
+ var i = 0;
+ var day, month, year;
+ while (i < split_format.length) {
+ switch (split_format[i]) {
+ case "%d":
+ day = date[i];
+ break;
+ case "%m":
+ month = date[i] - 1;
+ break;
+ case "%Y":
+ year = date[i];
+ break;
+ case "%y":
+ year = date[i];
+ break;
+ }
+ ++i;
+ }
+ return new Date(year, month, day);
+ };
+
+})();
+// ----------------------------------------------------------------------------
+// Get the computed style for and element
+// ----------------------------------------------------------------------------
+function getStyle(oElm, strCssRule) {
+ 'use strict';
+ var strValue = "";
+ if(document.defaultView && document.defaultView.getComputedStyle) {
+ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
+ }
+ else if(oElm.currentStyle) {
+ strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
+ return p1.toUpperCase();
+ });
+ strValue = oElm.currentStyle[strCssRule];
+ }
+ return strValue;
+}
diff --git a/tbc/static/admin/static/admin/js/inlines.js b/tbc/static/admin/static/admin/js/inlines.js
new file mode 100644
index 0000000..c725e30
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/inlines.js
@@ -0,0 +1,275 @@
+/*global DateTimeShortcuts, SelectFilter*/
+/**
+ * Django admin inlines
+ *
+ * Based on jQuery Formset 1.1
+ * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
+ * @requires jQuery 1.2.6 or later
+ *
+ * Copyright (c) 2009, Stanislaus Madueke
+ * All rights reserved.
+ *
+ * Spiced up with Code from Zain Memon's GSoC project 2009
+ * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip.
+ *
+ * Licensed under the New BSD License
+ * See: http://www.opensource.org/licenses/bsd-license.php
+ */
+(function($) {
+ 'use strict';
+ $.fn.formset = function(opts) {
+ var options = $.extend({}, $.fn.formset.defaults, opts);
+ var $this = $(this);
+ var $parent = $this.parent();
+ var updateElementIndex = function(el, prefix, ndx) {
+ var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
+ var replacement = prefix + "-" + ndx;
+ if ($(el).prop("for")) {
+ $(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
+ }
+ if (el.id) {
+ el.id = el.id.replace(id_regex, replacement);
+ }
+ if (el.name) {
+ el.name = el.name.replace(id_regex, replacement);
+ }
+ };
+ var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
+ var nextIndex = parseInt(totalForms.val(), 10);
+ var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
+ // only show the add button if we are allowed to add more items,
+ // note that max_num = None translates to a blank string.
+ var showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0;
+ $this.each(function(i) {
+ $(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
+ });
+ if ($this.length && showAddButton) {
+ var addButton;
+ if ($this.prop("tagName") === "TR") {
+ // If forms are laid out as table rows, insert the
+ // "add" button in a new table row:
+ var numCols = this.eq(-1).children().length;
+ $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
+ addButton = $parent.find("tr:last a");
+ } else {
+ // Otherwise, insert it immediately after the last form:
+ $this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
+ addButton = $this.filter(":last").next().find("a");
+ }
+ addButton.click(function(e) {
+ e.preventDefault();
+ var template = $("#" + options.prefix + "-empty");
+ var row = template.clone(true);
+ row.removeClass(options.emptyCssClass)
+ .addClass(options.formCssClass)
+ .attr("id", options.prefix + "-" + nextIndex);
+ if (row.is("tr")) {
+ // If the forms are laid out in table rows, insert
+ // the remove button into the last table cell:
+ row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></div>");
+ } else if (row.is("ul") || row.is("ol")) {
+ // If they're laid out as an ordered/unordered list,
+ // insert an <li> after the last list item:
+ row.append('<li><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></li>");
+ } else {
+ // Otherwise, just insert the remove button as the
+ // last child element of the form's container:
+ row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
+ }
+ row.find("*").each(function() {
+ updateElementIndex(this, options.prefix, totalForms.val());
+ });
+ // Insert the new form when it has been fully edited
+ row.insertBefore($(template));
+ // Update number of total forms
+ $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
+ nextIndex += 1;
+ // Hide add button in case we've hit the max, except we want to add infinitely
+ if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) {
+ addButton.parent().hide();
+ }
+ // The delete button of each row triggers a bunch of other things
+ row.find("a." + options.deleteCssClass).click(function(e1) {
+ e1.preventDefault();
+ // Remove the parent form containing this button:
+ row.remove();
+ nextIndex -= 1;
+ // If a post-delete callback was provided, call it with the deleted form:
+ if (options.removed) {
+ options.removed(row);
+ }
+ $(document).trigger('formset:removed', [row, options.prefix]);
+ // Update the TOTAL_FORMS form count.
+ var forms = $("." + options.formCssClass);
+ $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
+ // Show add button again once we drop below max
+ if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) {
+ addButton.parent().show();
+ }
+ // Also, update names and ids for all remaining form controls
+ // so they remain in sequence:
+ var i, formCount;
+ var updateElementCallback = function() {
+ updateElementIndex(this, options.prefix, i);
+ };
+ for (i = 0, formCount = forms.length; i < formCount; i++) {
+ updateElementIndex($(forms).get(i), options.prefix, i);
+ $(forms.get(i)).find("*").each(updateElementCallback);
+ }
+ });
+ // If a post-add callback was supplied, call it with the added form:
+ if (options.added) {
+ options.added(row);
+ }
+ $(document).trigger('formset:added', [row, options.prefix]);
+ });
+ }
+ return this;
+ };
+
+ /* Setup plugin defaults */
+ $.fn.formset.defaults = {
+ prefix: "form", // The form prefix for your django formset
+ addText: "add another", // Text for the add link
+ deleteText: "remove", // Text for the delete link
+ addCssClass: "add-row", // CSS class applied to the add link
+ deleteCssClass: "delete-row", // CSS class applied to the delete link
+ emptyCssClass: "empty-row", // CSS class applied to the empty row
+ formCssClass: "dynamic-form", // CSS class applied to each form in a formset
+ added: null, // Function called each time a new form is added
+ removed: null // Function called each time a form is deleted
+ };
+
+
+ // Tabular inlines ---------------------------------------------------------
+ $.fn.tabularFormset = function(options) {
+ var $rows = $(this);
+ var alternatingRows = function(row) {
+ $($rows.selector).not(".add-row").removeClass("row1 row2")
+ .filter(":even").addClass("row1").end()
+ .filter(":odd").addClass("row2");
+ };
+
+ var reinitDateTimeShortCuts = function() {
+ // Reinitialize the calendar and clock widgets by force
+ if (typeof DateTimeShortcuts !== "undefined") {
+ $(".datetimeshortcuts").remove();
+ DateTimeShortcuts.init();
+ }
+ };
+
+ var updateSelectFilter = function() {
+ // If any SelectFilter widgets are a part of the new form,
+ // instantiate a new SelectFilter instance for it.
+ if (typeof SelectFilter !== 'undefined') {
+ $('.selectfilter').each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], false);
+ });
+ $('.selectfilterstacked').each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], true);
+ });
+ }
+ };
+
+ var initPrepopulatedFields = function(row) {
+ row.find('.prepopulated_field').each(function() {
+ var field = $(this),
+ input = field.find('input, select, textarea'),
+ dependency_list = input.data('dependency_list') || [],
+ dependencies = [];
+ $.each(dependency_list, function(i, field_name) {
+ dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
+ });
+ if (dependencies.length) {
+ input.prepopulate(dependencies, input.attr('maxlength'));
+ }
+ });
+ };
+
+ $rows.formset({
+ prefix: options.prefix,
+ addText: options.addText,
+ formCssClass: "dynamic-" + options.prefix,
+ deleteCssClass: "inline-deletelink",
+ deleteText: options.deleteText,
+ emptyCssClass: "empty-form",
+ removed: alternatingRows,
+ added: function(row) {
+ initPrepopulatedFields(row);
+ reinitDateTimeShortCuts();
+ updateSelectFilter();
+ alternatingRows(row);
+ }
+ });
+
+ return $rows;
+ };
+
+ // Stacked inlines ---------------------------------------------------------
+ $.fn.stackedFormset = function(options) {
+ var $rows = $(this);
+ var updateInlineLabel = function(row) {
+ $($rows.selector).find(".inline_label").each(function(i) {
+ var count = i + 1;
+ $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
+ });
+ };
+
+ var reinitDateTimeShortCuts = function() {
+ // Reinitialize the calendar and clock widgets by force, yuck.
+ if (typeof DateTimeShortcuts !== "undefined") {
+ $(".datetimeshortcuts").remove();
+ DateTimeShortcuts.init();
+ }
+ };
+
+ var updateSelectFilter = function() {
+ // If any SelectFilter widgets were added, instantiate a new instance.
+ if (typeof SelectFilter !== "undefined") {
+ $(".selectfilter").each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], false);
+ });
+ $(".selectfilterstacked").each(function(index, value) {
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length - 1], true);
+ });
+ }
+ };
+
+ var initPrepopulatedFields = function(row) {
+ row.find('.prepopulated_field').each(function() {
+ var field = $(this),
+ input = field.find('input, select, textarea'),
+ dependency_list = input.data('dependency_list') || [],
+ dependencies = [];
+ $.each(dependency_list, function(i, field_name) {
+ dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
+ });
+ if (dependencies.length) {
+ input.prepopulate(dependencies, input.attr('maxlength'));
+ }
+ });
+ };
+
+ $rows.formset({
+ prefix: options.prefix,
+ addText: options.addText,
+ formCssClass: "dynamic-" + options.prefix,
+ deleteCssClass: "inline-deletelink",
+ deleteText: options.deleteText,
+ emptyCssClass: "empty-form",
+ removed: updateInlineLabel,
+ added: function(row) {
+ initPrepopulatedFields(row);
+ reinitDateTimeShortCuts();
+ updateSelectFilter();
+ updateInlineLabel(row);
+ }
+ });
+
+ return $rows;
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/inlines.min.js b/tbc/static/admin/static/admin/js/inlines.min.js
new file mode 100644
index 0000000..f83cbec
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/inlines.min.js
@@ -0,0 +1,9 @@
+(function(b){b.fn.formset=function(d){var a=b.extend({},b.fn.formset.defaults,d),e=b(this);d=e.parent();var k=function(a,f,l){var c=new RegExp("("+f+"-(\\d+|__prefix__))");f=f+"-"+l;b(a).prop("for")&&b(a).prop("for",b(a).prop("for").replace(c,f));a.id&&(a.id=a.id.replace(c,f));a.name&&(a.name=a.name.replace(c,f))},h=b("#id_"+a.prefix+"-TOTAL_FORMS").prop("autocomplete","off"),l=parseInt(h.val(),10),f=b("#id_"+a.prefix+"-MAX_NUM_FORMS").prop("autocomplete","off"),c=""===f.val()||0<f.val()-h.val();
+e.each(function(f){b(this).not("."+a.emptyCssClass).addClass(a.formCssClass)});if(e.length&&c){var m;"TR"===e.prop("tagName")?(e=this.eq(-1).children().length,d.append('<tr class="'+a.addCssClass+'"><td colspan="'+e+'"><a href="javascript:void(0)">'+a.addText+"</a></tr>"),m=d.find("tr:last a")):(e.filter(":last").after('<div class="'+a.addCssClass+'"><a href="javascript:void(0)">'+a.addText+"</a></div>"),m=e.filter(":last").next().find("a"));m.click(function(c){c.preventDefault();c=b("#"+a.prefix+
+"-empty");var g=c.clone(!0);g.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+l);g.is("tr")?g.children(":last").append('<div><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></div>"):g.is("ul")||g.is("ol")?g.append('<li><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></li>"):g.children(":first").append('<span><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></span>");g.find("*").each(function(){k(this,
+a.prefix,h.val())});g.insertBefore(b(c));b(h).val(parseInt(h.val(),10)+1);l+=1;""!==f.val()&&0>=f.val()-h.val()&&m.parent().hide();g.find("a."+a.deleteCssClass).click(function(c){c.preventDefault();g.remove();--l;a.removed&&a.removed(g);b(document).trigger("formset:removed",[g,a.prefix]);c=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(c.length);(""===f.val()||0<f.val()-c.length)&&m.parent().show();var d,e,h=function(){k(this,a.prefix,d)};d=0;for(e=c.length;d<e;d++)k(b(c).get(d),a.prefix,
+d),b(c.get(d)).find("*").each(h)});a.added&&a.added(g);b(document).trigger("formset:added",[g,a.prefix])})}return this};b.fn.formset.defaults={prefix:"form",addText:"add another",deleteText:"remove",addCssClass:"add-row",deleteCssClass:"delete-row",emptyCssClass:"empty-row",formCssClass:"dynamic-form",added:null,removed:null};b.fn.tabularFormset=function(d){var a=b(this),e=function(l){b(a.selector).not(".add-row").removeClass("row1 row2").filter(":even").addClass("row1").end().filter(":odd").addClass("row2")},
+k=function(){"undefined"!==typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!1)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!0)}))},h=function(a){a.find(".prepopulated_field").each(function(){var f=b(this).find("input, select, textarea"),c=f.data("dependency_list")||[],d=[];b.each(c,function(b,c){d.push("#"+a.find(".field-"+c).find("input, select, textarea").attr("id"))});
+d.length&&f.prepopulate(d,f.attr("maxlength"))})};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:e,added:function(a){h(a);"undefined"!==typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());k();e(a)}});return a};b.fn.stackedFormset=function(d){var a=b(this),e=function(d){b(a.selector).find(".inline_label").each(function(a){a+=1;b(this).html(b(this).html().replace(/(#\d+)/g,
+"#"+a))})},k=function(){"undefined"!==typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!1)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!0)}))},h=function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(b,c){e.push("#"+a.find(".form-row .field-"+c).find("input, select, textarea").attr("id"))});
+e.length&&d.prepopulate(e,d.attr("maxlength"))})};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:e,added:function(a){h(a);"undefined"!==typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());k();e(a)}});return a}})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/jquery.init.js b/tbc/static/admin/static/admin/js/jquery.init.js
new file mode 100644
index 0000000..f3ac162
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/jquery.init.js
@@ -0,0 +1,8 @@
+/*global django:true, jQuery:false*/
+/* Puts the included jQuery into our own namespace using noConflict and passing
+ * it 'true'. This ensures that the included jQuery doesn't pollute the global
+ * namespace (i.e. this preserves pre-existing values for both window.$ and
+ * window.jQuery).
+ */
+var django = django || {};
+django.jQuery = jQuery.noConflict(true);
diff --git a/tbc/static/admin/static/admin/js/prepopulate.js b/tbc/static/admin/static/admin/js/prepopulate.js
new file mode 100644
index 0000000..5d4b0e8
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/prepopulate.js
@@ -0,0 +1,42 @@
+/*global URLify*/
+(function($) {
+ 'use strict';
+ $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
+ /*
+ Depends on urlify.js
+ Populates a selected field with the values of the dependent fields,
+ URLifies and shortens the string.
+ dependencies - array of dependent fields ids
+ maxLength - maximum length of the URLify'd string
+ allowUnicode - Unicode support of the URLify'd string
+ */
+ return this.each(function() {
+ var prepopulatedField = $(this);
+
+ var populate = function() {
+ // Bail if the field's value has been changed by the user
+ if (prepopulatedField.data('_changed')) {
+ return;
+ }
+
+ var values = [];
+ $.each(dependencies, function(i, field) {
+ field = $(field);
+ if (field.val().length > 0) {
+ values.push(field.val());
+ }
+ });
+ prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
+ };
+
+ prepopulatedField.data('_changed', false);
+ prepopulatedField.change(function() {
+ prepopulatedField.data('_changed', true);
+ });
+
+ if (!prepopulatedField.val()) {
+ $(dependencies.join(',')).keyup(populate).change(populate).focus(populate);
+ }
+ });
+ };
+})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/prepopulate.min.js b/tbc/static/admin/static/admin/js/prepopulate.min.js
new file mode 100644
index 0000000..75f3c17
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/prepopulate.min.js
@@ -0,0 +1 @@
+(function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);0<d.val().length&&b.push(d.val())});a.val(URLify(b.join(" "),f,g))}};a.data("_changed",!1);a.change(function(){a.data("_changed",!0)});a.val()||c(e.join(",")).keyup(b).change(b).focus(b)})}})(django.jQuery);
diff --git a/tbc/static/admin/static/admin/js/timeparse.js b/tbc/static/admin/static/admin/js/timeparse.js
new file mode 100644
index 0000000..3cdc7ec
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/timeparse.js
@@ -0,0 +1,106 @@
+(function() {
+ 'use strict';
+ var timeParsePatterns = [
+ // 9
+ {
+ re: /^\d{1,2}$/i,
+ handler: function(bits) {
+ if (bits[0].length === 1) {
+ return '0' + bits[0] + ':00';
+ } else {
+ return bits[0] + ':00';
+ }
+ }
+ },
+ // 13:00
+ {
+ re: /^\d{2}[:.]\d{2}$/i,
+ handler: function(bits) {
+ return bits[0].replace('.', ':');
+ }
+ },
+ // 9:00
+ {
+ re: /^\d[:.]\d{2}$/i,
+ handler: function(bits) {
+ return '0' + bits[0].replace('.', ':');
+ }
+ },
+ // 3 am / 3 a.m. / 3am
+ {
+ re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
+ handler: function(bits) {
+ var hour = parseInt(bits[1]);
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (bits[2].toLowerCase() === 'p') {
+ if (hour === 12) {
+ hour = 0;
+ }
+ return (hour + 12) + ':00';
+ } else {
+ if (hour < 10) {
+ return '0' + hour + ':00';
+ } else {
+ return hour + ':00';
+ }
+ }
+ }
+ },
+ // 3.30 am / 3:15 a.m. / 3.00am
+ {
+ re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
+ handler: function(bits) {
+ var hour = parseInt(bits[1]);
+ var mins = parseInt(bits[2]);
+ if (mins < 10) {
+ mins = '0' + mins;
+ }
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (bits[3].toLowerCase() === 'p') {
+ if (hour === 12) {
+ hour = 0;
+ }
+ return (hour + 12) + ':' + mins;
+ } else {
+ if (hour < 10) {
+ return '0' + hour + ':' + mins;
+ } else {
+ return hour + ':' + mins;
+ }
+ }
+ }
+ },
+ // noon
+ {
+ re: /^no/i,
+ handler: function(bits) {
+ return '12:00';
+ }
+ },
+ // midnight
+ {
+ re: /^mid/i,
+ handler: function(bits) {
+ return '00:00';
+ }
+ }
+ ];
+
+ function parseTimeString(s) {
+ for (var i = 0; i < timeParsePatterns.length; i++) {
+ var re = timeParsePatterns[i].re;
+ var handler = timeParsePatterns[i].handler;
+ var bits = re.exec(s);
+ if (bits) {
+ return handler(bits);
+ }
+ }
+ return s;
+ }
+
+ window.parseTimeString = parseTimeString;
+})();
diff --git a/tbc/static/admin/static/admin/js/urlify.js b/tbc/static/admin/static/admin/js/urlify.js
new file mode 100644
index 0000000..b27325e
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/urlify.js
@@ -0,0 +1,171 @@
+/*global XRegExp*/
+(function() {
+ 'use strict';
+
+ var LATIN_MAP = {
+ 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE',
+ 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I',
+ 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O',
+ 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U',
+ 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a',
+ 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c',
+ 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i',
+ 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o',
+ 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
+ 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
+ };
+ var LATIN_SYMBOLS_MAP = {
+ '©': '(c)'
+ };
+ var GREEK_MAP = {
+ 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h',
+ 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3',
+ 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f',
+ 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o',
+ 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y',
+ 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z',
+ 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N',
+ 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y',
+ 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I',
+ 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y'
+ };
+ var TURKISH_MAP = {
+ 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u',
+ 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G'
+ };
+ var ROMANIAN_MAP = {
+ 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a',
+ 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A'
+ };
+ var RUSSIAN_MAP = {
+ 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo',
+ 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm',
+ 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
+ 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '',
+ 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya',
+ 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo',
+ 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M',
+ 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
+ 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '',
+ 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya'
+ };
+ var UKRAINIAN_MAP = {
+ 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i',
+ 'ї': 'yi', 'ґ': 'g'
+ };
+ var CZECH_MAP = {
+ 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't',
+ 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R',
+ 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z'
+ };
+ var POLISH_MAP = {
+ 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's',
+ 'ź': 'z', 'ż': 'z',
+ 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S',
+ 'Ź': 'Z', 'Ż': 'Z'
+ };
+ var LATVIAN_MAP = {
+ 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l',
+ 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z',
+ 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L',
+ 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z'
+ };
+ var ARABIC_MAP = {
+ 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd',
+ 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't',
+ 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm',
+ 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y'
+ };
+ var LITHUANIAN_MAP = {
+ 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u',
+ 'ū': 'u', 'ž': 'z',
+ 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U',
+ 'Ū': 'U', 'Ž': 'Z'
+ };
+ var SERBIAN_MAP = {
+ 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz',
+ 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C',
+ 'Џ': 'Dz', 'Đ': 'Dj'
+ };
+ var AZERBAIJANI_MAP = {
+ 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u',
+ 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U'
+ };
+
+ var ALL_DOWNCODE_MAPS = [
+ LATIN_MAP,
+ LATIN_SYMBOLS_MAP,
+ GREEK_MAP,
+ TURKISH_MAP,
+ ROMANIAN_MAP,
+ RUSSIAN_MAP,
+ UKRAINIAN_MAP,
+ CZECH_MAP,
+ POLISH_MAP,
+ LATVIAN_MAP,
+ ARABIC_MAP,
+ LITHUANIAN_MAP,
+ SERBIAN_MAP,
+ AZERBAIJANI_MAP
+ ];
+
+ var Downcoder = {
+ 'Initialize': function() {
+ if (Downcoder.map) { // already made
+ return;
+ }
+ Downcoder.map = {};
+ Downcoder.chars = [];
+ for (var i = 0; i < ALL_DOWNCODE_MAPS.length; i++) {
+ var lookup = ALL_DOWNCODE_MAPS[i];
+ for (var c in lookup) {
+ if (lookup.hasOwnProperty(c)) {
+ Downcoder.map[c] = lookup[c];
+ }
+ }
+ }
+ for (var k in Downcoder.map) {
+ if (Downcoder.map.hasOwnProperty(k)) {
+ Downcoder.chars.push(k);
+ }
+ }
+ Downcoder.regex = new RegExp(Downcoder.chars.join('|'), 'g');
+ }
+ };
+
+ function downcode(slug) {
+ Downcoder.Initialize();
+ return slug.replace(Downcoder.regex, function(m) {
+ return Downcoder.map[m];
+ });
+ }
+
+
+ function URLify(s, num_chars, allowUnicode) {
+ // changes, e.g., "Petty theft" to "petty-theft"
+ // remove all these words from the string before urlifying
+ if (!allowUnicode) {
+ s = downcode(s);
+ }
+ var removelist = [
+ "a", "an", "as", "at", "before", "but", "by", "for", "from", "is",
+ "in", "into", "like", "of", "off", "on", "onto", "per", "since",
+ "than", "the", "this", "that", "to", "up", "via", "with"
+ ];
+ var r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
+ s = s.replace(r, '');
+ // if downcode doesn't hit, the char will be stripped here
+ if (allowUnicode) {
+ // Keep Unicode letters including both lowercase and uppercase
+ // characters, whitespace, and dash; remove other characters.
+ s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), '');
+ } else {
+ s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
+ }
+ s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
+ s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
+ s = s.toLowerCase(); // convert to lowercase
+ return s.substring(0, num_chars); // trim to first num_chars chars
+ }
+ window.URLify = URLify;
+})();
diff --git a/tbc/static/admin/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt b/tbc/static/admin/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt
new file mode 100644
index 0000000..d930e62
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt
@@ -0,0 +1,26 @@
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tbc/static/admin/static/admin/js/vendor/jquery/jquery.js b/tbc/static/admin/static/admin/js/vendor/jquery/jquery.js
new file mode 100644
index 0000000..eed1777
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/vendor/jquery/jquery.js
@@ -0,0 +1,9210 @@
+/*!
+ * jQuery JavaScript Library v2.1.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-04-28T16:01Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+ nodeType = context.nodeType;
+
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ if ( !seed && documentIsHTML ) {
+
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType !== 1 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+ parent = doc.defaultView;
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\f]' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Support: Firefox, Chrome, Safari
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optimization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ if ( elem.ownerDocument.defaultView.opener ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ }
+
+ return window.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') (#12537)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE9-11+
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+ div.removeChild( marginDiv );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // Shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // Both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // At this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // At this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // At this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // Use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Support: IE9-11+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur(),
+ // break the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // Handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // Ensure the complete handler is called before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // Store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // Support: Android 2.3
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS<=5.1, Android<=4.2+
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE<=11+
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: Android<=2.3
+ // Options inside disabled selects are incorrectly marked as disabled
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<=11+
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // Toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // Handle most common string cases
+ ret.replace(rreturn, "") :
+ // Handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Document location
+ ajaxLocation = window.location.href,
+
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // Shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+ window.attachEvent( "onunload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // Support: BlackBerry 5, iOS 3 (original iPhone)
+ // If we don't have gBCR, just use 0,0 rather than error
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // Assume getBoundingClientRect is there when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Support: Safari<7+, Chrome<37+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/tbc/static/admin/static/admin/js/vendor/jquery/jquery.min.js b/tbc/static/admin/static/admin/js/vendor/jquery/jquery.min.js
new file mode 100644
index 0000000..49990d6
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/vendor/jquery/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
diff --git a/tbc/static/admin/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt b/tbc/static/admin/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt
new file mode 100644
index 0000000..341652a
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2007-2012 Steven Levithan <http://xregexp.com/>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tbc/static/admin/static/admin/js/vendor/xregexp/xregexp.min.js b/tbc/static/admin/static/admin/js/vendor/xregexp/xregexp.min.js
new file mode 100644
index 0000000..a190558
--- /dev/null
+++ b/tbc/static/admin/static/admin/js/vendor/xregexp/xregexp.min.js
@@ -0,0 +1,18 @@
+//XRegExp 2.0.0 <xregexp.com> MIT License
+var XRegExp;XRegExp=XRegExp||function(n){"use strict";function v(n,i,r){var u;for(u in t.prototype)t.prototype.hasOwnProperty(u)&&(n[u]=t.prototype[u]);return n.xregexp={captureNames:i,isNative:!!r},n}function g(n){return(n.global?"g":"")+(n.ignoreCase?"i":"")+(n.multiline?"m":"")+(n.extended?"x":"")+(n.sticky?"y":"")}function o(n,r,u){if(!t.isRegExp(n))throw new TypeError("type RegExp expected");var f=i.replace.call(g(n)+(r||""),h,"");return u&&(f=i.replace.call(f,new RegExp("["+u+"]+","g"),"")),n=n.xregexp&&!n.xregexp.isNative?v(t(n.source,f),n.xregexp.captureNames?n.xregexp.captureNames.slice(0):null):v(new RegExp(n.source,f),null,!0)}function a(n,t){var i=n.length;if(Array.prototype.lastIndexOf)return n.lastIndexOf(t);while(i--)if(n[i]===t)return i;return-1}function s(n,t){return Object.prototype.toString.call(n).toLowerCase()==="[object "+t+"]"}function d(n){return n=n||{},n==="all"||n.all?n={natives:!0,extensibility:!0}:s(n,"string")&&(n=t.forEach(n,/[^\s,]+/,function(n){this[n]=!0},{})),n}function ut(n,t,i,u){var o=p.length,s=null,e,f;y=!0;try{while(o--)if(f=p[o],(f.scope==="all"||f.scope===i)&&(!f.trigger||f.trigger.call(u))&&(f.pattern.lastIndex=t,e=r.exec.call(f.pattern,n),e&&e.index===t)){s={output:f.handler.call(u,e,i),match:e};break}}catch(h){throw h;}finally{y=!1}return s}function b(n){t.addToken=c[n?"on":"off"],f.extensibility=n}function tt(n){RegExp.prototype.exec=(n?r:i).exec,RegExp.prototype.test=(n?r:i).test,String.prototype.match=(n?r:i).match,String.prototype.replace=(n?r:i).replace,String.prototype.split=(n?r:i).split,f.natives=n}var t,c,u,f={natives:!1,extensibility:!1},i={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},k={},p=[],e="default",rt="class",it={"default":/^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/,"class":/^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/},et=/\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,h=/([\s\S])(?=[\s\S]*\1)/g,nt=/^(?:[?*+]|{\d+(?:,\d*)?})\??/,ft=i.exec.call(/()??/,"")[1]===n,l=RegExp.prototype.sticky!==n,y=!1,w="gim"+(l?"y":"");return t=function(r,u){if(t.isRegExp(r)){if(u!==n)throw new TypeError("can't supply flags when constructing one RegExp from another");return o(r)}if(y)throw new Error("can't call the XRegExp constructor within token definition functions");var l=[],a=e,b={hasNamedCapture:!1,captureNames:[],hasFlag:function(n){return u.indexOf(n)>-1}},f=0,c,s,p;if(r=r===n?"":String(r),u=u===n?"":String(u),i.match.call(u,h))throw new SyntaxError("invalid duplicate regular expression flag");for(r=i.replace.call(r,/^\(\?([\w$]+)\)/,function(n,t){if(i.test.call(/[gy]/,t))throw new SyntaxError("can't use flag g or y in mode modifier");return u=i.replace.call(u+t,h,""),""}),t.forEach(u,/[\s\S]/,function(n){if(w.indexOf(n[0])<0)throw new SyntaxError("invalid regular expression flag "+n[0]);});f<r.length;)c=ut(r,f,a,b),c?(l.push(c.output),f+=c.match[0].length||1):(s=i.exec.call(it[a],r.slice(f)),s?(l.push(s[0]),f+=s[0].length):(p=r.charAt(f),p==="["?a=rt:p==="]"&&(a=e),l.push(p),++f));return v(new RegExp(l.join(""),i.replace.call(u,/[^gimy]+/g,"")),b.hasNamedCapture?b.captureNames:null)},c={on:function(n,t,r){r=r||{},n&&p.push({pattern:o(n,"g"+(l?"y":"")),handler:t,scope:r.scope||e,trigger:r.trigger||null}),r.customFlags&&(w=i.replace.call(w+r.customFlags,h,""))},off:function(){throw new Error("extensibility must be installed before using addToken");}},t.addToken=c.off,t.cache=function(n,i){var r=n+"/"+(i||"");return k[r]||(k[r]=t(n,i))},t.escape=function(n){return i.replace.call(n,/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},t.exec=function(n,t,i,u){var e=o(t,"g"+(u&&l?"y":""),u===!1?"y":""),f;return e.lastIndex=i=i||0,f=r.exec.call(e,n),u&&f&&f.index!==i&&(f=null),t.global&&(t.lastIndex=f?e.lastIndex:0),f},t.forEach=function(n,i,r,u){for(var e=0,o=-1,f;f=t.exec(n,i,e);)r.call(u,f,++o,n,i),e=f.index+(f[0].length||1);return u},t.globalize=function(n){return o(n,"g")},t.install=function(n){n=d(n),!f.natives&&n.natives&&tt(!0),!f.extensibility&&n.extensibility&&b(!0)},t.isInstalled=function(n){return!!f[n]},t.isRegExp=function(n){return s(n,"regexp")},t.matchChain=function(n,i){return function r(n,u){for(var o=i[u].regex?i[u]:{regex:i[u]},f=[],s=function(n){f.push(o.backref?n[o.backref]||"":n[0])},e=0;e<n.length;++e)t.forEach(n[e],o.regex,s);return u===i.length-1||!f.length?f:r(f,u+1)}([n],0)},t.replace=function(i,u,f,e){var c=t.isRegExp(u),s=u,h;return c?(e===n&&u.global&&(e="all"),s=o(u,e==="all"?"g":"",e==="all"?"":"g")):e==="all"&&(s=new RegExp(t.escape(String(u)),"g")),h=r.replace.call(String(i),s,f),c&&u.global&&(u.lastIndex=0),h},t.split=function(n,t,i){return r.split.call(n,t,i)},t.test=function(n,i,r,u){return!!t.exec(n,i,r,u)},t.uninstall=function(n){n=d(n),f.natives&&n.natives&&tt(!1),f.extensibility&&n.extensibility&&b(!1)},t.union=function(n,i){var l=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,o=0,f,h,c=function(n,t,i){var r=h[o-f];if(t){if(++o,r)return"(?<"+r+">"}else if(i)return"\\"+(+i+f);return n},e=[],r,u;if(!(s(n,"array")&&n.length))throw new TypeError("patterns must be a nonempty array");for(u=0;u<n.length;++u)r=n[u],t.isRegExp(r)?(f=o,h=r.xregexp&&r.xregexp.captureNames||[],e.push(t(r.source).source.replace(l,c))):e.push(t.escape(r));return t(e.join("|"),i)},t.version="2.0.0",r.exec=function(t){var r,f,e,o,u;if(this.global||(o=this.lastIndex),r=i.exec.apply(this,arguments),r){if(!ft&&r.length>1&&a(r,"")>-1&&(e=new RegExp(this.source,i.replace.call(g(this),"g","")),i.replace.call(String(t).slice(r.index),e,function(){for(var t=1;t<arguments.length-2;++t)arguments[t]===n&&(r[t]=n)})),this.xregexp&&this.xregexp.captureNames)for(u=1;u<r.length;++u)f=this.xregexp.captureNames[u-1],f&&(r[f]=r[u]);this.global&&!r[0].length&&this.lastIndex>r.index&&(this.lastIndex=r.index)}return this.global||(this.lastIndex=o),r},r.test=function(n){return!!r.exec.call(this,n)},r.match=function(n){if(t.isRegExp(n)){if(n.global){var u=i.match.apply(this,arguments);return n.lastIndex=0,u}}else n=new RegExp(n);return r.exec.call(n,this)},r.replace=function(n,r){var e=t.isRegExp(n),u,f,h,o;return e?(n.xregexp&&(u=n.xregexp.captureNames),n.global||(o=n.lastIndex)):n+="",s(r,"function")?f=i.replace.call(String(this),n,function(){var t=arguments,i;if(u)for(t[0]=new String(t[0]),i=0;i<u.length;++i)u[i]&&(t[0][u[i]]=t[i+1]);return e&&n.global&&(n.lastIndex=t[t.length-2]+t[0].length),r.apply(null,t)}):(h=String(this),f=i.replace.call(h,n,function(){var n=arguments;return i.replace.call(String(r),et,function(t,i,r){var f;if(i){if(f=+i,f<=n.length-3)return n[f]||"";if(f=u?a(u,i):-1,f<0)throw new SyntaxError("backreference to undefined group "+t);return n[f+1]||""}if(r==="$")return"$";if(r==="&"||+r==0)return n[0];if(r==="`")return n[n.length-1].slice(0,n[n.length-2]);if(r==="'")return n[n.length-1].slice(n[n.length-2]+n[0].length);if(r=+r,!isNaN(r)){if(r>n.length-3)throw new SyntaxError("backreference to undefined group "+t);return n[r]||""}throw new SyntaxError("invalid token "+t);})})),e&&(n.lastIndex=n.global?0:o),f},r.split=function(r,u){if(!t.isRegExp(r))return i.split.apply(this,arguments);var e=String(this),h=r.lastIndex,f=[],o=0,s;return u=(u===n?-1:u)>>>0,t.forEach(e,r,function(n){n.index+n[0].length>o&&(f.push(e.slice(o,n.index)),n.length>1&&n.index<e.length&&Array.prototype.push.apply(f,n.slice(1)),s=n[0].length,o=n.index+s)}),o===e.length?(!i.test.call(r,"")||s)&&f.push(""):f.push(e.slice(o)),r.lastIndex=h,f.length>u?f.slice(0,u):f},u=c.on,u(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4})|x(?![\dA-Fa-f]{2}))/,function(n,t){if(n[1]==="B"&&t===e)return n[0];throw new SyntaxError("invalid escape "+n[0]);},{scope:"all"}),u(/\[(\^?)]/,function(n){return n[1]?"[\\s\\S]":"\\b\\B"}),u(/(?:\(\?#[^)]*\))+/,function(n){return i.test.call(nt,n.input.slice(n.index+n[0].length))?"":"(?:)"}),u(/\\k<([\w$]+)>/,function(n){var t=isNaN(n[1])?a(this.captureNames,n[1])+1:+n[1],i=n.index+n[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("backreference to undefined group "+n[0]);return"\\"+t+(i===n.input.length||isNaN(n.input.charAt(i))?"":"(?:)")}),u(/(?:\s+|#.*)+/,function(n){return i.test.call(nt,n.input.slice(n.index+n[0].length))?"":"(?:)"},{trigger:function(){return this.hasFlag("x")},customFlags:"x"}),u(/\./,function(){return"[\\s\\S]"},{trigger:function(){return this.hasFlag("s")},customFlags:"s"}),u(/\(\?P?<([\w$]+)>/,function(n){if(!isNaN(n[1]))throw new SyntaxError("can't use integer as capture name "+n[0]);return this.captureNames.push(n[1]),this.hasNamedCapture=!0,"("}),u(/\\(\d+)/,function(n,t){if(!(t===e&&/^[1-9]/.test(n[1])&&+n[1]<=this.captureNames.length)&&n[1]!=="0")throw new SyntaxError("can't use octal escape or backreference to undefined group "+n[0]);return n[0]},{scope:"all"}),u(/\((?!\?)/,function(){return this.hasFlag("n")?"(?:":(this.captureNames.push(null),"(")},{customFlags:"n"}),typeof exports!="undefined"&&(exports.XRegExp=t),t}();
+//XRegExp Unicode Base 1.0.0
+(function(n){"use strict";function i(n){return n.replace(/[- _]+/g,"").toLowerCase()}function s(n){return n.replace(/\w{4}/g,"\\u$&")}function u(n){while(n.length<4)n="0"+n;return n}function f(n){return parseInt(n,16)}function r(n){return parseInt(n,10).toString(16)}function o(t){var e=[],i=-1,o;return n.forEach(t,/\\u(\w{4})(?:-\\u(\w{4}))?/,function(n){o=f(n[1]),o>i+1&&(e.push("\\u"+u(r(i+1))),o>i+2&&e.push("-\\u"+u(r(o-1)))),i=f(n[2]||n[1])}),i<65535&&(e.push("\\u"+u(r(i+1))),i<65534&&e.push("-\\uFFFF")),e.join("")}function e(n){return t["^"+n]||(t["^"+n]=o(t[n]))}var t={};n.install("extensibility"),n.addUnicodePackage=function(r,u){var f;if(!n.isInstalled("extensibility"))throw new Error("extensibility must be installed before adding Unicode packages");if(r)for(f in r)r.hasOwnProperty(f)&&(t[i(f)]=s(r[f]));if(u)for(f in u)u.hasOwnProperty(f)&&(t[i(u[f])]=t[i(f)])},n.addUnicodePackage({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05270531-055605590561-058705D0-05EA05F0-05F20620-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280840-085808A008A2-08AC0904-0939093D09500958-09610971-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDAAE0-AAEAAAF2-AAF4AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC"},{L:"Letter"}),n.addToken(/\\([pP]){(\^?)([^}]*)}/,function(n,r){var f=n[1]==="P"||n[2]?"^":"",u=i(n[3]);if(n[1]==="P"&&n[2])throw new SyntaxError("invalid double negation \\P{^");if(!t.hasOwnProperty(u))throw new SyntaxError("invalid or unknown Unicode property "+n[0]);return r==="class"?f?e(u):t[u]:"["+f+t[u]+"]"},{scope:"all"})})(XRegExp);
+//XRegExp Unicode Categories 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");n.install("extensibility"),n.addUnicodePackage({Ll:"0061-007A00B500DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F05210523052505270561-05871D00-1D2B1D6B-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7B2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2CF32D00-2D252D272D2DA641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA661A663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CA78EA791A793A7A1A7A3A7A5A7A7A7A9A7FAFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E05200522052405260531-055610A0-10C510C710CD1E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CED2CF2A640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA660A662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BA78DA790A792A7A0A7A2A7A4A7A6A7A8A7AAFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D6A1D781D9B-1DBF2071207F2090-209C2C7C2C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A7F8A7F9A9CFAA70AADDAAF3AAF4FF70FF9EFF9F",Lo:"00AA00BA01BB01C0-01C3029405D0-05EA05F0-05F20620-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150840-085808A008A2-08AC0904-0939093D09500958-09610972-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA10FD-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF11CF51CF62135-21382D30-2D672D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCAAE0-AAEAAAF2AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065F067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0859-085B08E4-08FE0900-0903093A-093C093E-094F0951-0957096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F8D-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135D-135F1712-17141732-1734175217531772177317B4-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAD1BE6-1BF31C24-1C371CD0-1CD21CD4-1CE81CED1CF2-1CF41DC0-1DE61DFC-1DFF20D0-20F02CEF-2CF12D7F2DE0-2DFF302A-302F3099309AA66F-A672A674-A67DA69FA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1AAEB-AAEFAAF5AAF6ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065F067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0859-085B08E4-08FE0900-0902093A093C0941-0948094D0951-095709620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F8D-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135D-135F1712-17141732-1734175217531772177317B417B517B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91BAB1BE61BE81BE91BED1BEF-1BF11C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1CF41DC0-1DE61DFC-1DFF20D0-20DC20E120E5-20F02CEF-2CF12D7F2DE0-2DFF302A-302D3099309AA66FA674-A67DA69FA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1AAECAAEDAAF6ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093B093E-09400949-094C094E094F0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1BAC1BAD1BE71BEA-1BEC1BEE1BF21BF31C24-1C2B1C341C351CE11CF21CF3302E302FA823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BAAEBAAEEAAEFAAF5ABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048920DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0B72-0B770BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293248-324F3251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19D91A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90B72-0B770BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F919DA20702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293248-324F3251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100A700AB00B600B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E085E0964096509700AF00DF40E4F0E5A0E5B0F04-0F120F140F3A-0F3D0F850FD0-0FD40FD90FDA104A-104F10FB1360-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A194419451A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601BFC-1BFF1C3B-1C3F1C7E1C7F1CC0-1CC71CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2D702E00-2E2E2E30-2E3B3001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFAAF0AAF1ABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A2E3A2E3B301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100A700B600B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E085E0964096509700AF00DF40E4F0E5A0E5B0F04-0F120F140F850FD0-0FD40FD90FDA104A-104F10FB1360-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A194419451A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601BFC-1BFF1C3B-1C3F1C7E1C7F1CC0-1CC71CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2D702E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E30-2E393001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFAAF0AAF1ABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A600A800A900AC00AE-00B100B400B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F60482058F0606-0608060B060E060F06DE06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0D790E3F0F01-0F030F130F15-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F1390-139917DB194019DE-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B9210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23F32400-24262440-244A249C-24E92500-26FF2701-27672794-27C427C7-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-324732503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FBB2-FBC1FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C21182140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5058F060B09F209F309FB0AF10BF90E3F17DB20A0-20B9A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFBB2-FBC1FF3EFF40FFE3",So:"00A600A900AE00B00482060E060F06DE06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0D790F01-0F030F130F15-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F1390-1399194019DE-19FF1B61-1B6A1B74-1B7C210021012103-210621082109211421162117211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23F32400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26FF2701-27672794-27BF2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-324732503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20528-05300557055805600588058B-058E059005C8-05CF05EB-05EF05F5-0605061C061D06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F085C085D085F-089F08A108AD-08E308FF097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B78-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D3B0D3C0D450D490D4F-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EE0-0EFF0F480F6D-0F700F980FBD0FCD0FDB-0FFF10C610C8-10CC10CE10CF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B135C137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BF4-1BFB1C38-1C3A1C4A-1C4C1C80-1CBF1CC8-1CCF1CF7-1CFF1DE7-1DFB1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F209D-209F20BA-20CF20F1-20FF218A-218F23F4-23FF2427-243F244B-245F27002B4D-2B4F2B5A-2BFF2C2F2C5F2CF4-2CF82D262D28-2D2C2D2E2D2F2D68-2D6E2D71-2D7E2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E3C-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31BB-31BF31E4-31EF321F32FF4DB6-4DBF9FCD-9FFFA48D-A48FA4C7-A4CFA62C-A63FA698-A69EA6F8-A6FFA78FA794-A79FA7AB-A7F7A82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAF7-AB00AB07AB08AB0FAB10AB17-AB1FAB27AB2F-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBC2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060406DD070F200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20528-05300557055805600588058B-058E059005C8-05CF05EB-05EF05F5-05FF0605061C061D070E074B074C07B2-07BF07FB-07FF082E082F083F085C085D085F-089F08A108AD-08E308FF097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B78-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D3B0D3C0D450D490D4F-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EE0-0EFF0F480F6D-0F700F980FBD0FCD0FDB-0FFF10C610C8-10CC10CE10CF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B135C137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BF4-1BFB1C38-1C3A1C4A-1C4C1C80-1CBF1CC8-1CCF1CF7-1CFF1DE7-1DFB1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F209D-209F20BA-20CF20F1-20FF218A-218F23F4-23FF2427-243F244B-245F27002B4D-2B4F2B5A-2BFF2C2F2C5F2CF4-2CF82D262D28-2D2C2D2E2D2F2D68-2D6E2D71-2D7E2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E3C-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31BB-31BF31E4-31EF321F32FF4DB6-4DBF9FCD-9FFFA48D-A48FA4C7-A4CFA62C-A63FA698-A69EA6F8-A6FFA78FA794-A79FA7AB-A7F7A82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAF7-AB00AB07AB08AB0FAB10AB17-AB1FAB27AB2F-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBC2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"},{Ll:"Lowercase_Letter",Lu:"Uppercase_Letter",Lt:"Titlecase_Letter",Lm:"Modifier_Letter",Lo:"Other_Letter",M:"Mark",Mn:"Nonspacing_Mark",Mc:"Spacing_Mark",Me:"Enclosing_Mark",N:"Number",Nd:"Decimal_Number",Nl:"Letter_Number",No:"Other_Number",P:"Punctuation",Pd:"Dash_Punctuation",Ps:"Open_Punctuation",Pe:"Close_Punctuation",Pi:"Initial_Punctuation",Pf:"Final_Punctuation",Pc:"Connector_Punctuation",Po:"Other_Punctuation",S:"Symbol",Sm:"Math_Symbol",Sc:"Currency_Symbol",Sk:"Modifier_Symbol",So:"Other_Symbol",Z:"Separator",Zs:"Space_Separator",Zl:"Line_Separator",Zp:"Paragraph_Separator",C:"Other",Cc:"Control",Cf:"Format",Co:"Private_Use",Cs:"Surrogate",Cn:"Unassigned"})})(XRegExp);
+//XRegExp Unicode Scripts 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");n.install("extensibility"),n.addUnicodePackage({Arabic:"0600-06040606-060B060D-061A061E0620-063F0641-064A0656-065E066A-066F0671-06DC06DE-06FF0750-077F08A008A2-08AC08E4-08FEFB50-FBC1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFCFE70-FE74FE76-FEFC",Armenian:"0531-05560559-055F0561-0587058A058FFB13-FB17",Balinese:"1B00-1B4B1B50-1B7C",Bamum:"A6A0-A6F7",Batak:"1BC0-1BF31BFC-1BFF",Bengali:"0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BC-09C409C709C809CB-09CE09D709DC09DD09DF-09E309E6-09FB",Bopomofo:"02EA02EB3105-312D31A0-31BA",Braille:"2800-28FF",Buginese:"1A00-1A1B1A1E1A1F",Buhid:"1740-1753",Canadian_Aboriginal:"1400-167F18B0-18F5",Cham:"AA00-AA36AA40-AA4DAA50-AA59AA5C-AA5F",Cherokee:"13A0-13F4",Common:"0000-0040005B-0060007B-00A900AB-00B900BB-00BF00D700F702B9-02DF02E5-02E902EC-02FF0374037E038503870589060C061B061F06400660-066906DD096409650E3F0FD5-0FD810FB16EB-16ED173517361802180318051CD31CE11CE9-1CEC1CEE-1CF31CF51CF62000-200B200E-2064206A-20702074-207E2080-208E20A0-20B92100-21252127-2129212C-21312133-214D214F-215F21892190-23F32400-24262440-244A2460-26FF2701-27FF2900-2B4C2B50-2B592E00-2E3B2FF0-2FFB3000-300430063008-30203030-3037303C-303F309B309C30A030FB30FC3190-319F31C0-31E33220-325F327F-32CF3358-33FF4DC0-4DFFA700-A721A788-A78AA830-A839FD3EFD3FFDFDFE10-FE19FE30-FE52FE54-FE66FE68-FE6BFEFFFF01-FF20FF3B-FF40FF5B-FF65FF70FF9EFF9FFFE0-FFE6FFE8-FFEEFFF9-FFFD",Coptic:"03E2-03EF2C80-2CF32CF9-2CFF",Cyrillic:"0400-04840487-05271D2B1D782DE0-2DFFA640-A697A69F",Devanagari:"0900-09500953-09630966-09770979-097FA8E0-A8FB",Ethiopic:"1200-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135D-137C1380-13992D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDEAB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2E",Georgian:"10A0-10C510C710CD10D0-10FA10FC-10FF2D00-2D252D272D2D",Glagolitic:"2C00-2C2E2C30-2C5E",Greek:"0370-03730375-0377037A-037D038403860388-038A038C038E-03A103A3-03E103F0-03FF1D26-1D2A1D5D-1D611D66-1D6A1DBF1F00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FC41FC6-1FD31FD6-1FDB1FDD-1FEF1FF2-1FF41FF6-1FFE2126",Gujarati:"0A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABC-0AC50AC7-0AC90ACB-0ACD0AD00AE0-0AE30AE6-0AF1",Gurmukhi:"0A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3C0A3E-0A420A470A480A4B-0A4D0A510A59-0A5C0A5E0A66-0A75",Han:"2E80-2E992E9B-2EF32F00-2FD5300530073021-30293038-303B3400-4DB54E00-9FCCF900-FA6DFA70-FAD9",Hangul:"1100-11FF302E302F3131-318E3200-321E3260-327EA960-A97CAC00-D7A3D7B0-D7C6D7CB-D7FBFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Hanunoo:"1720-1734",Hebrew:"0591-05C705D0-05EA05F0-05F4FB1D-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FB4F",Hiragana:"3041-3096309D-309F",Inherited:"0300-036F04850486064B-0655065F0670095109521CD0-1CD21CD4-1CE01CE2-1CE81CED1CF41DC0-1DE61DFC-1DFF200C200D20D0-20F0302A-302D3099309AFE00-FE0FFE20-FE26",Javanese:"A980-A9CDA9CF-A9D9A9DEA9DF",Kannada:"0C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBC-0CC40CC6-0CC80CCA-0CCD0CD50CD60CDE0CE0-0CE30CE6-0CEF0CF10CF2",Katakana:"30A1-30FA30FD-30FF31F0-31FF32D0-32FE3300-3357FF66-FF6FFF71-FF9D",Kayah_Li:"A900-A92F",Khmer:"1780-17DD17E0-17E917F0-17F919E0-19FF",Lao:"0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60EC8-0ECD0ED0-0ED90EDC-0EDF",Latin:"0041-005A0061-007A00AA00BA00C0-00D600D8-00F600F8-02B802E0-02E41D00-1D251D2C-1D5C1D62-1D651D6B-1D771D79-1DBE1E00-1EFF2071207F2090-209C212A212B2132214E2160-21882C60-2C7FA722-A787A78B-A78EA790-A793A7A0-A7AAA7F8-A7FFFB00-FB06FF21-FF3AFF41-FF5A",Lepcha:"1C00-1C371C3B-1C491C4D-1C4F",Limbu:"1900-191C1920-192B1930-193B19401944-194F",Lisu:"A4D0-A4FF",Malayalam:"0D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4E0D570D60-0D630D66-0D750D79-0D7F",Mandaic:"0840-085B085E",Meetei_Mayek:"AAE0-AAF6ABC0-ABEDABF0-ABF9",Mongolian:"1800180118041806-180E1810-18191820-18771880-18AA",Myanmar:"1000-109FAA60-AA7B",New_Tai_Lue:"1980-19AB19B0-19C919D0-19DA19DE19DF",Nko:"07C0-07FA",Ogham:"1680-169C",Ol_Chiki:"1C50-1C7F",Oriya:"0B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3C-0B440B470B480B4B-0B4D0B560B570B5C0B5D0B5F-0B630B66-0B77",Phags_Pa:"A840-A877",Rejang:"A930-A953A95F",Runic:"16A0-16EA16EE-16F0",Samaritan:"0800-082D0830-083E",Saurashtra:"A880-A8C4A8CE-A8D9",Sinhala:"0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCA0DCF-0DD40DD60DD8-0DDF0DF2-0DF4",Sundanese:"1B80-1BBF1CC0-1CC7",Syloti_Nagri:"A800-A82B",Syriac:"0700-070D070F-074A074D-074F",Tagalog:"1700-170C170E-1714",Tagbanwa:"1760-176C176E-177017721773",Tai_Le:"1950-196D1970-1974",Tai_Tham:"1A20-1A5E1A60-1A7C1A7F-1A891A90-1A991AA0-1AAD",Tai_Viet:"AA80-AAC2AADB-AADF",Tamil:"0B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCD0BD00BD70BE6-0BFA",Telugu:"0C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4D0C550C560C580C590C60-0C630C66-0C6F0C78-0C7F",Thaana:"0780-07B1",Thai:"0E01-0E3A0E40-0E5B",Tibetan:"0F00-0F470F49-0F6C0F71-0F970F99-0FBC0FBE-0FCC0FCE-0FD40FD90FDA",Tifinagh:"2D30-2D672D6F2D702D7F",Vai:"A500-A62B",Yi:"A000-A48CA490-A4C6"})})(XRegExp);
+//XRegExp Unicode Blocks 1.2.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Blocks");n.install("extensibility"),n.addUnicodePackage({InBasic_Latin:"0000-007F",InLatin_1_Supplement:"0080-00FF",InLatin_Extended_A:"0100-017F",InLatin_Extended_B:"0180-024F",InIPA_Extensions:"0250-02AF",InSpacing_Modifier_Letters:"02B0-02FF",InCombining_Diacritical_Marks:"0300-036F",InGreek_and_Coptic:"0370-03FF",InCyrillic:"0400-04FF",InCyrillic_Supplement:"0500-052F",InArmenian:"0530-058F",InHebrew:"0590-05FF",InArabic:"0600-06FF",InSyriac:"0700-074F",InArabic_Supplement:"0750-077F",InThaana:"0780-07BF",InNKo:"07C0-07FF",InSamaritan:"0800-083F",InMandaic:"0840-085F",InArabic_Extended_A:"08A0-08FF",InDevanagari:"0900-097F",InBengali:"0980-09FF",InGurmukhi:"0A00-0A7F",InGujarati:"0A80-0AFF",InOriya:"0B00-0B7F",InTamil:"0B80-0BFF",InTelugu:"0C00-0C7F",InKannada:"0C80-0CFF",InMalayalam:"0D00-0D7F",InSinhala:"0D80-0DFF",InThai:"0E00-0E7F",InLao:"0E80-0EFF",InTibetan:"0F00-0FFF",InMyanmar:"1000-109F",InGeorgian:"10A0-10FF",InHangul_Jamo:"1100-11FF",InEthiopic:"1200-137F",InEthiopic_Supplement:"1380-139F",InCherokee:"13A0-13FF",InUnified_Canadian_Aboriginal_Syllabics:"1400-167F",InOgham:"1680-169F",InRunic:"16A0-16FF",InTagalog:"1700-171F",InHanunoo:"1720-173F",InBuhid:"1740-175F",InTagbanwa:"1760-177F",InKhmer:"1780-17FF",InMongolian:"1800-18AF",InUnified_Canadian_Aboriginal_Syllabics_Extended:"18B0-18FF",InLimbu:"1900-194F",InTai_Le:"1950-197F",InNew_Tai_Lue:"1980-19DF",InKhmer_Symbols:"19E0-19FF",InBuginese:"1A00-1A1F",InTai_Tham:"1A20-1AAF",InBalinese:"1B00-1B7F",InSundanese:"1B80-1BBF",InBatak:"1BC0-1BFF",InLepcha:"1C00-1C4F",InOl_Chiki:"1C50-1C7F",InSundanese_Supplement:"1CC0-1CCF",InVedic_Extensions:"1CD0-1CFF",InPhonetic_Extensions:"1D00-1D7F",InPhonetic_Extensions_Supplement:"1D80-1DBF",InCombining_Diacritical_Marks_Supplement:"1DC0-1DFF",InLatin_Extended_Additional:"1E00-1EFF",InGreek_Extended:"1F00-1FFF",InGeneral_Punctuation:"2000-206F",InSuperscripts_and_Subscripts:"2070-209F",InCurrency_Symbols:"20A0-20CF",InCombining_Diacritical_Marks_for_Symbols:"20D0-20FF",InLetterlike_Symbols:"2100-214F",InNumber_Forms:"2150-218F",InArrows:"2190-21FF",InMathematical_Operators:"2200-22FF",InMiscellaneous_Technical:"2300-23FF",InControl_Pictures:"2400-243F",InOptical_Character_Recognition:"2440-245F",InEnclosed_Alphanumerics:"2460-24FF",InBox_Drawing:"2500-257F",InBlock_Elements:"2580-259F",InGeometric_Shapes:"25A0-25FF",InMiscellaneous_Symbols:"2600-26FF",InDingbats:"2700-27BF",InMiscellaneous_Mathematical_Symbols_A:"27C0-27EF",InSupplemental_Arrows_A:"27F0-27FF",InBraille_Patterns:"2800-28FF",InSupplemental_Arrows_B:"2900-297F",InMiscellaneous_Mathematical_Symbols_B:"2980-29FF",InSupplemental_Mathematical_Operators:"2A00-2AFF",InMiscellaneous_Symbols_and_Arrows:"2B00-2BFF",InGlagolitic:"2C00-2C5F",InLatin_Extended_C:"2C60-2C7F",InCoptic:"2C80-2CFF",InGeorgian_Supplement:"2D00-2D2F",InTifinagh:"2D30-2D7F",InEthiopic_Extended:"2D80-2DDF",InCyrillic_Extended_A:"2DE0-2DFF",InSupplemental_Punctuation:"2E00-2E7F",InCJK_Radicals_Supplement:"2E80-2EFF",InKangxi_Radicals:"2F00-2FDF",InIdeographic_Description_Characters:"2FF0-2FFF",InCJK_Symbols_and_Punctuation:"3000-303F",InHiragana:"3040-309F",InKatakana:"30A0-30FF",InBopomofo:"3100-312F",InHangul_Compatibility_Jamo:"3130-318F",InKanbun:"3190-319F",InBopomofo_Extended:"31A0-31BF",InCJK_Strokes:"31C0-31EF",InKatakana_Phonetic_Extensions:"31F0-31FF",InEnclosed_CJK_Letters_and_Months:"3200-32FF",InCJK_Compatibility:"3300-33FF",InCJK_Unified_Ideographs_Extension_A:"3400-4DBF",InYijing_Hexagram_Symbols:"4DC0-4DFF",InCJK_Unified_Ideographs:"4E00-9FFF",InYi_Syllables:"A000-A48F",InYi_Radicals:"A490-A4CF",InLisu:"A4D0-A4FF",InVai:"A500-A63F",InCyrillic_Extended_B:"A640-A69F",InBamum:"A6A0-A6FF",InModifier_Tone_Letters:"A700-A71F",InLatin_Extended_D:"A720-A7FF",InSyloti_Nagri:"A800-A82F",InCommon_Indic_Number_Forms:"A830-A83F",InPhags_pa:"A840-A87F",InSaurashtra:"A880-A8DF",InDevanagari_Extended:"A8E0-A8FF",InKayah_Li:"A900-A92F",InRejang:"A930-A95F",InHangul_Jamo_Extended_A:"A960-A97F",InJavanese:"A980-A9DF",InCham:"AA00-AA5F",InMyanmar_Extended_A:"AA60-AA7F",InTai_Viet:"AA80-AADF",InMeetei_Mayek_Extensions:"AAE0-AAFF",InEthiopic_Extended_A:"AB00-AB2F",InMeetei_Mayek:"ABC0-ABFF",InHangul_Syllables:"AC00-D7AF",InHangul_Jamo_Extended_B:"D7B0-D7FF",InHigh_Surrogates:"D800-DB7F",InHigh_Private_Use_Surrogates:"DB80-DBFF",InLow_Surrogates:"DC00-DFFF",InPrivate_Use_Area:"E000-F8FF",InCJK_Compatibility_Ideographs:"F900-FAFF",InAlphabetic_Presentation_Forms:"FB00-FB4F",InArabic_Presentation_Forms_A:"FB50-FDFF",InVariation_Selectors:"FE00-FE0F",InVertical_Forms:"FE10-FE1F",InCombining_Half_Marks:"FE20-FE2F",InCJK_Compatibility_Forms:"FE30-FE4F",InSmall_Form_Variants:"FE50-FE6F",InArabic_Presentation_Forms_B:"FE70-FEFF",InHalfwidth_and_Fullwidth_Forms:"FF00-FFEF",InSpecials:"FFF0-FFFF"})})(XRegExp);
+//XRegExp Unicode Properties 1.0.0
+(function(n){"use strict";if(!n.addUnicodePackage)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");n.install("extensibility"),n.addUnicodePackage({Alphabetic:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE03450370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05270531-055605590561-058705B0-05BD05BF05C105C205C405C505C705D0-05EA05F0-05F20610-061A0620-06570659-065F066E-06D306D5-06DC06E1-06E806ED-06EF06FA-06FC06FF0710-073F074D-07B107CA-07EA07F407F507FA0800-0817081A-082C0840-085808A008A2-08AC08E4-08E908F0-08FE0900-093B093D-094C094E-09500955-09630971-09770979-097F0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BD-09C409C709C809CB09CC09CE09D709DC09DD09DF-09E309F009F10A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3E-0A420A470A480A4B0A4C0A510A59-0A5C0A5E0A70-0A750A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD-0AC50AC7-0AC90ACB0ACC0AD00AE0-0AE30B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D-0B440B470B480B4B0B4C0B560B570B5C0B5D0B5F-0B630B710B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCC0BD00BD70C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4C0C550C560C580C590C60-0C630C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD-0CC40CC6-0CC80CCA-0CCC0CD50CD60CDE0CE0-0CE30CF10CF20D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4C0D4E0D570D60-0D630D7A-0D7F0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCF-0DD40DD60DD8-0DDF0DF20DF30E01-0E3A0E40-0E460E4D0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60ECD0EDC-0EDF0F000F40-0F470F49-0F6C0F71-0F810F88-0F970F99-0FBC1000-10361038103B-103F1050-10621065-1068106E-1086108E109C109D10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135F1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA16EE-16F01700-170C170E-17131720-17331740-17531760-176C176E-1770177217731780-17B317B6-17C817D717DC1820-18771880-18AA18B0-18F51900-191C1920-192B1930-19381950-196D1970-19741980-19AB19B0-19C91A00-1A1B1A20-1A5E1A61-1A741AA71B00-1B331B35-1B431B45-1B4B1B80-1BA91BAC-1BAF1BBA-1BE51BE7-1BF11C00-1C351C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF31CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E2160-218824B6-24E92C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2DE0-2DFF2E2F3005-30073021-30293031-30353038-303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA674-A67BA67F-A697A69F-A6EFA717-A71FA722-A788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A827A840-A873A880-A8C3A8F2-A8F7A8FBA90A-A92AA930-A952A960-A97CA980-A9B2A9B4-A9BFA9CFAA00-AA36AA40-AA4DAA60-AA76AA7AAA80-AABEAAC0AAC2AADB-AADDAAE0-AAEFAAF2-AAF5AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABEAAC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1D-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Uppercase:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E05200522052405260531-055610A0-10C510C710CD1E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F21452160-216F218324B6-24CF2C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CED2CF2A640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA660A662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BA78DA790A792A7A0A7A2A7A4A7A6A7A8A7AAFF21-FF3A",Lowercase:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02B802C002C102E0-02E40345037103730377037A-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F05210523052505270561-05871D00-1DBF1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF72071207F2090-209C210A210E210F2113212F21342139213C213D2146-2149214E2170-217F218424D0-24E92C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7D2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2CF32D00-2D252D272D2DA641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA661A663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76F-A778A77AA77CA77FA781A783A785A787A78CA78EA791A793A7A1A7A3A7A5A7A7A7A9A7F8-A7FAFB00-FB06FB13-FB17FF41-FF5A",White_Space:"0009-000D0020008500A01680180E2000-200A20282029202F205F3000",Noncharacter_Code_Point:"FDD0-FDEFFFFEFFFF",Default_Ignorable_Code_Point:"00AD034F115F116017B417B5180B-180D200B-200F202A-202E2060-206F3164FE00-FE0FFEFFFFA0FFF0-FFF8",Any:"0000-FFFF",Ascii:"0000-007F",Assigned:"0000-0377037A-037E0384-038A038C038E-03A103A3-05270531-05560559-055F0561-05870589058A058F0591-05C705D0-05EA05F0-05F40600-06040606-061B061E-070D070F-074A074D-07B107C0-07FA0800-082D0830-083E0840-085B085E08A008A2-08AC08E4-08FE0900-09770979-097F0981-09830985-098C098F09900993-09A809AA-09B009B209B6-09B909BC-09C409C709C809CB-09CE09D709DC09DD09DF-09E309E6-09FB0A01-0A030A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A3C0A3E-0A420A470A480A4B-0A4D0A510A59-0A5C0A5E0A66-0A750A81-0A830A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABC-0AC50AC7-0AC90ACB-0ACD0AD00AE0-0AE30AE6-0AF10B01-0B030B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3C-0B440B470B480B4B-0B4D0B560B570B5C0B5D0B5F-0B630B66-0B770B820B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BBE-0BC20BC6-0BC80BCA-0BCD0BD00BD70BE6-0BFA0C01-0C030C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D-0C440C46-0C480C4A-0C4D0C550C560C580C590C60-0C630C66-0C6F0C78-0C7F0C820C830C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBC-0CC40CC6-0CC80CCA-0CCD0CD50CD60CDE0CE0-0CE30CE6-0CEF0CF10CF20D020D030D05-0D0C0D0E-0D100D12-0D3A0D3D-0D440D46-0D480D4A-0D4E0D570D60-0D630D66-0D750D79-0D7F0D820D830D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60DCA0DCF-0DD40DD60DD8-0DDF0DF2-0DF40E01-0E3A0E3F-0E5B0E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB90EBB-0EBD0EC0-0EC40EC60EC8-0ECD0ED0-0ED90EDC-0EDF0F00-0F470F49-0F6C0F71-0F970F99-0FBC0FBE-0FCC0FCE-0FDA1000-10C510C710CD10D0-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A135D-137C1380-139913A0-13F41400-169C16A0-16F01700-170C170E-17141720-17361740-17531760-176C176E-1770177217731780-17DD17E0-17E917F0-17F91800-180E1810-18191820-18771880-18AA18B0-18F51900-191C1920-192B1930-193B19401944-196D1970-19741980-19AB19B0-19C919D0-19DA19DE-1A1B1A1E-1A5E1A60-1A7C1A7F-1A891A90-1A991AA0-1AAD1B00-1B4B1B50-1B7C1B80-1BF31BFC-1C371C3B-1C491C4D-1C7F1CC0-1CC71CD0-1CF61D00-1DE61DFC-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FC41FC6-1FD31FD6-1FDB1FDD-1FEF1FF2-1FF41FF6-1FFE2000-2064206A-20712074-208E2090-209C20A0-20B920D0-20F02100-21892190-23F32400-24262440-244A2460-26FF2701-2B4C2B50-2B592C00-2C2E2C30-2C5E2C60-2CF32CF9-2D252D272D2D2D30-2D672D6F2D702D7F-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2DE0-2E3B2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB3000-303F3041-30963099-30FF3105-312D3131-318E3190-31BA31C0-31E331F0-321E3220-32FE3300-4DB54DC0-9FCCA000-A48CA490-A4C6A4D0-A62BA640-A697A69F-A6F7A700-A78EA790-A793A7A0-A7AAA7F8-A82BA830-A839A840-A877A880-A8C4A8CE-A8D9A8E0-A8FBA900-A953A95F-A97CA980-A9CDA9CF-A9D9A9DEA9DFAA00-AA36AA40-AA4DAA50-AA59AA5C-AA7BAA80-AAC2AADB-AAF6AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABEDABF0-ABF9AC00-D7A3D7B0-D7C6D7CB-D7FBD800-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1D-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBC1FBD3-FD3FFD50-FD8FFD92-FDC7FDF0-FDFDFE00-FE19FE20-FE26FE30-FE52FE54-FE66FE68-FE6BFE70-FE74FE76-FEFCFEFFFF01-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDCFFE0-FFE6FFE8-FFEEFFF9-FFFD"})})(XRegExp);
+//XRegExp.matchRecursive 0.2.0
+(function(n){"use strict";function t(n,t,i,r){return{value:n,name:t,start:i,end:r}}n.matchRecursive=function(i,r,u,f,e){f=f||"",e=e||{};var g=f.indexOf("g")>-1,nt=f.indexOf("y")>-1,d=f.replace(/y/g,""),y=e.escapeChar,o=e.valueNames,v=[],b=0,h=0,s=0,c=0,p,w,l,a,k;if(r=n(r,d),u=n(u,d),y){if(y.length>1)throw new SyntaxError("can't use more than one escape character");y=n.escape(y),k=new RegExp("(?:"+y+"[\\S\\s]|(?:(?!"+n.union([r,u]).source+")[^"+y+"])+)+",f.replace(/[^im]+/g,""))}for(;;){if(y&&(s+=(n.exec(i,k,s,"sticky")||[""])[0].length),l=n.exec(i,r,s),a=n.exec(i,u,s),l&&a&&(l.index<=a.index?a=null:l=null),l||a)h=(l||a).index,s=h+(l||a)[0].length;else if(!b)break;if(nt&&!b&&h>c)break;if(l)b||(p=h,w=s),++b;else if(a&&b){if(!--b&&(o?(o[0]&&p>c&&v.push(t(o[0],i.slice(c,p),c,p)),o[1]&&v.push(t(o[1],i.slice(p,w),p,w)),o[2]&&v.push(t(o[2],i.slice(w,h),w,h)),o[3]&&v.push(t(o[3],i.slice(h,s),h,s))):v.push(i.slice(w,h)),c=s,!g))break}else throw new Error("string contains unbalanced delimiters");h===s&&++s}return g&&!nt&&o&&o[0]&&i.length>c&&v.push(t(o[0],i.slice(c),c,i.length)),v}})(XRegExp);
+//XRegExp.build 0.1.0
+(function(n){"use strict";function u(n){var i=/^(?:\(\?:\))?\^/,t=/\$(?:\(\?:\))?$/;return t.test(n.replace(/\\[\s\S]/g,""))?n.replace(i,"").replace(t,""):n}function t(t){return n.isRegExp(t)?t.xregexp&&!t.xregexp.isNative?t:n(t.source):n(t)}var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*]/g,r=n.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,i],"g");n.build=function(f,e,o){var w=/^\(\?([\w$]+)\)/.exec(f),l={},s=0,v,h=0,p=[0],y,a,c;w&&(o=o||"",w[1].replace(/./g,function(n){o+=o.indexOf(n)>-1?"":n}));for(c in e)e.hasOwnProperty(c)&&(a=t(e[c]),l[c]={pattern:u(a.source),names:a.xregexp.captureNames||[]});return f=t(f),y=f.xregexp.captureNames||[],f=f.source.replace(r,function(n,t,r,u,f){var o=t||r,e,c;if(o){if(!l.hasOwnProperty(o))throw new ReferenceError("undefined property "+n);return t?(e=y[h],p[++h]=++s,c="(?<"+(e||o)+">"):c="(?:",v=s,c+l[o].pattern.replace(i,function(n,t,i){if(t){if(e=l[o].names[s-v],++s,e)return"(?<"+e+">"}else if(i)return"\\"+(+i+v);return n})+")"}if(u){if(e=y[h],p[++h]=++s,e)return"(?<"+e+">"}else if(f)return"\\"+p[+f];return n}),n(f,o)}})(XRegExp);
+//XRegExp Prototype Methods 1.0.0
+(function(n){"use strict";function t(n,t){for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i])}t(n.prototype,{apply:function(n,t){return this.test(t[0])},call:function(n,t){return this.test(t)},forEach:function(t,i,r){return n.forEach(t,this,i,r)},globalize:function(){return n.globalize(this)},xexec:function(t,i,r){return n.exec(t,this,i,r)},xtest:function(t,i,r){return n.test(t,this,i,r)}})})(XRegExp)
diff --git a/tbc/static/admin/templates/admin/404.html b/tbc/static/admin/templates/admin/404.html
new file mode 100644
index 0000000..9bf4293
--- /dev/null
+++ b/tbc/static/admin/templates/admin/404.html
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block title %}{% trans 'Page not found' %}{% endblock %}
+
+{% block content %}
+
+<h2>{% trans 'Page not found' %}</h2>
+
+<p>{% trans "We're sorry, but the requested page could not be found." %}</p>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/500.html b/tbc/static/admin/templates/admin/500.html
new file mode 100644
index 0000000..4842faa
--- /dev/null
+++ b/tbc/static/admin/templates/admin/500.html
@@ -0,0 +1,17 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Server error' %}
+</div>
+{% endblock %}
+
+{% block title %}{% trans 'Server error (500)' %}{% endblock %}
+
+{% block content %}
+<h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
+<p>{% trans "There's been an error. It's been reported to the site administrators via email and should be fixed shortly. Thanks for your patience." %}</p>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/actions.html b/tbc/static/admin/templates/admin/actions.html
new file mode 100644
index 0000000..aaaa245
--- /dev/null
+++ b/tbc/static/admin/templates/admin/actions.html
@@ -0,0 +1,16 @@
+{% load i18n %}
+<div class="actions">
+ {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% endif %}{% endfor %}
+ <button type="submit" class="button" title="{% trans "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% trans "Go" %}</button>
+ {% if actions_selection_counter %}
+ <script type="text/javascript">var _actions_icnt="{{ cl.result_list|length|default:"0" }}";</script>
+ <span class="action-counter">{{ selection_note }}</span>
+ {% if cl.result_count != cl.result_list|length %}
+ <span class="all">{{ selection_note_all }}</span>
+ <span class="question">
+ <a href="javascript:;" title="{% trans "Click here to select the objects across all pages" %}">{% blocktrans with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktrans %}</a>
+ </span>
+ <span class="clear"><a href="javascript:;">{% trans "Clear selection" %}</a></span>
+ {% endif %}
+ {% endif %}
+</div>
diff --git a/tbc/static/admin/templates/admin/app_index.html b/tbc/static/admin/templates/admin/app_index.html
new file mode 100644
index 0000000..6868b49
--- /dev/null
+++ b/tbc/static/admin/templates/admin/app_index.html
@@ -0,0 +1,18 @@
+{% extends "admin/index.html" %}
+{% load i18n %}
+
+{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %}
+
+{% if not is_popup %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo;
+{% for app in app_list %}
+{{ app.name }}
+{% endfor %}
+</div>
+{% endblock %}
+{% endif %}
+
+{% block sidebar %}{% endblock %}
diff --git a/tbc/static/admin/templates/admin/auth/user/add_form.html b/tbc/static/admin/templates/admin/auth/user/add_form.html
new file mode 100644
index 0000000..c8889eb
--- /dev/null
+++ b/tbc/static/admin/templates/admin/auth/user/add_form.html
@@ -0,0 +1,14 @@
+{% extends "admin/change_form.html" %}
+{% load i18n %}
+
+{% block form_top %}
+ {% if not is_popup %}
+ <p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p>
+ {% else %}
+ <p>{% trans "Enter a username and password." %}</p>
+ {% endif %}
+{% endblock %}
+
+{% block after_field_sets %}
+<script type="text/javascript">document.getElementById("id_username").focus();</script>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/auth/user/change_password.html b/tbc/static/admin/templates/admin/auth/user/change_password.html
new file mode 100644
index 0000000..c788571
--- /dev/null
+++ b/tbc/static/admin/templates/admin/auth/user/change_password.html
@@ -0,0 +1,60 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_static %}
+{% load admin_urls %}
+
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
+{% endblock %}
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %}
+{% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form{% endblock %}
+{% if not is_popup %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a>
+&rsaquo; {% trans 'Change password' %}
+</div>
+{% endblock %}
+{% endif %}
+{% block content %}<div id="content-main">
+<form action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if form.errors %}
+ <p class="errornote">
+ {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+ </p>
+{% endif %}
+
+<p>{% blocktrans with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p>
+
+<fieldset class="module aligned">
+
+<div class="form-row">
+ {{ form.password1.errors }}
+ {{ form.password1.label_tag }} {{ form.password1 }}
+ {% if form.password1.help_text %}
+ <p class="help">{{ form.password1.help_text|safe }}</p>
+ {% endif %}
+</div>
+
+<div class="form-row">
+ {{ form.password2.errors }}
+ {{ form.password2.label_tag }} {{ form.password2 }}
+ {% if form.password2.help_text %}
+ <p class="help">{{ form.password2.help_text|safe }}</p>
+ {% endif %}
+</div>
+
+</fieldset>
+
+<div class="submit-row">
+<input type="submit" value="{% trans 'Change password' %}" class="default" />
+</div>
+
+<script type="text/javascript">document.getElementById("id_password1").focus();</script>
+</div>
+</form></div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/base.html b/tbc/static/admin/templates/admin/base.html
new file mode 100644
index 0000000..ad8663f
--- /dev/null
+++ b/tbc/static/admin/templates/admin/base.html
@@ -0,0 +1,88 @@
+{% load i18n admin_static %}<!DOCTYPE html>
+{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
+<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" />
+{% block extrastyle %}{% endblock %}
+{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}" />{% endif %}
+{% block extrahead %}{% endblock %}
+{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
+</head>
+{% load i18n %}
+
+<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}"
+ data-admin-utc-offset="{% now "Z" %}">
+
+<!-- Container -->
+<div id="container">
+
+ {% if not is_popup %}
+ <!-- Header -->
+ <div id="header">
+ <div id="branding">
+ {% block branding %}{% endblock %}
+ </div>
+ {% block usertools %}
+ {% if has_permission %}
+ <div id="user-tools">
+ {% block welcome-msg %}
+ {% trans 'Welcome,' %}
+ <strong>{% firstof user.get_short_name user.get_username %}</strong>.
+ {% endblock %}
+ {% block userlinks %}
+ {% if site_url %}
+ <a href="{{ site_url }}">{% trans 'View site' %}</a> /
+ {% endif %}
+ {% if user.is_active and user.is_staff %}
+ {% url 'django-admindocs-docroot' as docsroot %}
+ {% if docsroot %}
+ <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
+ {% endif %}
+ {% endif %}
+ {% if user.has_usable_password %}
+ <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
+ {% endif %}
+ <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
+ {% endblock %}
+ </div>
+ {% endif %}
+ {% endblock %}
+ {% block nav-global %}{% endblock %}
+ </div>
+ <!-- END Header -->
+ {% block breadcrumbs %}
+ <div class="breadcrumbs">
+ <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+ {% if title %} &rsaquo; {{ title }}{% endif %}
+ </div>
+ {% endblock %}
+ {% endif %}
+
+ {% block messages %}
+ {% if messages %}
+ <ul class="messagelist">{% for message in messages %}
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li>
+ {% endfor %}</ul>
+ {% endif %}
+ {% endblock messages %}
+
+ <!-- Content -->
+ <div id="content" class="{% block coltype %}colM{% endblock %}">
+ {% block pretitle %}{% endblock %}
+ {% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
+ {% block content %}
+ {% block object-tools %}{% endblock %}
+ {{ content }}
+ {% endblock %}
+ {% block sidebar %}{% endblock %}
+ <br class="clear" />
+ </div>
+ <!-- END Content -->
+
+ {% block footer %}<div id="footer"></div>{% endblock %}
+</div>
+<!-- END Container -->
+
+</body>
+</html>
diff --git a/tbc/static/admin/templates/admin/base_site.html b/tbc/static/admin/templates/admin/base_site.html
new file mode 100644
index 0000000..cae0a69
--- /dev/null
+++ b/tbc/static/admin/templates/admin/base_site.html
@@ -0,0 +1,9 @@
+{% extends "admin/base.html" %}
+
+{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
+
+{% block branding %}
+<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}
diff --git a/tbc/static/admin/templates/admin/change_form.html b/tbc/static/admin/templates/admin/change_form.html
new file mode 100644
index 0000000..0e2255f
--- /dev/null
+++ b/tbc/static/admin/templates/admin/change_form.html
@@ -0,0 +1,122 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls admin_static admin_modify %}
+
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
+{{ media }}
+{% endblock %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %}
+
+{% block coltype %}colM{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %}
+
+{% if not is_popup %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
+&rsaquo; {% if has_change_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %}
+&rsaquo; {% if add %}{% trans 'Add' %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
+</div>
+{% endblock %}
+{% endif %}
+
+{% block content %}<div id="content-main">
+{% block object-tools %}
+{% if change %}{% if not is_popup %}
+ <ul class="object-tools">
+ {% block object-tools-items %}
+ <li>
+ {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
+ <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
+ </li>
+ {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
+ {% endblock %}
+ </ul>
+{% endif %}{% endif %}
+{% endblock %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
+{% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}
+{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
+{% if errors %}
+ <p class="errornote">
+ {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+ </p>
+ {{ adminform.form.non_field_errors }}
+{% endif %}
+
+{% block field_sets %}
+{% for fieldset in adminform %}
+ {% include "admin/includes/fieldset.html" %}
+{% endfor %}
+{% endblock %}
+
+{% block after_field_sets %}{% endblock %}
+
+{% block inline_field_sets %}
+{% for inline_admin_formset in inline_admin_formsets %}
+ {% include inline_admin_formset.opts.template %}
+{% endfor %}
+{% endblock %}
+
+{% block after_related_objects %}{% endblock %}
+
+{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
+
+{% block admin_change_form_document_ready %}
+ <script type="text/javascript">
+ (function($) {
+ $(document).ready(function() {
+ $('.add-another').click(function(e) {
+ e.preventDefault();
+ var event = $.Event('django:add-another-related');
+ $(this).trigger(event);
+ if (!event.isDefaultPrevented()) {
+ showAddAnotherPopup(this);
+ }
+ });
+ $('.related-lookup').click(function(e) {
+ e.preventDefault();
+ var event = $.Event('django:lookup-related');
+ $(this).trigger(event);
+ if (!event.isDefaultPrevented()) {
+ showRelatedObjectLookupPopup(this);
+ }
+ });
+ $('body').on('click', '.related-widget-wrapper-link', function(e) {
+ e.preventDefault();
+ if (this.href) {
+ var event = $.Event('django:show-related', {href: this.href});
+ $(this).trigger(event);
+ if (!event.isDefaultPrevented()) {
+ showRelatedObjectPopup(this);
+ }
+ }
+ });
+ $('body').on('change', '.related-widget-wrapper select', function(e) {
+ var event = $.Event('django:update-related');
+ $(this).trigger(event);
+ if (!event.isDefaultPrevented()) {
+ updateRelatedObjectLinks(this);
+ }
+ });
+ $('.related-widget-wrapper select').trigger('change');
+
+ {% if adminform and add %}
+ $('form#{{ opts.model_name }}_form :input:visible:enabled:first').focus()
+ {% endif %}
+ });
+ })(django.jQuery);
+ </script>
+{% endblock %}
+
+{# JavaScript for prepopulated fields #}
+{% prepopulated_fields_js %}
+
+</div>
+</form></div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/change_list.html b/tbc/static/admin/templates/admin/change_list.html
new file mode 100644
index 0000000..0bd44d9
--- /dev/null
+++ b/tbc/static/admin/templates/admin/change_list.html
@@ -0,0 +1,98 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls admin_static admin_list %}
+
+{% block extrastyle %}
+ {{ block.super }}
+ <link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" />
+ {% if cl.formset %}
+ <link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />
+ {% endif %}
+ {% if cl.formset or action_form %}
+ <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
+ {% endif %}
+ {{ media.css }}
+ {% if not actions_on_top and not actions_on_bottom %}
+ <style>
+ #changelist table thead th:first-child {width: inherit}
+ </style>
+ {% endif %}
+{% endblock %}
+
+{% block extrahead %}
+{{ block.super }}
+{{ media.js }}
+{% if action_form %}{% if actions_on_top or actions_on_bottom %}
+<script type="text/javascript">
+(function($) {
+ $(document).ready(function($) {
+ $("tr input.action-select").actions();
+ });
+})(django.jQuery);
+</script>
+{% endif %}{% endif %}
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %}
+
+{% if not is_popup %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a>
+&rsaquo; {{ cl.opts.verbose_name_plural|capfirst }}
+</div>
+{% endblock %}
+{% endif %}
+
+{% block coltype %}flex{% endblock %}
+
+{% block content %}
+ <div id="content-main">
+ {% block object-tools %}
+ {% if has_add_permission %}
+ <ul class="object-tools">
+ {% block object-tools-items %}
+ <li>
+ {% url cl.opts|admin_urlname:'add' as add_url %}
+ <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
+ {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
+ </a>
+ </li>
+ {% endblock %}
+ </ul>
+ {% endif %}
+ {% endblock %}
+ {% if cl.formset.errors %}
+ <p class="errornote">
+ {% if cl.formset.total_error_count == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+ </p>
+ {{ cl.formset.non_form_errors }}
+ {% endif %}
+ <div class="module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
+ {% block search %}{% search_form cl %}{% endblock %}
+ {% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %}
+
+ {% block filters %}
+ {% if cl.has_filters %}
+ <div id="changelist-filter">
+ <h2>{% trans 'Filter' %}</h2>
+ {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %}
+ </div>
+ {% endif %}
+ {% endblock %}
+
+ <form id="changelist-form" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>{% csrf_token %}
+ {% if cl.formset %}
+ <div>{{ cl.formset.management_form }}</div>
+ {% endif %}
+
+ {% block result_list %}
+ {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
+ {% result_list cl %}
+ {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
+ {% endblock %}
+ {% block pagination %}{% pagination cl %}{% endblock %}
+ </form>
+ </div>
+ </div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/change_list_results.html b/tbc/static/admin/templates/admin/change_list_results.html
new file mode 100644
index 0000000..e3d4b25
--- /dev/null
+++ b/tbc/static/admin/templates/admin/change_list_results.html
@@ -0,0 +1,38 @@
+{% load i18n admin_static %}
+{% if result_hidden_fields %}
+<div class="hiddenfields">{# DIV for HTML validation #}
+{% for item in result_hidden_fields %}{{ item }}{% endfor %}
+</div>
+{% endif %}
+{% if results %}
+<div class="results">
+<table id="result_list">
+<thead>
+<tr>
+{% for header in result_headers %}
+<th scope="col" {{ header.class_attrib }}>
+ {% if header.sortable %}
+ {% if header.sort_priority > 0 %}
+ <div class="sortoptions">
+ <a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a>
+ {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %}
+ <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a>
+ </div>
+ {% endif %}
+ {% endif %}
+ <div class="text">{% if header.sortable %}<a href="{{ header.url_primary }}">{{ header.text|capfirst }}</a>{% else %}<span>{{ header.text|capfirst }}</span>{% endif %}</div>
+ <div class="clear"></div>
+</th>{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% for result in results %}
+{% if result.form.non_field_errors %}
+ <tr><td colspan="{{ result|length }}">{{ result.form.non_field_errors }}</td></tr>
+{% endif %}
+<tr class="{% cycle 'row1' 'row2' %}">{% for item in result %}{{ item }}{% endfor %}</tr>
+{% endfor %}
+</tbody>
+</table>
+</div>
+{% endif %}
diff --git a/tbc/static/admin/templates/admin/date_hierarchy.html b/tbc/static/admin/templates/admin/date_hierarchy.html
new file mode 100644
index 0000000..0058510
--- /dev/null
+++ b/tbc/static/admin/templates/admin/date_hierarchy.html
@@ -0,0 +1,10 @@
+{% if show %}
+<div class="xfull">
+<ul class="toplinks">
+{% if back %}<li class="date-back"><a href="{{ back.link }}">&lsaquo; {{ back.title }}</a></li>{% endif %}
+{% for choice in choices %}
+<li> {% if choice.link %}<a href="{{ choice.link }}">{% endif %}{{ choice.title }}{% if choice.link %}</a>{% endif %}</li>
+{% endfor %}
+</ul><br class="clear" />
+</div>
+{% endif %}
diff --git a/tbc/static/admin/templates/admin/delete_confirmation.html b/tbc/static/admin/templates/admin/delete_confirmation.html
new file mode 100644
index 0000000..bc26bca
--- /dev/null
+++ b/tbc/static/admin/templates/admin/delete_confirmation.html
@@ -0,0 +1,46 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation{% endblock %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst|escape }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a>
+&rsaquo; {% trans 'Delete' %}
+</div>
+{% endblock %}
+
+{% block content %}
+{% if perms_lacking %}
+ <p>{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p>
+ <ul>
+ {% for obj in perms_lacking %}
+ <li>{{ obj }}</li>
+ {% endfor %}
+ </ul>
+{% elif protected %}
+ <p>{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktrans %}</p>
+ <ul>
+ {% for obj in protected %}
+ <li>{{ obj }}</li>
+ {% endfor %}
+ </ul>
+{% else %}
+ <p>{% blocktrans with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}</p>
+ {% include "admin/includes/object_delete_summary.html" %}
+ <h2>{% trans "Objects" %}</h2>
+ <ul>{{ deleted_objects|unordered_list }}</ul>
+ <form method="post">{% csrf_token %}
+ <div>
+ <input type="hidden" name="post" value="yes" />
+ {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
+ {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}
+ <input type="submit" value="{% trans "Yes, I'm sure" %}" />
+ <a href="#" onclick="window.history.back(); return false;" class="button cancel-link">{% trans "No, take me back" %}</a>
+ </div>
+ </form>
+{% endif %}
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/delete_selected_confirmation.html b/tbc/static/admin/templates/admin/delete_selected_confirmation.html
new file mode 100644
index 0000000..5ebd643
--- /dev/null
+++ b/tbc/static/admin/templates/admin/delete_selected_confirmation.html
@@ -0,0 +1,49 @@
+{% extends "admin/base_site.html" %}
+{% load i18n l10n admin_urls %}
+
+{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
+&rsaquo; {% trans 'Delete multiple objects' %}
+</div>
+{% endblock %}
+
+{% block content %}
+{% if perms_lacking %}
+ <p>{% blocktrans %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p>
+ <ul>
+ {% for obj in perms_lacking %}
+ <li>{{ obj }}</li>
+ {% endfor %}
+ </ul>
+{% elif protected %}
+ <p>{% blocktrans %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktrans %}</p>
+ <ul>
+ {% for obj in protected %}
+ <li>{{ obj }}</li>
+ {% endfor %}
+ </ul>
+{% else %}
+ <p>{% blocktrans %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktrans %}</p>
+ {% include "admin/includes/object_delete_summary.html" %}
+ <h2>{% trans "Objects" %}</h2>
+ {% for deletable_object in deletable_objects %}
+ <ul>{{ deletable_object|unordered_list }}</ul>
+ {% endfor %}
+ <form method="post">{% csrf_token %}
+ <div>
+ {% for obj in queryset %}
+ <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" />
+ {% endfor %}
+ <input type="hidden" name="action" value="delete_selected" />
+ <input type="hidden" name="post" value="yes" />
+ <input type="submit" value="{% trans "Yes, I'm sure" %}" />
+ <a href="#" onclick="window.history.back(); return false;" class="button cancel-link">{% trans "No, take me back" %}</a>
+ </div>
+ </form>
+{% endif %}
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/edit_inline/stacked.html b/tbc/static/admin/templates/admin/edit_inline/stacked.html
new file mode 100644
index 0000000..2a837a1
--- /dev/null
+++ b/tbc/static/admin/templates/admin/edit_inline/stacked.html
@@ -0,0 +1,30 @@
+{% load i18n admin_urls admin_static %}
+<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
+ <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
+{{ inline_admin_formset.formset.management_form }}
+{{ inline_admin_formset.formset.non_form_errors }}
+
+{% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
+ <h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %}
+{% else %}#{{ forloop.counter }}{% endif %}</span>
+ {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %}
+ {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
+ </h3>
+ {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}
+ {% for fieldset in inline_admin_form %}
+ {% include "admin/includes/fieldset.html" %}
+ {% endfor %}
+ {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
+ {{ inline_admin_form.fk_field.field }}
+</div>{% endfor %}
+</div>
+
+<script type="text/javascript">
+(function($) {
+ $("#{{ inline_admin_formset.formset.prefix|escapejs }}-group .inline-related").stackedFormset({
+ prefix: "{{ inline_admin_formset.formset.prefix|escapejs }}",
+ deleteText: "{% filter escapejs %}{% trans "Remove" %}{% endfilter %}",
+ addText: "{% filter escapejs %}{% blocktrans with verbose_name=inline_admin_formset.opts.verbose_name|capfirst %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}"
+ });
+})(django.jQuery);
+</script>
diff --git a/tbc/static/admin/templates/admin/edit_inline/tabular.html b/tbc/static/admin/templates/admin/edit_inline/tabular.html
new file mode 100644
index 0000000..682ea4d
--- /dev/null
+++ b/tbc/static/admin/templates/admin/edit_inline/tabular.html
@@ -0,0 +1,83 @@
+{% load i18n admin_urls admin_static admin_modify %}
+<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
+ <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
+{{ inline_admin_formset.formset.management_form }}
+<fieldset class="module">
+ <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
+ {{ inline_admin_formset.formset.non_form_errors }}
+ <table>
+ <thead><tr>
+ {% for field in inline_admin_formset.fields %}
+ {% if not field.widget.is_hidden %}
+ <th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
+ {% if field.help_text %}&nbsp;<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}" />{% endif %}
+ </th>
+ {% endif %}
+ {% endfor %}
+ {% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
+ </tr></thead>
+
+ <tbody>
+ {% for inline_admin_form in inline_admin_formset %}
+ {% if inline_admin_form.form.non_field_errors %}
+ <tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
+ {% endif %}
+ <tr class="form-row {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"
+ id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
+ <td class="original">
+ {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
+ {% if inline_admin_form.original %}
+ {{ inline_admin_form.original }}
+ {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %}
+ {% endif %}
+ {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %}
+ </p>{% endif %}
+ {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
+ {{ inline_admin_form.fk_field.field }}
+ {% spaceless %}
+ {% for fieldset in inline_admin_form %}
+ {% for line in fieldset %}
+ {% for field in line %}
+ {% if field.field.is_hidden %} {{ field.field }} {% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% endfor %}
+ {% endspaceless %}
+ </td>
+ {% for fieldset in inline_admin_form %}
+ {% for line in fieldset %}
+ {% for field in line %}
+ {% if not field.field.is_hidden %}
+ <td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
+ {% if field.is_readonly %}
+ <p>{{ field.contents }}</p>
+ {% else %}
+ {{ field.field.errors.as_ul }}
+ {{ field.field }}
+ {% endif %}
+ </td>
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% endfor %}
+ {% if inline_admin_formset.formset.can_delete %}
+ <td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+</fieldset>
+ </div>
+</div>
+
+<script type="text/javascript">
+
+(function($) {
+ $("#{{ inline_admin_formset.formset.prefix|escapejs }}-group .tabular.inline-related tbody tr").tabularFormset({
+ prefix: "{{ inline_admin_formset.formset.prefix|escapejs }}",
+ addText: "{% filter escapejs %}{% blocktrans with inline_admin_formset.opts.verbose_name|capfirst as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}",
+ deleteText: "{% filter escapejs %}{% trans 'Remove' %}{% endfilter %}"
+ });
+})(django.jQuery);
+</script>
diff --git a/tbc/static/admin/templates/admin/filter.html b/tbc/static/admin/templates/admin/filter.html
new file mode 100644
index 0000000..d4a61a1
--- /dev/null
+++ b/tbc/static/admin/templates/admin/filter.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
+<ul>
+{% for choice in choices %}
+ <li{% if choice.selected %} class="selected"{% endif %}>
+ <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li>
+{% endfor %}
+</ul>
diff --git a/tbc/static/admin/templates/admin/includes/fieldset.html b/tbc/static/admin/templates/admin/includes/fieldset.html
new file mode 100644
index 0000000..c45e731
--- /dev/null
+++ b/tbc/static/admin/templates/admin/includes/fieldset.html
@@ -0,0 +1,29 @@
+<fieldset class="module aligned {{ fieldset.classes }}">
+ {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
+ {% if fieldset.description %}
+ <div class="description">{{ fieldset.description|safe }}</div>
+ {% endif %}
+ {% for line in fieldset %}
+ <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
+ {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
+ {% for field in line %}
+ <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
+ {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
+ {% if field.is_checkbox %}
+ {{ field.field }}{{ field.label_tag }}
+ {% else %}
+ {{ field.label_tag }}
+ {% if field.is_readonly %}
+ <p>{{ field.contents }}</p>
+ {% else %}
+ {{ field.field }}
+ {% endif %}
+ {% endif %}
+ {% if field.field.help_text %}
+ <p class="help">{{ field.field.help_text|safe }}</p>
+ {% endif %}
+ </div>
+ {% endfor %}
+ </div>
+ {% endfor %}
+</fieldset>
diff --git a/tbc/static/admin/templates/admin/includes/object_delete_summary.html b/tbc/static/admin/templates/admin/includes/object_delete_summary.html
new file mode 100644
index 0000000..6a8bf65
--- /dev/null
+++ b/tbc/static/admin/templates/admin/includes/object_delete_summary.html
@@ -0,0 +1,7 @@
+{% load i18n %}
+<h2>{% trans "Summary" %}</h2>
+<ul>
+ {% for model_name, object_count in model_count %}
+ <li>{{ model_name|capfirst }}: {{ object_count }}</li>
+ {% endfor %}
+</ul>
diff --git a/tbc/static/admin/templates/admin/index.html b/tbc/static/admin/templates/admin/index.html
new file mode 100644
index 0000000..fba67d7
--- /dev/null
+++ b/tbc/static/admin/templates/admin/index.html
@@ -0,0 +1,82 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_static %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %}
+
+{% block coltype %}colMS{% endblock %}
+
+{% block bodyclass %}{{ block.super }} dashboard{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+
+{% if app_list %}
+ {% for app in app_list %}
+ <div class="app-{{ app.app_label }} module">
+ <table>
+ <caption>
+ <a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a>
+ </caption>
+ {% for model in app.models %}
+ <tr class="model-{{ model.object_name|lower }}">
+ {% if model.admin_url %}
+ <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
+ {% else %}
+ <th scope="row">{{ model.name }}</th>
+ {% endif %}
+
+ {% if model.add_url %}
+ <td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td>
+ {% else %}
+ <td>&nbsp;</td>
+ {% endif %}
+
+ {% if model.admin_url %}
+ <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
+ {% else %}
+ <td>&nbsp;</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </table>
+ </div>
+ {% endfor %}
+{% else %}
+ <p>{% trans "You don't have permission to edit anything." %}</p>
+{% endif %}
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related">
+ <div class="module" id="recent-actions-module">
+ <h2>{% trans 'Recent Actions' %}</h2>
+ <h3>{% trans 'My Actions' %}</h3>
+ {% load log %}
+ {% get_admin_log 10 as admin_log for_user user %}
+ {% if not admin_log %}
+ <p>{% trans 'None available' %}</p>
+ {% else %}
+ <ul class="actionlist">
+ {% for entry in admin_log %}
+ <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">
+ {% if entry.is_deletion or not entry.get_admin_url %}
+ {{ entry.object_repr }}
+ {% else %}
+ <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
+ {% endif %}
+ <br/>
+ {% if entry.content_type %}
+ <span class="mini quiet">{% filter capfirst %}{{ entry.content_type }}{% endfilter %}</span>
+ {% else %}
+ <span class="mini quiet">{% trans 'Unknown content' %}</span>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </div>
+</div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/invalid_setup.html b/tbc/static/admin/templates/admin/invalid_setup.html
new file mode 100644
index 0000000..7c71107
--- /dev/null
+++ b/tbc/static/admin/templates/admin/invalid_setup.html
@@ -0,0 +1,13 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {{ title }}
+</div>
+{% endblock %}
+
+{% block content %}
+<p>{% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}</p>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/login.html b/tbc/static/admin/templates/admin/login.html
new file mode 100644
index 0000000..7a0d650
--- /dev/null
+++ b/tbc/static/admin/templates/admin/login.html
@@ -0,0 +1,69 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_static %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/login.css" %}" />
+{{ form.media }}
+{% endblock %}
+
+{% block bodyclass %}{{ block.super }} login{% endblock %}
+
+{% block usertools %}{% endblock %}
+
+{% block nav-global %}{% endblock %}
+
+{% block content_title %}{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+{% if form.errors and not form.non_field_errors %}
+<p class="errornote">
+{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+</p>
+{% endif %}
+
+{% if form.non_field_errors %}
+{% for error in form.non_field_errors %}
+<p class="errornote">
+ {{ error }}
+</p>
+{% endfor %}
+{% endif %}
+
+<div id="content-main">
+
+{% if user.is_authenticated %}
+<p class="errornote">
+{% blocktrans with username=request.user.username trimmed %}
+ You are authenticated as {{ username }}, but are not authorized to
+ access this page. Would you like to login to a different account?
+{% endblocktrans %}
+</p>
+{% endif %}
+
+<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
+ <div class="form-row">
+ {{ form.username.errors }}
+ {{ form.username.label_tag }} {{ form.username }}
+ </div>
+ <div class="form-row">
+ {{ form.password.errors }}
+ {{ form.password.label_tag }} {{ form.password }}
+ <input type="hidden" name="next" value="{{ next }}" />
+ </div>
+ {% url 'admin_password_reset' as password_reset_url %}
+ {% if password_reset_url %}
+ <div class="password-reset-link">
+ <a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a>
+ </div>
+ {% endif %}
+ <div class="submit-row">
+ <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
+ </div>
+</form>
+
+<script type="text/javascript">
+document.getElementById('id_username').focus()
+</script>
+</div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/object_history.html b/tbc/static/admin/templates/admin/object_history.html
new file mode 100644
index 0000000..cf3e7e2
--- /dev/null
+++ b/tbc/static/admin/templates/admin/object_history.html
@@ -0,0 +1,42 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_urls %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ module_name }}</a>
+&rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a>
+&rsaquo; {% trans 'History' %}
+</div>
+{% endblock %}
+
+{% block content %}
+<div id="content-main">
+<div class="module">
+
+{% if action_list %}
+ <table id="change-history">
+ <thead>
+ <tr>
+ <th scope="col">{% trans 'Date/time' %}</th>
+ <th scope="col">{% trans 'User' %}</th>
+ <th scope="col">{% trans 'Action' %}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for action in action_list %}
+ <tr>
+ <th scope="row">{{ action.action_time|date:"DATETIME_FORMAT" }}</th>
+ <td>{{ action.user.get_username }}{% if action.user.get_full_name %} ({{ action.user.get_full_name }}){% endif %}</td>
+ <td>{{ action.change_message }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+{% else %}
+ <p>{% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}</p>
+{% endif %}
+</div>
+</div>
+{% endblock %}
diff --git a/tbc/static/admin/templates/admin/pagination.html b/tbc/static/admin/templates/admin/pagination.html
new file mode 100644
index 0000000..fc1e600
--- /dev/null
+++ b/tbc/static/admin/templates/admin/pagination.html
@@ -0,0 +1,12 @@
+{% load admin_list %}
+{% load i18n %}
+<p class="paginator">
+{% if pagination_required %}
+{% for i in page_range %}
+ {% paginator_number cl i %}
+{% endfor %}
+{% endif %}
+{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %}
+{% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %}
+{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% trans 'Save' %}"/>{% endif %}
+</p>
diff --git a/tbc/static/admin/templates/admin/popup_response.html b/tbc/static/admin/templates/admin/popup_response.html
new file mode 100644
index 0000000..bbe8908
--- /dev/null
+++ b/tbc/static/admin/templates/admin/popup_response.html
@@ -0,0 +1,15 @@
+{% load i18n %}<!DOCTYPE html>
+<html>
+ <head><title>{% trans 'Popup closing...' %}</title></head>
+ <body>
+ <script type="text/javascript">
+ {% if action == 'change' %}
+ opener.dismissChangeRelatedObjectPopup(window, "{{ value|escapejs }}", "{{ obj|escapejs }}", "{{ new_value|escapejs }}");
+ {% elif action == 'delete' %}
+ opener.dismissDeleteRelatedObjectPopup(window, "{{ value|escapejs }}");
+ {% else %}
+ opener.dismissAddRelatedObjectPopup(window, "{{ value|escapejs }}", "{{ obj|escapejs }}");
+ {% endif %}
+ </script>
+ </body>
+</html>
diff --git a/tbc/static/admin/templates/admin/prepopulated_fields_js.html b/tbc/static/admin/templates/admin/prepopulated_fields_js.html
new file mode 100644
index 0000000..cbb898f
--- /dev/null
+++ b/tbc/static/admin/templates/admin/prepopulated_fields_js.html
@@ -0,0 +1,28 @@
+{% load l10n %}
+<script type="text/javascript">
+(function($) {
+ var field;
+
+{% for field in prepopulated_fields %}
+ field = {
+ id: '#{{ field.field.auto_id }}',
+ dependency_ids: [],
+ dependency_list: [],
+ maxLength: {{ field.field.field.max_length|default:"50"|unlocalize }},
+ allowUnicode: {{ field.field.field.allow_unicode|default:"false"|lower }}
+ };
+
+ {% for dependency in field.dependencies %}
+ field['dependency_ids'].push('#{{ dependency.auto_id }}');
+ field['dependency_list'].push('{{ dependency.name }}');
+ {% endfor %}
+
+ {% comment %}
+ Mark prepopulated fields in the main form and stacked inlines (.empty-form .form-row) and in tabular inlines (.empty-form.form-row)
+ {% endcomment %}
+ $('.empty-form .form-row .field-{{ field.field.name }}, .empty-form.form-row .field-{{ field.field.name }}').addClass('prepopulated_field');
+ $(field.id).data('dependency_list', field['dependency_list'])
+ .prepopulate(field['dependency_ids'], field.maxLength, field.allowUnicode);
+{% endfor %}
+})(django.jQuery);
+</script>
diff --git a/tbc/static/admin/templates/admin/related_widget_wrapper.html b/tbc/static/admin/templates/admin/related_widget_wrapper.html
new file mode 100644
index 0000000..502bede
--- /dev/null
+++ b/tbc/static/admin/templates/admin/related_widget_wrapper.html
@@ -0,0 +1,27 @@
+{% load i18n admin_static %}
+<div class="related-widget-wrapper">
+ {{ widget }}
+ {% block links %}
+ {% if can_change_related %}
+ <a class="related-widget-wrapper-link change-related" id="change_id_{{ name }}"
+ data-href-template="{{ change_related_template_url }}?{{ url_params }}"
+ title="{% blocktrans %}Change selected {{ model }}{% endblocktrans %}">
+ <img src="{% static 'admin/img/icon-changelink.svg' %}" alt="{% trans 'Change' %}"/>
+ </a>
+ {% endif %}
+ {% if can_add_related %}
+ <a class="related-widget-wrapper-link add-related" id="add_id_{{ name }}"
+ href="{{ add_related_url }}?{{ url_params }}"
+ title="{% blocktrans %}Add another {{ model }}{% endblocktrans %}">
+ <img src="{% static 'admin/img/icon-addlink.svg' %}" alt="{% trans 'Add' %}"/>
+ </a>
+ {% endif %}
+ {% if can_delete_related %}
+ <a class="related-widget-wrapper-link delete-related" id="delete_id_{{ name }}"
+ data-href-template="{{ delete_related_template_url }}?{{ url_params }}"
+ title="{% blocktrans %}Delete selected {{ model }}{% endblocktrans %}">
+ <img src="{% static 'admin/img/icon-deletelink.svg' %}" alt="{% trans 'Delete' %}"/>
+ </a>
+ {% endif %}
+ {% endblock %}
+</div>
diff --git a/tbc/static/admin/templates/admin/search_form.html b/tbc/static/admin/templates/admin/search_form.html
new file mode 100644
index 0000000..f241f14
--- /dev/null
+++ b/tbc/static/admin/templates/admin/search_form.html
@@ -0,0 +1,17 @@
+{% load i18n admin_static %}
+{% if cl.search_fields %}
+<div id="toolbar"><form id="changelist-search" method="get">
+<div><!-- DIV needed for valid HTML -->
+<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search" /></label>
+<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" />
+<input type="submit" value="{% trans 'Search' %}" />
+{% if show_result_count %}
+ <span class="small quiet">{% blocktrans count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktrans with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktrans %}{% else %}{% trans "Show all" %}{% endif %}</a>)</span>
+{% endif %}
+{% for pair in cl.params.items %}
+ {% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endif %}
+{% endfor %}
+</div>
+</form></div>
+<script type="text/javascript">document.getElementById("searchbar").focus();</script>
+{% endif %}
diff --git a/tbc/static/admin/templates/admin/submit_line.html b/tbc/static/admin/templates/admin/submit_line.html
new file mode 100644
index 0000000..d6db711
--- /dev/null
+++ b/tbc/static/admin/templates/admin/submit_line.html
@@ -0,0 +1,11 @@
+{% load i18n admin_urls %}
+<div class="submit-row">
+{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
+{% if show_delete_link %}
+ {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
+ <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
+{% endif %}
+{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
+{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
+{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
+</div>
diff --git a/tbc/static/admin/templates/registration/logged_out.html b/tbc/static/admin/templates/registration/logged_out.html
new file mode 100644
index 0000000..6a18186
--- /dev/null
+++ b/tbc/static/admin/templates/registration/logged_out.html
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a></div>{% endblock %}
+
+{% block content %}
+
+<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
+
+<p><a href="{% url 'admin:index' %}">{% trans 'Log in again' %}</a></p>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_change_done.html b/tbc/static/admin/templates/registration/password_change_done.html
new file mode 100644
index 0000000..3e557eb
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_change_done.html
@@ -0,0 +1,15 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}{% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password change' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+{% block content %}
+<p>{% trans 'Your password was changed.' %}</p>
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_change_form.html b/tbc/static/admin/templates/registration/password_change_form.html
new file mode 100644
index 0000000..ddb90e8
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_change_form.html
@@ -0,0 +1,61 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_static %}
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %}
+{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password change' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+
+{% block content %}<div id="content-main">
+
+<form method="post">{% csrf_token %}
+<div>
+{% if form.errors %}
+ <p class="errornote">
+ {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+ </p>
+{% endif %}
+
+
+<p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+<fieldset class="module aligned wide">
+
+<div class="form-row">
+ {{ form.old_password.errors }}
+ {{ form.old_password.label_tag }} {{ form.old_password }}
+</div>
+
+<div class="form-row">
+ {{ form.new_password1.errors }}
+ {{ form.new_password1.label_tag }} {{ form.new_password1 }}
+ {% if form.new_password1.help_text %}
+ <p class="help">{{ form.new_password1.help_text|safe }}</p>
+ {% endif %}
+</div>
+
+<div class="form-row">
+{{ form.new_password2.errors }}
+ {{ form.new_password2.label_tag }} {{ form.new_password2 }}
+ {% if form.new_password2.help_text %}
+ <p class="help">{{ form.new_password2.help_text|safe }}</p>
+ {% endif %}
+</div>
+
+</fieldset>
+
+<div class="submit-row">
+ <input type="submit" value="{% trans 'Change my password' %}" class="default" />
+</div>
+
+<script type="text/javascript">document.getElementById("id_old_password").focus();</script>
+</div>
+</form></div>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_reset_complete.html b/tbc/static/admin/templates/registration/password_reset_complete.html
new file mode 100644
index 0000000..19f87a5
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_reset_complete.html
@@ -0,0 +1,20 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password reset' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+
+{% block content %}
+
+<p>{% trans "Your password has been set. You may go ahead and log in now." %}</p>
+
+<p><a href="{{ login_url }}">{% trans 'Log in' %}</a></p>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_reset_confirm.html b/tbc/static/admin/templates/registration/password_reset_confirm.html
new file mode 100644
index 0000000..a1e0150
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_reset_confirm.html
@@ -0,0 +1,33 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password reset confirmation' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+{% block content %}
+
+{% if validlink %}
+
+<p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+<form method="post">{% csrf_token %}
+{{ form.new_password1.errors }}
+<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
+{{ form.new_password2.errors }}
+<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
+<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
+</form>
+
+{% else %}
+
+<p>{% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}</p>
+
+{% endif %}
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_reset_done.html b/tbc/static/admin/templates/registration/password_reset_done.html
new file mode 100644
index 0000000..c6fc358
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_reset_done.html
@@ -0,0 +1,19 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password reset' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+{% block content %}
+
+<p>{% trans "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." %}</p>
+
+<p>{% trans "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." %}</p>
+
+{% endblock %}
diff --git a/tbc/static/admin/templates/registration/password_reset_email.html b/tbc/static/admin/templates/registration/password_reset_email.html
new file mode 100644
index 0000000..01b3bcc
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_reset_email.html
@@ -0,0 +1,14 @@
+{% load i18n %}{% autoescape off %}
+{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
+
+{% trans "Please go to the following page and choose a new password:" %}
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
+{% endblock %}
+{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
+
+{% trans "Thanks for using our site!" %}
+
+{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
+
+{% endautoescape %}
diff --git a/tbc/static/admin/templates/registration/password_reset_form.html b/tbc/static/admin/templates/registration/password_reset_form.html
new file mode 100644
index 0000000..23b68a3
--- /dev/null
+++ b/tbc/static/admin/templates/registration/password_reset_form.html
@@ -0,0 +1,22 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
+&rsaquo; {% trans 'Password reset' %}
+</div>
+{% endblock %}
+
+{% block title %}{{ title }}{% endblock %}
+{% block content_title %}<h1>{{ title }}</h1>{% endblock %}
+{% block content %}
+
+<p>{% trans "Forgotten your password? Enter your email address below, and we'll email instructions for setting a new one." %}</p>
+
+<form method="post">{% csrf_token %}
+{{ form.email.errors }}
+<p><label for="id_email">{% trans 'Email address:' %}</label> {{ form.email }} <input type="submit" value="{% trans 'Reset my password' %}" /></p>
+</form>
+
+{% endblock %}
diff --git a/tbc/static/admin/templatetags/__init__.py b/tbc/static/admin/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tbc/static/admin/templatetags/__init__.py
diff --git a/tbc/static/admin/templatetags/admin_list.py b/tbc/static/admin/templatetags/admin_list.py
new file mode 100644
index 0000000..f4033e2
--- /dev/null
+++ b/tbc/static/admin/templatetags/admin_list.py
@@ -0,0 +1,436 @@
+from __future__ import unicode_literals
+
+import datetime
+import warnings
+
+from django.contrib.admin.templatetags.admin_static import static
+from django.contrib.admin.templatetags.admin_urls import add_preserved_filters
+from django.contrib.admin.utils import (
+ display_for_field, display_for_value, label_for_field, lookup_field,
+)
+from django.contrib.admin.views.main import (
+ ALL_VAR, ORDER_VAR, PAGE_VAR, SEARCH_VAR,
+)
+from django.core.exceptions import ObjectDoesNotExist
+from django.core.urlresolvers import NoReverseMatch
+from django.db import models
+from django.template import Library
+from django.template.loader import get_template
+from django.utils import formats
+from django.utils.deprecation import RemovedInDjango20Warning
+from django.utils.encoding import force_text
+from django.utils.html import escapejs, format_html
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst
+from django.utils.translation import ugettext as _
+
+register = Library()
+
+DOT = '.'
+
+
+@register.simple_tag
+def paginator_number(cl, i):
+ """
+ Generates an individual page index link in a paginated list.
+ """
+ if i == DOT:
+ return '... '
+ elif i == cl.page_num:
+ return format_html('<span class="this-page">{}</span> ', i + 1)
+ else:
+ return format_html('<a href="{}"{}>{}</a> ',
+ cl.get_query_string({PAGE_VAR: i}),
+ mark_safe(' class="end"' if i == cl.paginator.num_pages - 1 else ''),
+ i + 1)
+
+
+@register.inclusion_tag('admin/pagination.html')
+def pagination(cl):
+ """
+ Generates the series of links to the pages in a paginated list.
+ """
+ paginator, page_num = cl.paginator, cl.page_num
+
+ pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page
+ if not pagination_required:
+ page_range = []
+ else:
+ ON_EACH_SIDE = 3
+ ON_ENDS = 2
+
+ # If there are 10 or fewer pages, display links to every page.
+ # Otherwise, do some fancy
+ if paginator.num_pages <= 10:
+ page_range = range(paginator.num_pages)
+ else:
+ # Insert "smart" pagination links, so that there are always ON_ENDS
+ # links at either end of the list of pages, and there are always
+ # ON_EACH_SIDE links at either end of the "current page" link.
+ page_range = []
+ if page_num > (ON_EACH_SIDE + ON_ENDS):
+ page_range.extend(range(0, ON_ENDS))
+ page_range.append(DOT)
+ page_range.extend(range(page_num - ON_EACH_SIDE, page_num + 1))
+ else:
+ page_range.extend(range(0, page_num + 1))
+ if page_num < (paginator.num_pages - ON_EACH_SIDE - ON_ENDS - 1):
+ page_range.extend(range(page_num + 1, page_num + ON_EACH_SIDE + 1))
+ page_range.append(DOT)
+ page_range.extend(range(paginator.num_pages - ON_ENDS, paginator.num_pages))
+ else:
+ page_range.extend(range(page_num + 1, paginator.num_pages))
+
+ need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page
+ return {
+ 'cl': cl,
+ 'pagination_required': pagination_required,
+ 'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}),
+ 'page_range': page_range,
+ 'ALL_VAR': ALL_VAR,
+ '1': 1,
+ }
+
+
+def result_headers(cl):
+ """
+ Generates the list column headers.
+ """
+ ordering_field_columns = cl.get_ordering_field_columns()
+ for i, field_name in enumerate(cl.list_display):
+ text, attr = label_for_field(
+ field_name, cl.model,
+ model_admin=cl.model_admin,
+ return_attr=True
+ )
+ if attr:
+ # Potentially not sortable
+
+ # if the field is the action checkbox: no sorting and special class
+ if field_name == 'action_checkbox':
+ yield {
+ "text": text,
+ "class_attrib": mark_safe(' class="action-checkbox-column"'),
+ "sortable": False,
+ }
+ continue
+
+ admin_order_field = getattr(attr, "admin_order_field", None)
+ if not admin_order_field:
+ # Not sortable
+ yield {
+ "text": text,
+ "class_attrib": format_html(' class="column-{}"', field_name),
+ "sortable": False,
+ }
+ continue
+
+ # OK, it is sortable if we got this far
+ th_classes = ['sortable', 'column-{}'.format(field_name)]
+ order_type = ''
+ new_order_type = 'asc'
+ sort_priority = 0
+ sorted = False
+ # Is it currently being sorted on?
+ if i in ordering_field_columns:
+ sorted = True
+ order_type = ordering_field_columns.get(i).lower()
+ sort_priority = list(ordering_field_columns).index(i) + 1
+ th_classes.append('sorted %sending' % order_type)
+ new_order_type = {'asc': 'desc', 'desc': 'asc'}[order_type]
+
+ # build new ordering param
+ o_list_primary = [] # URL for making this field the primary sort
+ o_list_remove = [] # URL for removing this field from sort
+ o_list_toggle = [] # URL for toggling order type for this field
+ make_qs_param = lambda t, n: ('-' if t == 'desc' else '') + str(n)
+
+ for j, ot in ordering_field_columns.items():
+ if j == i: # Same column
+ param = make_qs_param(new_order_type, j)
+ # We want clicking on this header to bring the ordering to the
+ # front
+ o_list_primary.insert(0, param)
+ o_list_toggle.append(param)
+ # o_list_remove - omit
+ else:
+ param = make_qs_param(ot, j)
+ o_list_primary.append(param)
+ o_list_toggle.append(param)
+ o_list_remove.append(param)
+
+ if i not in ordering_field_columns:
+ o_list_primary.insert(0, make_qs_param(new_order_type, i))
+
+ yield {
+ "text": text,
+ "sortable": True,
+ "sorted": sorted,
+ "ascending": order_type == "asc",
+ "sort_priority": sort_priority,
+ "url_primary": cl.get_query_string({ORDER_VAR: '.'.join(o_list_primary)}),
+ "url_remove": cl.get_query_string({ORDER_VAR: '.'.join(o_list_remove)}),
+ "url_toggle": cl.get_query_string({ORDER_VAR: '.'.join(o_list_toggle)}),
+ "class_attrib": format_html(' class="{}"', ' '.join(th_classes)) if th_classes else '',
+ }
+
+
+def _boolean_icon(field_val):
+ icon_url = static('admin/img/icon-%s.svg' %
+ {True: 'yes', False: 'no', None: 'unknown'}[field_val])
+ return format_html('<img src="{}" alt="{}" />', icon_url, field_val)
+
+
+def items_for_result(cl, result, form):
+ """
+ Generates the actual list of data.
+ """
+
+ def link_in_col(is_first, field_name, cl):
+ if cl.list_display_links is None:
+ return False
+ if is_first and not cl.list_display_links:
+ return True
+ return field_name in cl.list_display_links
+
+ first = True
+ pk = cl.lookup_opts.pk.attname
+ for field_name in cl.list_display:
+ empty_value_display = cl.model_admin.get_empty_value_display()
+ row_classes = ['field-%s' % field_name]
+ try:
+ f, attr, value = lookup_field(field_name, result, cl.model_admin)
+ except ObjectDoesNotExist:
+ result_repr = empty_value_display
+ else:
+ empty_value_display = getattr(attr, 'empty_value_display', empty_value_display)
+ if f is None or f.auto_created:
+ if field_name == 'action_checkbox':
+ row_classes = ['action-checkbox']
+ allow_tags = getattr(attr, 'allow_tags', False)
+ boolean = getattr(attr, 'boolean', False)
+ result_repr = display_for_value(value, empty_value_display, boolean)
+ if allow_tags:
+ warnings.warn(
+ "Deprecated allow_tags attribute used on field {}. "
+ "Use django.utils.safestring.format_html(), "
+ "format_html_join(), or mark_safe() instead.".format(field_name),
+ RemovedInDjango20Warning
+ )
+ result_repr = mark_safe(result_repr)
+ if isinstance(value, (datetime.date, datetime.time)):
+ row_classes.append('nowrap')
+ else:
+ if isinstance(f.remote_field, models.ManyToOneRel):
+ field_val = getattr(result, f.name)
+ if field_val is None:
+ result_repr = empty_value_display
+ else:
+ result_repr = field_val
+ else:
+ result_repr = display_for_field(value, f, empty_value_display)
+ if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)):
+ row_classes.append('nowrap')
+ if force_text(result_repr) == '':
+ result_repr = mark_safe('&nbsp;')
+ row_class = mark_safe(' class="%s"' % ' '.join(row_classes))
+ # If list_display_links not defined, add the link tag to the first field
+ if link_in_col(first, field_name, cl):
+ table_tag = 'th' if first else 'td'
+ first = False
+
+ # Display link to the result's change_view if the url exists, else
+ # display just the result's representation.
+ try:
+ url = cl.url_for_result(result)
+ except NoReverseMatch:
+ link_or_text = result_repr
+ else:
+ url = add_preserved_filters({'preserved_filters': cl.preserved_filters, 'opts': cl.opts}, url)
+ # Convert the pk to something that can be used in Javascript.
+ # Problem cases are long ints (23L) and non-ASCII strings.
+ if cl.to_field:
+ attr = str(cl.to_field)
+ else:
+ attr = pk
+ value = result.serializable_value(attr)
+ result_id = escapejs(value)
+ link_or_text = format_html(
+ '<a href="{}"{}>{}</a>',
+ url,
+ format_html(
+ ' onclick="opener.dismissRelatedLookupPopup(window, '
+ '&#39;{}&#39;); return false;"', result_id
+ ) if cl.is_popup else '',
+ result_repr)
+
+ yield format_html('<{}{}>{}</{}>',
+ table_tag,
+ row_class,
+ link_or_text,
+ table_tag)
+ else:
+ # By default the fields come from ModelAdmin.list_editable, but if we pull
+ # the fields out of the form instead of list_editable custom admins
+ # can provide fields on a per request basis
+ if (form and field_name in form.fields and not (
+ field_name == cl.model._meta.pk.name and
+ form[cl.model._meta.pk.name].is_hidden)):
+ bf = form[field_name]
+ result_repr = mark_safe(force_text(bf.errors) + force_text(bf))
+ yield format_html('<td{}>{}</td>', row_class, result_repr)
+ if form and not form[cl.model._meta.pk.name].is_hidden:
+ yield format_html('<td>{}</td>', force_text(form[cl.model._meta.pk.name]))
+
+
+class ResultList(list):
+ # Wrapper class used to return items in a list_editable
+ # changelist, annotated with the form object for error
+ # reporting purposes. Needed to maintain backwards
+ # compatibility with existing admin templates.
+ def __init__(self, form, *items):
+ self.form = form
+ super(ResultList, self).__init__(*items)
+
+
+def results(cl):
+ if cl.formset:
+ for res, form in zip(cl.result_list, cl.formset.forms):
+ yield ResultList(form, items_for_result(cl, res, form))
+ else:
+ for res in cl.result_list:
+ yield ResultList(None, items_for_result(cl, res, None))
+
+
+def result_hidden_fields(cl):
+ if cl.formset:
+ for res, form in zip(cl.result_list, cl.formset.forms):
+ if form[cl.model._meta.pk.name].is_hidden:
+ yield mark_safe(force_text(form[cl.model._meta.pk.name]))
+
+
+@register.inclusion_tag("admin/change_list_results.html")
+def result_list(cl):
+ """
+ Displays the headers and data list together
+ """
+ headers = list(result_headers(cl))
+ num_sorted_fields = 0
+ for h in headers:
+ if h['sortable'] and h['sorted']:
+ num_sorted_fields += 1
+ return {'cl': cl,
+ 'result_hidden_fields': list(result_hidden_fields(cl)),
+ 'result_headers': headers,
+ 'num_sorted_fields': num_sorted_fields,
+ 'results': list(results(cl))}
+
+
+@register.inclusion_tag('admin/date_hierarchy.html')
+def date_hierarchy(cl):
+ """
+ Displays the date hierarchy for date drill-down functionality.
+ """
+ if cl.date_hierarchy:
+ field_name = cl.date_hierarchy
+ field = cl.opts.get_field(field_name)
+ dates_or_datetimes = 'datetimes' if isinstance(field, models.DateTimeField) else 'dates'
+ year_field = '%s__year' % field_name
+ month_field = '%s__month' % field_name
+ day_field = '%s__day' % field_name
+ field_generic = '%s__' % field_name
+ year_lookup = cl.params.get(year_field)
+ month_lookup = cl.params.get(month_field)
+ day_lookup = cl.params.get(day_field)
+
+ link = lambda filters: cl.get_query_string(filters, [field_generic])
+
+ if not (year_lookup or month_lookup or day_lookup):
+ # select appropriate start level
+ date_range = cl.queryset.aggregate(first=models.Min(field_name),
+ last=models.Max(field_name))
+ if date_range['first'] and date_range['last']:
+ if date_range['first'].year == date_range['last'].year:
+ year_lookup = date_range['first'].year
+ if date_range['first'].month == date_range['last'].month:
+ month_lookup = date_range['first'].month
+
+ if year_lookup and month_lookup and day_lookup:
+ day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup))
+ return {
+ 'show': True,
+ 'back': {
+ 'link': link({year_field: year_lookup, month_field: month_lookup}),
+ 'title': capfirst(formats.date_format(day, 'YEAR_MONTH_FORMAT'))
+ },
+ 'choices': [{'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))}]
+ }
+ elif year_lookup and month_lookup:
+ days = cl.queryset.filter(**{year_field: year_lookup, month_field: month_lookup})
+ days = getattr(days, dates_or_datetimes)(field_name, 'day')
+ return {
+ 'show': True,
+ 'back': {
+ 'link': link({year_field: year_lookup}),
+ 'title': str(year_lookup)
+ },
+ 'choices': [{
+ 'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}),
+ 'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))
+ } for day in days]
+ }
+ elif year_lookup:
+ months = cl.queryset.filter(**{year_field: year_lookup})
+ months = getattr(months, dates_or_datetimes)(field_name, 'month')
+ return {
+ 'show': True,
+ 'back': {
+ 'link': link({}),
+ 'title': _('All dates')
+ },
+ 'choices': [{
+ 'link': link({year_field: year_lookup, month_field: month.month}),
+ 'title': capfirst(formats.date_format(month, 'YEAR_MONTH_FORMAT'))
+ } for month in months]
+ }
+ else:
+ years = getattr(cl.queryset, dates_or_datetimes)(field_name, 'year')
+ return {
+ 'show': True,
+ 'choices': [{
+ 'link': link({year_field: str(year.year)}),
+ 'title': str(year.year),
+ } for year in years]
+ }
+
+
+@register.inclusion_tag('admin/search_form.html')
+def search_form(cl):
+ """
+ Displays a search form for searching the list.
+ """
+ return {
+ 'cl': cl,
+ 'show_result_count': cl.result_count != cl.full_result_count,
+ 'search_var': SEARCH_VAR
+ }
+
+
+@register.simple_tag
+def admin_list_filter(cl, spec):
+ tpl = get_template(spec.template)
+ return tpl.render({
+ 'title': spec.title,
+ 'choices': list(spec.choices(cl)),
+ 'spec': spec,
+ })
+
+
+@register.inclusion_tag('admin/actions.html', takes_context=True)
+def admin_actions(context):
+ """
+ Track the number of times the action field has been rendered on the page,
+ so we know which value to use.
+ """
+ context['action_index'] = context.get('action_index', -1) + 1
+ return context
diff --git a/tbc/static/admin/templatetags/admin_modify.py b/tbc/static/admin/templatetags/admin_modify.py
new file mode 100644
index 0000000..30f9ac4
--- /dev/null
+++ b/tbc/static/admin/templatetags/admin_modify.py
@@ -0,0 +1,68 @@
+from django import template
+
+register = template.Library()
+
+
+@register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)
+def prepopulated_fields_js(context):
+ """
+ Creates a list of prepopulated_fields that should render Javascript for
+ the prepopulated fields for both the admin form and inlines.
+ """
+ prepopulated_fields = []
+ if 'adminform' in context:
+ prepopulated_fields.extend(context['adminform'].prepopulated_fields)
+ if 'inline_admin_formsets' in context:
+ for inline_admin_formset in context['inline_admin_formsets']:
+ for inline_admin_form in inline_admin_formset:
+ if inline_admin_form.original is None:
+ prepopulated_fields.extend(inline_admin_form.prepopulated_fields)
+ context.update({'prepopulated_fields': prepopulated_fields})
+ return context
+
+
+@register.inclusion_tag('admin/submit_line.html', takes_context=True)
+def submit_row(context):
+ """
+ Displays the row of buttons for delete and save.
+ """
+ opts = context['opts']
+ change = context['change']
+ is_popup = context['is_popup']
+ save_as = context['save_as']
+ show_save = context.get('show_save', True)
+ show_save_and_continue = context.get('show_save_and_continue', True)
+ ctx = {
+ 'opts': opts,
+ 'show_delete_link': (
+ not is_popup and context['has_delete_permission'] and
+ change and context.get('show_delete', True)
+ ),
+ 'show_save_as_new': not is_popup and change and save_as,
+ 'show_save_and_add_another': (
+ context['has_add_permission'] and not is_popup and
+ (not save_as or context['add'])
+ ),
+ 'show_save_and_continue': not is_popup and context['has_change_permission'] and show_save_and_continue,
+ 'is_popup': is_popup,
+ 'show_save': show_save,
+ 'preserved_filters': context.get('preserved_filters'),
+ }
+ if context.get('original') is not None:
+ ctx['original'] = context['original']
+ return ctx
+
+
+@register.filter
+def cell_count(inline_admin_form):
+ """Returns the number of cells used in a tabular inline"""
+ count = 1 # Hidden cell with hidden 'id' field
+ for fieldset in inline_admin_form:
+ # Loop through all the fields (one per cell)
+ for line in fieldset:
+ for field in line:
+ count += 1
+ if inline_admin_form.formset.can_delete:
+ # Delete checkbox
+ count += 1
+ return count
diff --git a/tbc/static/admin/templatetags/admin_static.py b/tbc/static/admin/templatetags/admin_static.py
new file mode 100644
index 0000000..b767dc7
--- /dev/null
+++ b/tbc/static/admin/templatetags/admin_static.py
@@ -0,0 +1,17 @@
+from django.apps import apps
+from django.template import Library
+
+register = Library()
+
+_static = None
+
+
+@register.simple_tag
+def static(path):
+ global _static
+ if _static is None:
+ if apps.is_installed('django.contrib.staticfiles'):
+ from django.contrib.staticfiles.templatetags.staticfiles import static as _static
+ else:
+ from django.templatetags.static import static as _static
+ return _static(path)
diff --git a/tbc/static/admin/templatetags/admin_urls.py b/tbc/static/admin/templatetags/admin_urls.py
new file mode 100644
index 0000000..b19ee10
--- /dev/null
+++ b/tbc/static/admin/templatetags/admin_urls.py
@@ -0,0 +1,55 @@
+from django import template
+from django.contrib.admin.utils import quote
+from django.core.urlresolvers import Resolver404, get_script_prefix, resolve
+from django.utils.http import urlencode
+from django.utils.six.moves.urllib.parse import parse_qsl, urlparse, urlunparse
+
+register = template.Library()
+
+
+@register.filter
+def admin_urlname(value, arg):
+ return 'admin:%s_%s_%s' % (value.app_label, value.model_name, arg)
+
+
+@register.filter
+def admin_urlquote(value):
+ return quote(value)
+
+
+@register.simple_tag(takes_context=True)
+def add_preserved_filters(context, url, popup=False, to_field=None):
+ opts = context.get('opts')
+ preserved_filters = context.get('preserved_filters')
+
+ parsed_url = list(urlparse(url))
+ parsed_qs = dict(parse_qsl(parsed_url[4]))
+ merged_qs = dict()
+
+ if opts and preserved_filters:
+ preserved_filters = dict(parse_qsl(preserved_filters))
+
+ match_url = '/%s' % url.partition(get_script_prefix())[2]
+ try:
+ match = resolve(match_url)
+ except Resolver404:
+ pass
+ else:
+ current_url = '%s:%s' % (match.app_name, match.url_name)
+ changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name)
+ if changelist_url == current_url and '_changelist_filters' in preserved_filters:
+ preserved_filters = dict(parse_qsl(preserved_filters['_changelist_filters']))
+
+ merged_qs.update(preserved_filters)
+
+ if popup:
+ from django.contrib.admin.options import IS_POPUP_VAR
+ merged_qs[IS_POPUP_VAR] = 1
+ if to_field:
+ from django.contrib.admin.options import TO_FIELD_VAR
+ merged_qs[TO_FIELD_VAR] = to_field
+
+ merged_qs.update(parsed_qs)
+
+ parsed_url[4] = urlencode(merged_qs)
+ return urlunparse(parsed_url)
diff --git a/tbc/static/admin/templatetags/log.py b/tbc/static/admin/templatetags/log.py
new file mode 100644
index 0000000..427cb95
--- /dev/null
+++ b/tbc/static/admin/templatetags/log.py
@@ -0,0 +1,59 @@
+from django import template
+from django.contrib.admin.models import LogEntry
+
+register = template.Library()
+
+
+class AdminLogNode(template.Node):
+ def __init__(self, limit, varname, user):
+ self.limit, self.varname, self.user = limit, varname, user
+
+ def __repr__(self):
+ return "<GetAdminLog Node>"
+
+ def render(self, context):
+ if self.user is None:
+ entries = LogEntry.objects.all()
+ else:
+ user_id = self.user
+ if not user_id.isdigit():
+ user_id = context[self.user].pk
+ entries = LogEntry.objects.filter(user__pk=user_id)
+ context[self.varname] = entries.select_related('content_type', 'user')[:int(self.limit)]
+ return ''
+
+
+@register.tag
+def get_admin_log(parser, token):
+ """
+ Populates a template variable with the admin log for the given criteria.
+
+ Usage::
+
+ {% get_admin_log [limit] as [varname] for_user [context_var_containing_user_obj] %}
+
+ Examples::
+
+ {% get_admin_log 10 as admin_log for_user 23 %}
+ {% get_admin_log 10 as admin_log for_user user %}
+ {% get_admin_log 10 as admin_log %}
+
+ Note that ``context_var_containing_user_obj`` can be a hard-coded integer
+ (user ID) or the name of a template context variable containing the user
+ object whose ID you want.
+ """
+ tokens = token.contents.split()
+ if len(tokens) < 4:
+ raise template.TemplateSyntaxError(
+ "'get_admin_log' statements require two arguments")
+ if not tokens[1].isdigit():
+ raise template.TemplateSyntaxError(
+ "First argument to 'get_admin_log' must be an integer")
+ if tokens[2] != 'as':
+ raise template.TemplateSyntaxError(
+ "Second argument to 'get_admin_log' must be 'as'")
+ if len(tokens) > 4:
+ if tokens[4] != 'for_user':
+ raise template.TemplateSyntaxError(
+ "Fourth argument to 'get_admin_log' must be 'for_user'")
+ return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(tokens[5] if len(tokens) > 5 else None))
diff --git a/tbc/static/admin/tests.py b/tbc/static/admin/tests.py
new file mode 100644
index 0000000..5415d5f
--- /dev/null
+++ b/tbc/static/admin/tests.py
@@ -0,0 +1,163 @@
+import os
+from unittest import SkipTest
+
+from django.contrib.staticfiles.testing import StaticLiveServerTestCase
+from django.utils.module_loading import import_string
+from django.utils.translation import ugettext as _
+
+
+class AdminSeleniumWebDriverTestCase(StaticLiveServerTestCase):
+
+ available_apps = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ ]
+ webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
+
+ @classmethod
+ def setUpClass(cls):
+ if not os.environ.get('DJANGO_SELENIUM_TESTS', False):
+ raise SkipTest('Selenium tests not requested')
+ try:
+ cls.selenium = import_string(cls.webdriver_class)()
+ except Exception as e:
+ raise SkipTest('Selenium webdriver "%s" not installed or not '
+ 'operational: %s' % (cls.webdriver_class, str(e)))
+ # This has to be last to ensure that resources are cleaned up properly!
+ super(AdminSeleniumWebDriverTestCase, cls).setUpClass()
+
+ @classmethod
+ def _tearDownClassInternal(cls):
+ if hasattr(cls, 'selenium'):
+ cls.selenium.quit()
+ super(AdminSeleniumWebDriverTestCase, cls)._tearDownClassInternal()
+
+ def wait_until(self, callback, timeout=10):
+ """
+ Helper function that blocks the execution of the tests until the
+ specified callback returns a value that is not falsy. This function can
+ be called, for example, after clicking a link or submitting a form.
+ See the other public methods that call this function for more details.
+ """
+ from selenium.webdriver.support.wait import WebDriverWait
+ WebDriverWait(self.selenium, timeout).until(callback)
+
+ def wait_for_popup(self, num_windows=2, timeout=10):
+ """
+ Block until `num_windows` are present (usually 2, but can be
+ overridden in the case of pop-ups opening other pop-ups).
+ """
+ self.wait_until(lambda d: len(d.window_handles) == num_windows, timeout)
+
+ def wait_loaded_tag(self, tag_name, timeout=10):
+ """
+ Helper function that blocks until the element with the given tag name
+ is found on the page.
+ """
+ self.wait_for(tag_name, timeout)
+
+ def wait_for(self, css_selector, timeout=10):
+ """
+ Helper function that blocks until a CSS selector is found on the page.
+ """
+ from selenium.webdriver.common.by import By
+ from selenium.webdriver.support import expected_conditions as ec
+ self.wait_until(
+ ec.presence_of_element_located((By.CSS_SELECTOR, css_selector)),
+ timeout
+ )
+
+ def wait_for_text(self, css_selector, text, timeout=10):
+ """
+ Helper function that blocks until the text is found in the CSS selector.
+ """
+ from selenium.webdriver.common.by import By
+ from selenium.webdriver.support import expected_conditions as ec
+ self.wait_until(
+ ec.text_to_be_present_in_element(
+ (By.CSS_SELECTOR, css_selector), text),
+ timeout
+ )
+
+ def wait_for_value(self, css_selector, text, timeout=10):
+ """
+ Helper function that blocks until the value is found in the CSS selector.
+ """
+ from selenium.webdriver.common.by import By
+ from selenium.webdriver.support import expected_conditions as ec
+ self.wait_until(
+ ec.text_to_be_present_in_element_value(
+ (By.CSS_SELECTOR, css_selector), text),
+ timeout
+ )
+
+ def wait_page_loaded(self):
+ """
+ Block until page has started to load.
+ """
+ from selenium.common.exceptions import TimeoutException
+ try:
+ # Wait for the next page to be loaded
+ self.wait_loaded_tag('body')
+ except TimeoutException:
+ # IE7 occasionally returns an error "Internet Explorer cannot
+ # display the webpage" and doesn't load the next page. We just
+ # ignore it.
+ pass
+
+ def admin_login(self, username, password, login_url='/admin/'):
+ """
+ Helper function to log into the admin.
+ """
+ self.selenium.get('%s%s' % (self.live_server_url, login_url))
+ username_input = self.selenium.find_element_by_name('username')
+ username_input.send_keys(username)
+ password_input = self.selenium.find_element_by_name('password')
+ password_input.send_keys(password)
+ login_text = _('Log in')
+ self.selenium.find_element_by_xpath(
+ '//input[@value="%s"]' % login_text).click()
+ self.wait_page_loaded()
+
+ def get_css_value(self, selector, attribute):
+ """
+ Helper function that returns the value for the CSS attribute of an
+ DOM element specified by the given selector. Uses the jQuery that ships
+ with Django.
+ """
+ return self.selenium.execute_script(
+ 'return django.jQuery("%s").css("%s")' % (selector, attribute))
+
+ def get_select_option(self, selector, value):
+ """
+ Returns the <OPTION> with the value `value` inside the <SELECT> widget
+ identified by the CSS selector `selector`.
+ """
+ from selenium.common.exceptions import NoSuchElementException
+ options = self.selenium.find_elements_by_css_selector('%s > option' % selector)
+ for option in options:
+ if option.get_attribute('value') == value:
+ return option
+ raise NoSuchElementException('Option "%s" not found in "%s"' % (value, selector))
+
+ def assertSelectOptions(self, selector, values):
+ """
+ Asserts that the <SELECT> widget identified by `selector` has the
+ options with the given `values`.
+ """
+ options = self.selenium.find_elements_by_css_selector('%s > option' % selector)
+ actual_values = []
+ for option in options:
+ actual_values.append(option.get_attribute('value'))
+ self.assertEqual(values, actual_values)
+
+ def has_css_class(self, selector, klass):
+ """
+ Returns True if the element identified by `selector` has the CSS class
+ `klass`.
+ """
+ return (self.selenium.find_element_by_css_selector(selector)
+ .get_attribute('class').find(klass) != -1)
diff --git a/tbc/static/admin/utils.py b/tbc/static/admin/utils.py
new file mode 100644
index 0000000..2337fe6
--- /dev/null
+++ b/tbc/static/admin/utils.py
@@ -0,0 +1,492 @@
+from __future__ import unicode_literals
+
+import datetime
+import decimal
+from collections import defaultdict
+
+from django.contrib.auth import get_permission_codename
+from django.core.exceptions import FieldDoesNotExist
+from django.core.urlresolvers import NoReverseMatch, reverse
+from django.db import models
+from django.db.models.constants import LOOKUP_SEP
+from django.db.models.deletion import Collector
+from django.db.models.sql.constants import QUERY_TERMS
+from django.forms.utils import pretty_name
+from django.utils import formats, six, timezone
+from django.utils.encoding import force_str, force_text, smart_text
+from django.utils.html import format_html
+from django.utils.text import capfirst
+from django.utils.translation import ungettext
+
+
+def lookup_needs_distinct(opts, lookup_path):
+ """
+ Returns True if 'distinct()' should be used to query the given lookup path.
+ """
+ lookup_fields = lookup_path.split('__')
+ # Remove the last item of the lookup path if it is a query term
+ if lookup_fields[-1] in QUERY_TERMS:
+ lookup_fields = lookup_fields[:-1]
+ # Now go through the fields (following all relations) and look for an m2m
+ for field_name in lookup_fields:
+ field = opts.get_field(field_name)
+ if hasattr(field, 'get_path_info'):
+ # This field is a relation, update opts to follow the relation
+ path_info = field.get_path_info()
+ opts = path_info[-1].to_opts
+ if any(path.m2m for path in path_info):
+ # This field is a m2m relation so we know we need to call distinct
+ return True
+ return False
+
+
+def prepare_lookup_value(key, value):
+ """
+ Returns a lookup value prepared to be used in queryset filtering.
+ """
+ # if key ends with __in, split parameter into separate values
+ if key.endswith('__in'):
+ value = value.split(',')
+ # if key ends with __isnull, special case '' and the string literals 'false' and '0'
+ if key.endswith('__isnull'):
+ if value.lower() in ('', 'false', '0'):
+ value = False
+ else:
+ value = True
+ return value
+
+
+def quote(s):
+ """
+ Ensure that primary key values do not confuse the admin URLs by escaping
+ any '/', '_' and ':' and similarly problematic characters.
+ Similar to urllib.quote, except that the quoting is slightly different so
+ that it doesn't get automatically unquoted by the Web browser.
+ """
+ if not isinstance(s, six.string_types):
+ return s
+ res = list(s)
+ for i in range(len(res)):
+ c = res[i]
+ if c in """:/_#?;@&=+$,"[]<>%\n\\""":
+ res[i] = '_%02X' % ord(c)
+ return ''.join(res)
+
+
+def unquote(s):
+ """
+ Undo the effects of quote(). Based heavily on urllib.unquote().
+ """
+ mychr = chr
+ myatoi = int
+ list = s.split('_')
+ res = [list[0]]
+ myappend = res.append
+ del list[0]
+ for item in list:
+ if item[1:2]:
+ try:
+ myappend(mychr(myatoi(item[:2], 16)) + item[2:])
+ except ValueError:
+ myappend('_' + item)
+ else:
+ myappend('_' + item)
+ return "".join(res)
+
+
+def flatten(fields):
+ """Returns a list which is a single level of flattening of the
+ original list."""
+ flat = []
+ for field in fields:
+ if isinstance(field, (list, tuple)):
+ flat.extend(field)
+ else:
+ flat.append(field)
+ return flat
+
+
+def flatten_fieldsets(fieldsets):
+ """Returns a list of field names from an admin fieldsets structure."""
+ field_names = []
+ for name, opts in fieldsets:
+ field_names.extend(
+ flatten(opts['fields'])
+ )
+ return field_names
+
+
+def get_deleted_objects(objs, opts, user, admin_site, using):
+ """
+ Find all objects related to ``objs`` that should also be deleted. ``objs``
+ must be a homogeneous iterable of objects (e.g. a QuerySet).
+
+ Returns a nested list of strings suitable for display in the
+ template with the ``unordered_list`` filter.
+ """
+ collector = NestedObjects(using=using)
+ collector.collect(objs)
+ perms_needed = set()
+
+ def format_callback(obj):
+ has_admin = obj.__class__ in admin_site._registry
+ opts = obj._meta
+
+ no_edit_link = '%s: %s' % (capfirst(opts.verbose_name),
+ force_text(obj))
+
+ if has_admin:
+ try:
+ admin_url = reverse('%s:%s_%s_change'
+ % (admin_site.name,
+ opts.app_label,
+ opts.model_name),
+ None, (quote(obj._get_pk_val()),))
+ except NoReverseMatch:
+ # Change url doesn't exist -- don't display link to edit
+ return no_edit_link
+
+ p = '%s.%s' % (opts.app_label,
+ get_permission_codename('delete', opts))
+ if not user.has_perm(p):
+ perms_needed.add(opts.verbose_name)
+ # Display a link to the admin page.
+ return format_html('{}: <a href="{}">{}</a>',
+ capfirst(opts.verbose_name),
+ admin_url,
+ obj)
+ else:
+ # Don't display link to edit, because it either has no
+ # admin or is edited inline.
+ return no_edit_link
+
+ to_delete = collector.nested(format_callback)
+
+ protected = [format_callback(obj) for obj in collector.protected]
+
+ return to_delete, collector.model_count, perms_needed, protected
+
+
+class NestedObjects(Collector):
+ def __init__(self, *args, **kwargs):
+ super(NestedObjects, self).__init__(*args, **kwargs)
+ self.edges = {} # {from_instance: [to_instances]}
+ self.protected = set()
+ self.model_count = defaultdict(int)
+
+ def add_edge(self, source, target):
+ self.edges.setdefault(source, []).append(target)
+
+ def collect(self, objs, source=None, source_attr=None, **kwargs):
+ for obj in objs:
+ if source_attr and not source_attr.endswith('+'):
+ related_name = source_attr % {
+ 'class': source._meta.model_name,
+ 'app_label': source._meta.app_label,
+ }
+ self.add_edge(getattr(obj, related_name), obj)
+ else:
+ self.add_edge(None, obj)
+ self.model_count[obj._meta.verbose_name_plural] += 1
+ try:
+ return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs)
+ except models.ProtectedError as e:
+ self.protected.update(e.protected_objects)
+
+ def related_objects(self, related, objs):
+ qs = super(NestedObjects, self).related_objects(related, objs)
+ return qs.select_related(related.field.name)
+
+ def _nested(self, obj, seen, format_callback):
+ if obj in seen:
+ return []
+ seen.add(obj)
+ children = []
+ for child in self.edges.get(obj, ()):
+ children.extend(self._nested(child, seen, format_callback))
+ if format_callback:
+ ret = [format_callback(obj)]
+ else:
+ ret = [obj]
+ if children:
+ ret.append(children)
+ return ret
+
+ def nested(self, format_callback=None):
+ """
+ Return the graph as a nested list.
+ """
+ seen = set()
+ roots = []
+ for root in self.edges.get(None, ()):
+ roots.extend(self._nested(root, seen, format_callback))
+ return roots
+
+ def can_fast_delete(self, *args, **kwargs):
+ """
+ We always want to load the objects into memory so that we can display
+ them to the user in confirm page.
+ """
+ return False
+
+
+def model_format_dict(obj):
+ """
+ Return a `dict` with keys 'verbose_name' and 'verbose_name_plural',
+ typically for use with string formatting.
+
+ `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
+ """
+ if isinstance(obj, (models.Model, models.base.ModelBase)):
+ opts = obj._meta
+ elif isinstance(obj, models.query.QuerySet):
+ opts = obj.model._meta
+ else:
+ opts = obj
+ return {
+ 'verbose_name': force_text(opts.verbose_name),
+ 'verbose_name_plural': force_text(opts.verbose_name_plural)
+ }
+
+
+def model_ngettext(obj, n=None):
+ """
+ Return the appropriate `verbose_name` or `verbose_name_plural` value for
+ `obj` depending on the count `n`.
+
+ `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
+ If `obj` is a `QuerySet` instance, `n` is optional and the length of the
+ `QuerySet` is used.
+ """
+ if isinstance(obj, models.query.QuerySet):
+ if n is None:
+ n = obj.count()
+ obj = obj.model
+ d = model_format_dict(obj)
+ singular, plural = d["verbose_name"], d["verbose_name_plural"]
+ return ungettext(singular, plural, n or 0)
+
+
+def lookup_field(name, obj, model_admin=None):
+ opts = obj._meta
+ try:
+ f = _get_non_gfk_field(opts, name)
+ except FieldDoesNotExist:
+ # For non-field values, the value is either a method, property or
+ # returned via a callable.
+ if callable(name):
+ attr = name
+ value = attr(obj)
+ elif (model_admin is not None and
+ hasattr(model_admin, name) and
+ not name == '__str__' and
+ not name == '__unicode__'):
+ attr = getattr(model_admin, name)
+ value = attr(obj)
+ else:
+ attr = getattr(obj, name)
+ if callable(attr):
+ value = attr()
+ else:
+ value = attr
+ f = None
+ else:
+ attr = None
+ value = getattr(obj, name)
+ return f, attr, value
+
+
+def _get_non_gfk_field(opts, name):
+ """
+ For historical reasons, the admin app relies on GenericForeignKeys as being
+ "not found" by get_field(). This could likely be cleaned up.
+
+ Reverse relations should also be excluded as these aren't attributes of the
+ model (rather something like `foo_set`).
+ """
+ field = opts.get_field(name)
+ if (field.is_relation and
+ # Generic foreign keys OR reverse relations
+ ((field.many_to_one and not field.related_model) or field.one_to_many)):
+ raise FieldDoesNotExist()
+ return field
+
+
+def label_for_field(name, model, model_admin=None, return_attr=False):
+ """
+ Returns a sensible label for a field name. The name can be a callable,
+ property (but not created with @property decorator) or the name of an
+ object's attribute, as well as a genuine fields. If return_attr is
+ True, the resolved attribute (which could be a callable) is also returned.
+ This will be None if (and only if) the name refers to a field.
+ """
+ attr = None
+ try:
+ field = _get_non_gfk_field(model._meta, name)
+ try:
+ label = field.verbose_name
+ except AttributeError:
+ # field is likely a ForeignObjectRel
+ label = field.related_model._meta.verbose_name
+ except FieldDoesNotExist:
+ if name == "__unicode__":
+ label = force_text(model._meta.verbose_name)
+ attr = six.text_type
+ elif name == "__str__":
+ label = force_str(model._meta.verbose_name)
+ attr = bytes
+ else:
+ if callable(name):
+ attr = name
+ elif model_admin is not None and hasattr(model_admin, name):
+ attr = getattr(model_admin, name)
+ elif hasattr(model, name):
+ attr = getattr(model, name)
+ else:
+ message = "Unable to lookup '%s' on %s" % (name, model._meta.object_name)
+ if model_admin:
+ message += " or %s" % (model_admin.__class__.__name__,)
+ raise AttributeError(message)
+
+ if hasattr(attr, "short_description"):
+ label = attr.short_description
+ elif (isinstance(attr, property) and
+ hasattr(attr, "fget") and
+ hasattr(attr.fget, "short_description")):
+ label = attr.fget.short_description
+ elif callable(attr):
+ if attr.__name__ == "<lambda>":
+ label = "--"
+ else:
+ label = pretty_name(attr.__name__)
+ else:
+ label = pretty_name(name)
+ if return_attr:
+ return (label, attr)
+ else:
+ return label
+
+
+def help_text_for_field(name, model):
+ help_text = ""
+ try:
+ field = _get_non_gfk_field(model._meta, name)
+ except FieldDoesNotExist:
+ pass
+ else:
+ if hasattr(field, 'help_text'):
+ help_text = field.help_text
+ return smart_text(help_text)
+
+
+def display_for_field(value, field, empty_value_display):
+ from django.contrib.admin.templatetags.admin_list import _boolean_icon
+
+ if field.flatchoices:
+ return dict(field.flatchoices).get(value, empty_value_display)
+ # NullBooleanField needs special-case null-handling, so it comes
+ # before the general null test.
+ elif isinstance(field, models.BooleanField) or isinstance(field, models.NullBooleanField):
+ return _boolean_icon(value)
+ elif value is None:
+ return empty_value_display
+ elif isinstance(field, models.DateTimeField):
+ return formats.localize(timezone.template_localtime(value))
+ elif isinstance(field, (models.DateField, models.TimeField)):
+ return formats.localize(value)
+ elif isinstance(field, models.DecimalField):
+ return formats.number_format(value, field.decimal_places)
+ elif isinstance(field, (models.IntegerField, models.FloatField)):
+ return formats.number_format(value)
+ elif isinstance(field, models.FileField) and value:
+ return format_html('<a href="{}">{}</a>', value.url, value)
+ else:
+ return smart_text(value)
+
+
+def display_for_value(value, empty_value_display, boolean=False):
+ from django.contrib.admin.templatetags.admin_list import _boolean_icon
+
+ if boolean:
+ return _boolean_icon(value)
+ elif value is None:
+ return empty_value_display
+ elif isinstance(value, datetime.datetime):
+ return formats.localize(timezone.template_localtime(value))
+ elif isinstance(value, (datetime.date, datetime.time)):
+ return formats.localize(value)
+ elif isinstance(value, six.integer_types + (decimal.Decimal, float)):
+ return formats.number_format(value)
+ else:
+ return smart_text(value)
+
+
+class NotRelationField(Exception):
+ pass
+
+
+def get_model_from_relation(field):
+ if hasattr(field, 'get_path_info'):
+ return field.get_path_info()[-1].to_opts.model
+ else:
+ raise NotRelationField
+
+
+def reverse_field_path(model, path):
+ """ Create a reversed field path.
+
+ E.g. Given (Order, "user__groups"),
+ return (Group, "user__order").
+
+ Final field must be a related model, not a data field.
+ """
+ reversed_path = []
+ parent = model
+ pieces = path.split(LOOKUP_SEP)
+ for piece in pieces:
+ field = parent._meta.get_field(piece)
+ # skip trailing data field if extant:
+ if len(reversed_path) == len(pieces) - 1: # final iteration
+ try:
+ get_model_from_relation(field)
+ except NotRelationField:
+ break
+
+ # Field should point to another model
+ if field.is_relation and not (field.auto_created and not field.concrete):
+ related_name = field.related_query_name()
+ parent = field.remote_field.model
+ else:
+ related_name = field.field.name
+ parent = field.related_model
+ reversed_path.insert(0, related_name)
+ return (parent, LOOKUP_SEP.join(reversed_path))
+
+
+def get_fields_from_path(model, path):
+ """ Return list of Fields given path relative to model.
+
+ e.g. (ModelX, "user__groups__name") -> [
+ <django.db.models.fields.related.ForeignKey object at 0x...>,
+ <django.db.models.fields.related.ManyToManyField object at 0x...>,
+ <django.db.models.fields.CharField object at 0x...>,
+ ]
+ """
+ pieces = path.split(LOOKUP_SEP)
+ fields = []
+ for piece in pieces:
+ if fields:
+ parent = get_model_from_relation(fields[-1])
+ else:
+ parent = model
+ fields.append(parent._meta.get_field(piece))
+ return fields
+
+
+def remove_trailing_data_field(fields):
+ """ Discard trailing non-relation field if extant. """
+ try:
+ get_model_from_relation(fields[-1])
+ except NotRelationField:
+ fields = fields[:-1]
+ return fields
diff --git a/tbc/static/admin/views/__init__.py b/tbc/static/admin/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tbc/static/admin/views/__init__.py
diff --git a/tbc/static/admin/views/decorators.py b/tbc/static/admin/views/decorators.py
new file mode 100644
index 0000000..f14570c
--- /dev/null
+++ b/tbc/static/admin/views/decorators.py
@@ -0,0 +1,18 @@
+from django.contrib.auth import REDIRECT_FIELD_NAME
+from django.contrib.auth.decorators import user_passes_test
+
+
+def staff_member_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME,
+ login_url='admin:login'):
+ """
+ Decorator for views that checks that the user is logged in and is a staff
+ member, redirecting to the login page if necessary.
+ """
+ actual_decorator = user_passes_test(
+ lambda u: u.is_active and u.is_staff,
+ login_url=login_url,
+ redirect_field_name=redirect_field_name
+ )
+ if view_func:
+ return actual_decorator(view_func)
+ return actual_decorator
diff --git a/tbc/static/admin/views/main.py b/tbc/static/admin/views/main.py
new file mode 100644
index 0000000..5da031d
--- /dev/null
+++ b/tbc/static/admin/views/main.py
@@ -0,0 +1,392 @@
+import sys
+from collections import OrderedDict
+
+from django.contrib.admin import FieldListFilter
+from django.contrib.admin.exceptions import (
+ DisallowedModelAdminLookup, DisallowedModelAdminToField,
+)
+from django.contrib.admin.options import (
+ IS_POPUP_VAR, TO_FIELD_VAR, IncorrectLookupParameters,
+)
+from django.contrib.admin.utils import (
+ get_fields_from_path, lookup_needs_distinct, prepare_lookup_value, quote,
+)
+from django.core.exceptions import (
+ FieldDoesNotExist, ImproperlyConfigured, SuspiciousOperation,
+)
+from django.core.paginator import InvalidPage
+from django.core.urlresolvers import reverse
+from django.db import models
+from django.utils import six
+from django.utils.encoding import force_text
+from django.utils.http import urlencode
+from django.utils.translation import ugettext
+
+# Changelist settings
+ALL_VAR = 'all'
+ORDER_VAR = 'o'
+ORDER_TYPE_VAR = 'ot'
+PAGE_VAR = 'p'
+SEARCH_VAR = 'q'
+ERROR_FLAG = 'e'
+
+IGNORED_PARAMS = (
+ ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR, TO_FIELD_VAR)
+
+
+class ChangeList(object):
+ def __init__(self, request, model, list_display, list_display_links,
+ list_filter, date_hierarchy, search_fields, list_select_related,
+ list_per_page, list_max_show_all, list_editable, model_admin):
+ self.model = model
+ self.opts = model._meta
+ self.lookup_opts = self.opts
+ self.root_queryset = model_admin.get_queryset(request)
+ self.list_display = list_display
+ self.list_display_links = list_display_links
+ self.list_filter = list_filter
+ self.date_hierarchy = date_hierarchy
+ self.search_fields = search_fields
+ self.list_select_related = list_select_related
+ self.list_per_page = list_per_page
+ self.list_max_show_all = list_max_show_all
+ self.model_admin = model_admin
+ self.preserved_filters = model_admin.get_preserved_filters(request)
+
+ # Get search parameters from the query string.
+ try:
+ self.page_num = int(request.GET.get(PAGE_VAR, 0))
+ except ValueError:
+ self.page_num = 0
+ self.show_all = ALL_VAR in request.GET
+ self.is_popup = IS_POPUP_VAR in request.GET
+ to_field = request.GET.get(TO_FIELD_VAR)
+ if to_field and not model_admin.to_field_allowed(request, to_field):
+ raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field)
+ self.to_field = to_field
+ self.params = dict(request.GET.items())
+ if PAGE_VAR in self.params:
+ del self.params[PAGE_VAR]
+ if ERROR_FLAG in self.params:
+ del self.params[ERROR_FLAG]
+
+ if self.is_popup:
+ self.list_editable = ()
+ else:
+ self.list_editable = list_editable
+ self.query = request.GET.get(SEARCH_VAR, '')
+ self.queryset = self.get_queryset(request)
+ self.get_results(request)
+ if self.is_popup:
+ title = ugettext('Select %s')
+ else:
+ title = ugettext('Select %s to change')
+ self.title = title % force_text(self.opts.verbose_name)
+ self.pk_attname = self.lookup_opts.pk.attname
+
+ def get_filters_params(self, params=None):
+ """
+ Returns all params except IGNORED_PARAMS
+ """
+ if not params:
+ params = self.params
+ lookup_params = params.copy() # a dictionary of the query string
+ # Remove all the parameters that are globally and systematically
+ # ignored.
+ for ignored in IGNORED_PARAMS:
+ if ignored in lookup_params:
+ del lookup_params[ignored]
+ return lookup_params
+
+ def get_filters(self, request):
+ lookup_params = self.get_filters_params()
+ use_distinct = False
+
+ for key, value in lookup_params.items():
+ if not self.model_admin.lookup_allowed(key, value):
+ raise DisallowedModelAdminLookup("Filtering by %s not allowed" % key)
+
+ filter_specs = []
+ if self.list_filter:
+ for list_filter in self.list_filter:
+ if callable(list_filter):
+ # This is simply a custom list filter class.
+ spec = list_filter(request, lookup_params,
+ self.model, self.model_admin)
+ else:
+ field_path = None
+ if isinstance(list_filter, (tuple, list)):
+ # This is a custom FieldListFilter class for a given field.
+ field, field_list_filter_class = list_filter
+ else:
+ # This is simply a field name, so use the default
+ # FieldListFilter class that has been registered for
+ # the type of the given field.
+ field, field_list_filter_class = list_filter, FieldListFilter.create
+ if not isinstance(field, models.Field):
+ field_path = field
+ field = get_fields_from_path(self.model, field_path)[-1]
+ spec = field_list_filter_class(field, request, lookup_params,
+ self.model, self.model_admin, field_path=field_path)
+ # Check if we need to use distinct()
+ use_distinct = (use_distinct or
+ lookup_needs_distinct(self.lookup_opts,
+ field_path))
+ if spec and spec.has_output():
+ filter_specs.append(spec)
+
+ # At this point, all the parameters used by the various ListFilters
+ # have been removed from lookup_params, which now only contains other
+ # parameters passed via the query string. We now loop through the
+ # remaining parameters both to ensure that all the parameters are valid
+ # fields and to determine if at least one of them needs distinct(). If
+ # the lookup parameters aren't real fields, then bail out.
+ try:
+ for key, value in lookup_params.items():
+ lookup_params[key] = prepare_lookup_value(key, value)
+ use_distinct = (use_distinct or
+ lookup_needs_distinct(self.lookup_opts, key))
+ return filter_specs, bool(filter_specs), lookup_params, use_distinct
+ except FieldDoesNotExist as e:
+ six.reraise(IncorrectLookupParameters, IncorrectLookupParameters(e), sys.exc_info()[2])
+
+ def get_query_string(self, new_params=None, remove=None):
+ if new_params is None:
+ new_params = {}
+ if remove is None:
+ remove = []
+ p = self.params.copy()
+ for r in remove:
+ for k in list(p):
+ if k.startswith(r):
+ del p[k]
+ for k, v in new_params.items():
+ if v is None:
+ if k in p:
+ del p[k]
+ else:
+ p[k] = v
+ return '?%s' % urlencode(sorted(p.items()))
+
+ def get_results(self, request):
+ paginator = self.model_admin.get_paginator(request, self.queryset, self.list_per_page)
+ # Get the number of objects, with admin filters applied.
+ result_count = paginator.count
+
+ # Get the total number of objects, with no admin filters applied.
+ # Perform a slight optimization:
+ # full_result_count is equal to paginator.count if no filters
+ # were applied
+ if self.model_admin.show_full_result_count:
+ if self.get_filters_params() or self.params.get(SEARCH_VAR):
+ full_result_count = self.root_queryset.count()
+ else:
+ full_result_count = result_count
+ else:
+ full_result_count = None
+ can_show_all = result_count <= self.list_max_show_all
+ multi_page = result_count > self.list_per_page
+
+ # Get the list of objects to display on this page.
+ if (self.show_all and can_show_all) or not multi_page:
+ result_list = self.queryset._clone()
+ else:
+ try:
+ result_list = paginator.page(self.page_num + 1).object_list
+ except InvalidPage:
+ raise IncorrectLookupParameters
+
+ self.result_count = result_count
+ self.show_full_result_count = self.model_admin.show_full_result_count
+ # Admin actions are shown if there is at least one entry
+ # or if entries are not counted because show_full_result_count is disabled
+ self.show_admin_actions = not self.show_full_result_count or bool(full_result_count)
+ self.full_result_count = full_result_count
+ self.result_list = result_list
+ self.can_show_all = can_show_all
+ self.multi_page = multi_page
+ self.paginator = paginator
+
+ def _get_default_ordering(self):
+ ordering = []
+ if self.model_admin.ordering:
+ ordering = self.model_admin.ordering
+ elif self.lookup_opts.ordering:
+ ordering = self.lookup_opts.ordering
+ return ordering
+
+ def get_ordering_field(self, field_name):
+ """
+ Returns the proper model field name corresponding to the given
+ field_name to use for ordering. field_name may either be the name of a
+ proper model field or the name of a method (on the admin or model) or a
+ callable with the 'admin_order_field' attribute. Returns None if no
+ proper model field name can be matched.
+ """
+ try:
+ field = self.lookup_opts.get_field(field_name)
+ return field.name
+ except FieldDoesNotExist:
+ # See whether field_name is a name of a non-field
+ # that allows sorting.
+ if callable(field_name):
+ attr = field_name
+ elif hasattr(self.model_admin, field_name):
+ attr = getattr(self.model_admin, field_name)
+ else:
+ attr = getattr(self.model, field_name)
+ return getattr(attr, 'admin_order_field', None)
+
+ def get_ordering(self, request, queryset):
+ """
+ Returns the list of ordering fields for the change list.
+ First we check the get_ordering() method in model admin, then we check
+ the object's default ordering. Then, any manually-specified ordering
+ from the query string overrides anything. Finally, a deterministic
+ order is guaranteed by ensuring the primary key is used as the last
+ ordering field.
+ """
+ params = self.params
+ ordering = list(self.model_admin.get_ordering(request)
+ or self._get_default_ordering())
+ if ORDER_VAR in params:
+ # Clear ordering and used params
+ ordering = []
+ order_params = params[ORDER_VAR].split('.')
+ for p in order_params:
+ try:
+ none, pfx, idx = p.rpartition('-')
+ field_name = self.list_display[int(idx)]
+ order_field = self.get_ordering_field(field_name)
+ if not order_field:
+ continue # No 'admin_order_field', skip it
+ # reverse order if order_field has already "-" as prefix
+ if order_field.startswith('-') and pfx == "-":
+ ordering.append(order_field[1:])
+ else:
+ ordering.append(pfx + order_field)
+ except (IndexError, ValueError):
+ continue # Invalid ordering specified, skip it.
+
+ # Add the given query's ordering fields, if any.
+ ordering.extend(queryset.query.order_by)
+
+ # Ensure that the primary key is systematically present in the list of
+ # ordering fields so we can guarantee a deterministic order across all
+ # database backends.
+ pk_name = self.lookup_opts.pk.name
+ if not (set(ordering) & {'pk', '-pk', pk_name, '-' + pk_name}):
+ # The two sets do not intersect, meaning the pk isn't present. So
+ # we add it.
+ ordering.append('-pk')
+
+ return ordering
+
+ def get_ordering_field_columns(self):
+ """
+ Returns an OrderedDict of ordering field column numbers and asc/desc
+ """
+
+ # We must cope with more than one column having the same underlying sort
+ # field, so we base things on column numbers.
+ ordering = self._get_default_ordering()
+ ordering_fields = OrderedDict()
+ if ORDER_VAR not in self.params:
+ # for ordering specified on ModelAdmin or model Meta, we don't know
+ # the right column numbers absolutely, because there might be more
+ # than one column associated with that ordering, so we guess.
+ for field in ordering:
+ if field.startswith('-'):
+ field = field[1:]
+ order_type = 'desc'
+ else:
+ order_type = 'asc'
+ for index, attr in enumerate(self.list_display):
+ if self.get_ordering_field(attr) == field:
+ ordering_fields[index] = order_type
+ break
+ else:
+ for p in self.params[ORDER_VAR].split('.'):
+ none, pfx, idx = p.rpartition('-')
+ try:
+ idx = int(idx)
+ except ValueError:
+ continue # skip it
+ ordering_fields[idx] = 'desc' if pfx == '-' else 'asc'
+ return ordering_fields
+
+ def get_queryset(self, request):
+ # First, we collect all the declared list filters.
+ (self.filter_specs, self.has_filters, remaining_lookup_params,
+ filters_use_distinct) = self.get_filters(request)
+
+ # Then, we let every list filter modify the queryset to its liking.
+ qs = self.root_queryset
+ for filter_spec in self.filter_specs:
+ new_qs = filter_spec.queryset(request, qs)
+ if new_qs is not None:
+ qs = new_qs
+
+ try:
+ # Finally, we apply the remaining lookup parameters from the query
+ # string (i.e. those that haven't already been processed by the
+ # filters).
+ qs = qs.filter(**remaining_lookup_params)
+ except (SuspiciousOperation, ImproperlyConfigured):
+ # Allow certain types of errors to be re-raised as-is so that the
+ # caller can treat them in a special way.
+ raise
+ except Exception as e:
+ # Every other error is caught with a naked except, because we don't
+ # have any other way of validating lookup parameters. They might be
+ # invalid if the keyword arguments are incorrect, or if the values
+ # are not in the correct type, so we might get FieldError,
+ # ValueError, ValidationError, or ?.
+ raise IncorrectLookupParameters(e)
+
+ if not qs.query.select_related:
+ qs = self.apply_select_related(qs)
+
+ # Set ordering.
+ ordering = self.get_ordering(request, qs)
+ qs = qs.order_by(*ordering)
+
+ # Apply search results
+ qs, search_use_distinct = self.model_admin.get_search_results(
+ request, qs, self.query)
+
+ # Remove duplicates from results, if necessary
+ if filters_use_distinct | search_use_distinct:
+ return qs.distinct()
+ else:
+ return qs
+
+ def apply_select_related(self, qs):
+ if self.list_select_related is True:
+ return qs.select_related()
+
+ if self.list_select_related is False:
+ if self.has_related_field_in_list_display():
+ return qs.select_related()
+
+ if self.list_select_related:
+ return qs.select_related(*self.list_select_related)
+ return qs
+
+ def has_related_field_in_list_display(self):
+ for field_name in self.list_display:
+ try:
+ field = self.lookup_opts.get_field(field_name)
+ except FieldDoesNotExist:
+ pass
+ else:
+ if isinstance(field.remote_field, models.ManyToOneRel):
+ return True
+ return False
+
+ def url_for_result(self, result):
+ pk = getattr(result, self.pk_attname)
+ return reverse('admin:%s_%s_change' % (self.opts.app_label,
+ self.opts.model_name),
+ args=(quote(pk),),
+ current_app=self.model_admin.admin_site.name)
diff --git a/tbc/static/admin/widgets.py b/tbc/static/admin/widgets.py
new file mode 100644
index 0000000..491c788
--- /dev/null
+++ b/tbc/static/admin/widgets.py
@@ -0,0 +1,391 @@
+"""
+Form Widget classes specific to the Django admin site.
+"""
+from __future__ import unicode_literals
+
+import copy
+
+from django import forms
+from django.contrib.admin.templatetags.admin_static import static
+from django.core.urlresolvers import reverse
+from django.db.models.deletion import CASCADE
+from django.forms.utils import flatatt
+from django.forms.widgets import RadioFieldRenderer
+from django.template.loader import render_to_string
+from django.utils import six
+from django.utils.encoding import force_text
+from django.utils.html import (
+ escape, escapejs, format_html, format_html_join, smart_urlquote,
+)
+from django.utils.safestring import mark_safe
+from django.utils.text import Truncator
+from django.utils.translation import ugettext as _
+
+
+class FilteredSelectMultiple(forms.SelectMultiple):
+ """
+ A SelectMultiple with a JavaScript filter interface.
+
+ Note that the resulting JavaScript assumes that the jsi18n
+ catalog has been loaded in the page
+ """
+ @property
+ def media(self):
+ js = ["core.js", "SelectBox.js", "SelectFilter2.js"]
+ return forms.Media(js=[static("admin/js/%s" % path) for path in js])
+
+ def __init__(self, verbose_name, is_stacked, attrs=None, choices=()):
+ self.verbose_name = verbose_name
+ self.is_stacked = is_stacked
+ super(FilteredSelectMultiple, self).__init__(attrs, choices)
+
+ def render(self, name, value, attrs=None, choices=()):
+ if attrs is None:
+ attrs = {}
+ attrs['class'] = 'selectfilter'
+ if self.is_stacked:
+ attrs['class'] += 'stacked'
+ output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
+ output.append('<script type="text/javascript">addEvent(window, "load", function(e) {')
+ # TODO: "id_" is hard-coded here. This should instead use the correct
+ # API to determine the ID dynamically.
+ output.append('SelectFilter.init("id_%s", "%s", %s); });</script>\n'
+ % (name, escapejs(self.verbose_name), int(self.is_stacked)))
+ return mark_safe(''.join(output))
+
+
+class AdminDateWidget(forms.DateInput):
+ @property
+ def media(self):
+ js = ["calendar.js", "admin/DateTimeShortcuts.js"]
+ return forms.Media(js=[static("admin/js/%s" % path) for path in js])
+
+ def __init__(self, attrs=None, format=None):
+ final_attrs = {'class': 'vDateField', 'size': '10'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminDateWidget, self).__init__(attrs=final_attrs, format=format)
+
+
+class AdminTimeWidget(forms.TimeInput):
+ @property
+ def media(self):
+ js = ["calendar.js", "admin/DateTimeShortcuts.js"]
+ return forms.Media(js=[static("admin/js/%s" % path) for path in js])
+
+ def __init__(self, attrs=None, format=None):
+ final_attrs = {'class': 'vTimeField', 'size': '8'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminTimeWidget, self).__init__(attrs=final_attrs, format=format)
+
+
+class AdminSplitDateTime(forms.SplitDateTimeWidget):
+ """
+ A SplitDateTime Widget that has some admin-specific styling.
+ """
+ def __init__(self, attrs=None):
+ widgets = [AdminDateWidget, AdminTimeWidget]
+ # Note that we're calling MultiWidget, not SplitDateTimeWidget, because
+ # we want to define widgets.
+ forms.MultiWidget.__init__(self, widgets, attrs)
+
+ def format_output(self, rendered_widgets):
+ return format_html('<p class="datetime">{} {}<br />{} {}</p>',
+ _('Date:'), rendered_widgets[0],
+ _('Time:'), rendered_widgets[1])
+
+
+class AdminRadioFieldRenderer(RadioFieldRenderer):
+ def render(self):
+ """Outputs a <ul> for this set of radio fields."""
+ return format_html('<ul{}>\n{}\n</ul>',
+ flatatt(self.attrs),
+ format_html_join('\n', '<li>{}</li>',
+ ((force_text(w),) for w in self)))
+
+
+class AdminRadioSelect(forms.RadioSelect):
+ renderer = AdminRadioFieldRenderer
+
+
+class AdminFileWidget(forms.ClearableFileInput):
+ template_with_initial = ('<p class="file-upload">%s</p>'
+ % forms.ClearableFileInput.template_with_initial)
+ template_with_clear = ('<span class="clearable-file-input">%s</span>'
+ % forms.ClearableFileInput.template_with_clear)
+
+
+def url_params_from_lookup_dict(lookups):
+ """
+ Converts the type of lookups specified in a ForeignKey limit_choices_to
+ attribute to a dictionary of query parameters
+ """
+ params = {}
+ if lookups and hasattr(lookups, 'items'):
+ items = []
+ for k, v in lookups.items():
+ if callable(v):
+ v = v()
+ if isinstance(v, (tuple, list)):
+ v = ','.join(str(x) for x in v)
+ elif isinstance(v, bool):
+ # See django.db.fields.BooleanField.get_prep_lookup
+ v = ('0', '1')[v]
+ else:
+ v = six.text_type(v)
+ items.append((k, v))
+ params.update(dict(items))
+ return params
+
+
+class ForeignKeyRawIdWidget(forms.TextInput):
+ """
+ A Widget for displaying ForeignKeys in the "raw_id" interface rather than
+ in a <select> box.
+ """
+ def __init__(self, rel, admin_site, attrs=None, using=None):
+ self.rel = rel
+ self.admin_site = admin_site
+ self.db = using
+ super(ForeignKeyRawIdWidget, self).__init__(attrs)
+
+ def render(self, name, value, attrs=None):
+ rel_to = self.rel.model
+ if attrs is None:
+ attrs = {}
+ extra = []
+ if rel_to in self.admin_site._registry:
+ # The related object is registered with the same AdminSite
+ related_url = reverse(
+ 'admin:%s_%s_changelist' % (
+ rel_to._meta.app_label,
+ rel_to._meta.model_name,
+ ),
+ current_app=self.admin_site.name,
+ )
+
+ params = self.url_parameters()
+ if params:
+ url = '?' + '&amp;'.join('%s=%s' % (k, v) for k, v in params.items())
+ else:
+ url = ''
+ if "class" not in attrs:
+ attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript code looks for this hook.
+ # TODO: "lookup_id_" is hard-coded here. This should instead use
+ # the correct API to determine the ID dynamically.
+ extra.append('<a href="%s%s" class="related-lookup" id="lookup_id_%s" title="%s"></a>' %
+ (related_url, url, name, _('Lookup')))
+ output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] + extra
+ if value:
+ output.append(self.label_for_value(value))
+ return mark_safe(''.join(output))
+
+ def base_url_parameters(self):
+ limit_choices_to = self.rel.limit_choices_to
+ if callable(limit_choices_to):
+ limit_choices_to = limit_choices_to()
+ return url_params_from_lookup_dict(limit_choices_to)
+
+ def url_parameters(self):
+ from django.contrib.admin.views.main import TO_FIELD_VAR
+ params = self.base_url_parameters()
+ params.update({TO_FIELD_VAR: self.rel.get_related_field().name})
+ return params
+
+ def label_for_value(self, value):
+ key = self.rel.get_related_field().name
+ try:
+ obj = self.rel.model._default_manager.using(self.db).get(**{key: value})
+ return '&nbsp;<strong>%s</strong>' % escape(Truncator(obj).words(14, truncate='...'))
+ except (ValueError, self.rel.model.DoesNotExist):
+ return ''
+
+
+class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
+ """
+ A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
+ in a <select multiple> box.
+ """
+ def render(self, name, value, attrs=None):
+ if attrs is None:
+ attrs = {}
+ if self.rel.model in self.admin_site._registry:
+ # The related object is registered with the same AdminSite
+ attrs['class'] = 'vManyToManyRawIdAdminField'
+ if value:
+ value = ','.join(force_text(v) for v in value)
+ else:
+ value = ''
+ return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
+
+ def url_parameters(self):
+ return self.base_url_parameters()
+
+ def label_for_value(self, value):
+ return ''
+
+ def value_from_datadict(self, data, files, name):
+ value = data.get(name)
+ if value:
+ return value.split(',')
+
+
+class RelatedFieldWidgetWrapper(forms.Widget):
+ """
+ This class is a wrapper to a given widget to add the add icon for the
+ admin interface.
+ """
+ template = 'admin/related_widget_wrapper.html'
+
+ def __init__(self, widget, rel, admin_site, can_add_related=None,
+ can_change_related=False, can_delete_related=False):
+ self.needs_multipart_form = widget.needs_multipart_form
+ self.attrs = widget.attrs
+ self.choices = widget.choices
+ self.widget = widget
+ self.rel = rel
+ # Backwards compatible check for whether a user can add related
+ # objects.
+ if can_add_related is None:
+ can_add_related = rel.model in admin_site._registry
+ self.can_add_related = can_add_related
+ # XXX: The UX does not support multiple selected values.
+ multiple = getattr(widget, 'allow_multiple_selected', False)
+ self.can_change_related = not multiple and can_change_related
+ # XXX: The deletion UX can be confusing when dealing with cascading deletion.
+ cascade = getattr(rel, 'on_delete', None) is CASCADE
+ self.can_delete_related = not multiple and not cascade and can_delete_related
+ # so we can check if the related object is registered with this AdminSite
+ self.admin_site = admin_site
+
+ def __deepcopy__(self, memo):
+ obj = copy.copy(self)
+ obj.widget = copy.deepcopy(self.widget, memo)
+ obj.attrs = self.widget.attrs
+ memo[id(self)] = obj
+ return obj
+
+ @property
+ def is_hidden(self):
+ return self.widget.is_hidden
+
+ @property
+ def media(self):
+ return self.widget.media
+
+ def get_related_url(self, info, action, *args):
+ return reverse("admin:%s_%s_%s" % (info + (action,)),
+ current_app=self.admin_site.name, args=args)
+
+ def render(self, name, value, *args, **kwargs):
+ from django.contrib.admin.views.main import IS_POPUP_VAR, TO_FIELD_VAR
+ rel_opts = self.rel.model._meta
+ info = (rel_opts.app_label, rel_opts.model_name)
+ self.widget.choices = self.choices
+ url_params = '&'.join("%s=%s" % param for param in [
+ (TO_FIELD_VAR, self.rel.get_related_field().name),
+ (IS_POPUP_VAR, 1),
+ ])
+ context = {
+ 'widget': self.widget.render(name, value, *args, **kwargs),
+ 'name': name,
+ 'url_params': url_params,
+ 'model': rel_opts.verbose_name,
+ }
+ if self.can_change_related:
+ change_related_template_url = self.get_related_url(info, 'change', '__fk__')
+ context.update(
+ can_change_related=True,
+ change_related_template_url=change_related_template_url,
+ )
+ if self.can_add_related:
+ add_related_url = self.get_related_url(info, 'add')
+ context.update(
+ can_add_related=True,
+ add_related_url=add_related_url,
+ )
+ if self.can_delete_related:
+ delete_related_template_url = self.get_related_url(info, 'delete', '__fk__')
+ context.update(
+ can_delete_related=True,
+ delete_related_template_url=delete_related_template_url,
+ )
+ return mark_safe(render_to_string(self.template, context))
+
+ def build_attrs(self, extra_attrs=None, **kwargs):
+ "Helper function for building an attribute dictionary."
+ self.attrs = self.widget.build_attrs(extra_attrs=None, **kwargs)
+ return self.attrs
+
+ def value_from_datadict(self, data, files, name):
+ return self.widget.value_from_datadict(data, files, name)
+
+ def id_for_label(self, id_):
+ return self.widget.id_for_label(id_)
+
+
+class AdminTextareaWidget(forms.Textarea):
+ def __init__(self, attrs=None):
+ final_attrs = {'class': 'vLargeTextField'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminTextareaWidget, self).__init__(attrs=final_attrs)
+
+
+class AdminTextInputWidget(forms.TextInput):
+ def __init__(self, attrs=None):
+ final_attrs = {'class': 'vTextField'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
+
+
+class AdminEmailInputWidget(forms.EmailInput):
+ def __init__(self, attrs=None):
+ final_attrs = {'class': 'vTextField'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminEmailInputWidget, self).__init__(attrs=final_attrs)
+
+
+class AdminURLFieldWidget(forms.URLInput):
+ def __init__(self, attrs=None):
+ final_attrs = {'class': 'vURLField'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminURLFieldWidget, self).__init__(attrs=final_attrs)
+
+ def render(self, name, value, attrs=None):
+ html = super(AdminURLFieldWidget, self).render(name, value, attrs)
+ if value:
+ value = force_text(self._format_value(value))
+ final_attrs = {'href': smart_urlquote(value)}
+ html = format_html(
+ '<p class="url">{} <a{}>{}</a><br />{} {}</p>',
+ _('Currently:'), flatatt(final_attrs), value,
+ _('Change:'), html
+ )
+ return html
+
+
+class AdminIntegerFieldWidget(forms.TextInput):
+ class_name = 'vIntegerField'
+
+ def __init__(self, attrs=None):
+ final_attrs = {'class': self.class_name}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminIntegerFieldWidget, self).__init__(attrs=final_attrs)
+
+
+class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
+ class_name = 'vBigIntegerField'
+
+
+class AdminCommaSeparatedIntegerFieldWidget(forms.TextInput):
+ def __init__(self, attrs=None):
+ final_attrs = {'class': 'vCommaSeparatedIntegerField'}
+ if attrs is not None:
+ final_attrs.update(attrs)
+ super(AdminCommaSeparatedIntegerFieldWidget, self).__init__(attrs=final_attrs)