From 641c152ed94f00bfd9fb590b4d48fab0ea144d6e Mon Sep 17 00:00:00 2001 From: mbugeia Date: Wed, 14 Oct 2015 15:56:23 +0200 Subject: [PATCH] Update to Kanboard v1.0.19 --- conf/config.php | 42 +- sources/.htaccess | 17 + sources/ChangeLog | 64 + sources/app/.htaccess | 8 +- sources/app/Action/Base.php | 11 + .../Action/TaskDuplicateAnotherProject.php | 4 +- sources/app/Api/Base.php | 6 + sources/app/Api/File.php | 15 +- sources/app/Api/Me.php | 16 +- sources/app/Api/Project.php | 1 + sources/app/Api/Swimlane.php | 12 +- sources/app/Api/Task.php | 6 + sources/app/Auth/Ldap.php | 452 +++++-- sources/app/Auth/ReverseProxy.php | 1 - .../app/Console/TaskOverdueNotification.php | 2 +- sources/app/Controller/App.php | 21 +- sources/app/Controller/Base.php | 2 +- sources/app/Controller/Board.php | 19 +- sources/app/Controller/Budget.php | 135 --- sources/app/Controller/Calendar.php | 31 +- sources/app/Controller/Config.php | 15 +- sources/app/Controller/Customfilter.php | 142 +++ sources/app/Controller/Doc.php | 22 +- sources/app/Controller/File.php | 62 +- sources/app/Controller/Gantt.php | 6 +- sources/app/Controller/Hourlyrate.php | 89 -- sources/app/Controller/Ical.php | 27 +- sources/app/Controller/Swimlane.php | 6 +- sources/app/Controller/Taskcreation.php | 38 +- sources/app/Controller/Taskduplication.php | 19 +- sources/app/Controller/Taskmodification.php | 28 +- sources/app/Controller/Taskstatus.php | 64 +- sources/app/Controller/Timetable.php | 39 - sources/app/Controller/Timetableday.php | 88 -- sources/app/Controller/Timetableextra.php | 16 - sources/app/Controller/Timetableoff.php | 107 -- sources/app/Controller/Timetableweek.php | 99 -- sources/app/Controller/User.php | 9 + sources/app/Controller/Webnotification.php | 39 + sources/app/Core/Base.php | 152 +-- sources/app/Core/Cache.php | 58 - sources/app/Core/Cache/Base.php | 38 + sources/app/Core/Cache/CacheInterface.php | 45 + sources/app/Core/Cache/MemoryCache.php | 65 + sources/app/Core/HttpClient.php | 22 +- sources/app/Core/MemoryCache.php | 32 - sources/app/Core/NotificationInterface.php | 22 + .../app/Core/ObjectStorage/FileStorage.php | 149 +++ .../ObjectStorage/ObjectStorageException.php | 9 + .../ObjectStorage/ObjectStorageInterface.php | 67 ++ sources/app/Core/Plugin/Base.php | 123 ++ sources/app/Core/Plugin/Hook.php | 99 ++ sources/app/Core/Plugin/Loader.php | 148 +++ sources/app/Core/Response.php | 8 +- sources/app/Core/Router.php | 54 +- sources/app/Core/Session.php | 4 +- sources/app/Core/Template.php | 54 +- sources/app/Core/Tool.php | 101 +- sources/app/Core/Translator.php | 23 +- sources/app/Formatter/FormatterInterface.php | 14 + .../app/Formatter/ProjectGanttFormatter.php | 90 ++ .../TaskFilterAutoCompleteFormatter.php | 33 + .../app/Formatter/TaskFilterCalendarEvent.php | 76 ++ .../Formatter/TaskFilterCalendarFormatter.php | 52 + .../Formatter/TaskFilterGanttFormatter.php | 78 ++ .../TaskFilterICalendarFormatter.php | 135 +++ sources/app/Helper/App.php | 2 + sources/app/Helper/Form.php | 20 + sources/app/Helper/Hook.php | 64 + sources/app/Helper/User.php | 15 +- sources/app/Integration/Mailgun.php | 4 +- sources/app/Integration/Postmark.php | 5 +- sources/app/Integration/Sendgrid.php | 4 +- sources/app/Integration/SlackWebhook.php | 65 +- sources/app/Locale/cs_CZ/translations.php | 99 +- sources/app/Locale/da_DK/translations.php | 99 +- sources/app/Locale/de_DE/translations.php | 371 +++--- sources/app/Locale/es_ES/translations.php | 153 ++- sources/app/Locale/fi_FI/translations.php | 99 +- sources/app/Locale/fr_FR/translations.php | 241 ++-- sources/app/Locale/hu_HU/translations.php | 99 +- sources/app/Locale/id_ID/translations.php | 1059 +++++++++++++++++ sources/app/Locale/it_IT/translations.php | 99 +- sources/app/Locale/ja_JP/translations.php | 99 +- sources/app/Locale/nb_NO/translations.php | 409 ++++--- sources/app/Locale/nl_NL/translations.php | 101 +- sources/app/Locale/pl_PL/translations.php | 99 +- sources/app/Locale/pt_BR/translations.php | 113 +- sources/app/Locale/pt_PT/translations.php | 113 +- sources/app/Locale/ru_RU/translations.php | 625 +++++----- .../app/Locale/sr_Latn_RS/translations.php | 99 +- sources/app/Locale/sv_SE/translations.php | 99 +- sources/app/Locale/th_TH/translations.php | 99 +- sources/app/Locale/tr_TR/translations.php | 99 +- sources/app/Locale/zh_CN/translations.php | 99 +- sources/app/Model/Acl.php | 14 +- sources/app/Model/Action.php | 26 +- sources/app/Model/Base.php | 76 +- sources/app/Model/Board.php | 20 + sources/app/Model/Budget.php | 214 ---- sources/app/Model/Config.php | 7 + sources/app/Model/CustomFilter.php | 163 +++ sources/app/Model/EmailNotification.php | 123 ++ sources/app/Model/File.php | 252 ++-- sources/app/Model/HourlyRate.php | 121 -- sources/app/Model/Notification.php | 375 ++---- sources/app/Model/NotificationFilter.php | 199 ++++ sources/app/Model/NotificationType.php | 73 ++ sources/app/Model/OverdueNotification.php | 60 + sources/app/Model/Project.php | 64 +- sources/app/Model/Subtask.php | 50 +- sources/app/Model/SubtaskForecast.php | 124 -- sources/app/Model/SubtaskTimeTracking.php | 61 +- sources/app/Model/Swimlane.php | 28 +- sources/app/Model/TaskDuplication.php | 14 +- sources/app/Model/TaskFilter.php | 289 +---- sources/app/Model/TaskFinder.php | 48 +- sources/app/Model/TaskLink.php | 4 +- sources/app/Model/TaskStatus.php | 17 - sources/app/Model/Timetable.php | 356 ------ sources/app/Model/TimetableDay.php | 87 -- sources/app/Model/TimetableExtra.php | 22 - sources/app/Model/TimetableOff.php | 125 -- sources/app/Model/TimetableWeek.php | 91 -- sources/app/Model/User.php | 8 +- sources/app/Model/WebNotification.php | 156 +++ sources/app/Schema/Mysql.php | 164 +-- sources/app/Schema/Postgres.php | 152 +-- sources/app/Schema/Sqlite.php | 133 +-- sources/app/ServiceProvider/ClassProvider.php | 56 +- .../app/ServiceProvider/LoggingProvider.php | 10 +- .../SubtaskTimeTrackingSubscriber.php | 1 + sources/app/Template/app/notifications.php | 61 + sources/app/Template/app/projects.php | 13 +- sources/app/Template/app/sidebar.php | 4 + sources/app/Template/board/table_column.php | 56 + .../app/Template/board/table_container.php | 77 +- sources/app/Template/board/table_swimlane.php | 108 +- sources/app/Template/board/table_tasks.php | 31 + sources/app/Template/board/task_menu.php | 20 +- sources/app/Template/board/task_private.php | 10 +- .../app/Template/board/tooltip_tasklinks.php | 1 + .../{private_view.php => view_private.php} | 1 + .../{public_view.php => view_public.php} | 0 sources/app/Template/budget/breakdown.php | 30 - sources/app/Template/budget/create.php | 47 - sources/app/Template/budget/index.php | 34 - sources/app/Template/budget/remove.php | 13 - sources/app/Template/budget/sidebar.php | 16 - sources/app/Template/config/calendar.php | 9 +- sources/app/Template/config/plugins.php | 30 + sources/app/Template/config/sidebar.php | 4 + sources/app/Template/currency/index.php | 2 - sources/app/Template/custom_filter/add.php | 22 + sources/app/Template/custom_filter/edit.php | 30 + sources/app/Template/custom_filter/index.php | 40 + sources/app/Template/export/sidebar.php | 1 + sources/app/Template/file/show.php | 2 +- sources/app/Template/gantt/task_creation.php | 12 +- sources/app/Template/header.php | 37 + sources/app/Template/hourlyrate/index.php | 46 - sources/app/Template/hourlyrate/remove.php | 13 - sources/app/Template/layout.php | 46 +- sources/app/Template/project/dropdown.php | 38 +- sources/app/Template/project/filters.php | 29 +- sources/app/Template/project/index.php | 152 ++- sources/app/Template/project/sidebar.php | 5 + sources/app/Template/project_user/sidebar.php | 2 + sources/app/Template/swimlane/edit.php | 21 + sources/app/Template/swimlane/index.php | 28 +- sources/app/Template/swimlane/table.php | 2 +- sources/app/Template/task/color_picker.php | 11 + sources/app/Template/task/sidebar.php | 4 + sources/app/Template/task_creation/form.php | 11 +- .../Template/task_modification/edit_task.php | 11 +- sources/app/Template/task_status/close.php | 2 +- sources/app/Template/task_status/open.php | 6 +- sources/app/Template/tasklink/show.php | 2 + sources/app/Template/timetable/index.php | 44 - sources/app/Template/timetable_day/index.php | 45 - sources/app/Template/timetable_day/remove.php | 13 - .../app/Template/timetable_extra/index.php | 56 - .../app/Template/timetable_extra/remove.php | 13 - sources/app/Template/timetable_off/index.php | 56 - sources/app/Template/timetable_off/remove.php | 13 - sources/app/Template/timetable_week/index.php | 46 - .../app/Template/timetable_week/remove.php | 13 - sources/app/Template/user/create_local.php | 2 +- sources/app/Template/user/create_remote.php | 8 +- sources/app/Template/user/external.php | 2 +- sources/app/Template/user/notifications.php | 27 +- sources/app/Template/user/sidebar.php | 12 +- sources/app/check_setup.php | 17 - sources/app/common.php | 119 +- sources/app/constants.php | 20 +- sources/app/routes.php | 117 ++ sources/assets/css/app.css | 5 +- sources/assets/css/print.css | 5 +- sources/assets/css/src/base.css | 11 +- sources/assets/css/src/board.css | 28 +- sources/assets/css/src/dropdown.css | 34 +- sources/assets/css/src/filters.css | 12 +- sources/assets/css/src/form.css | 14 +- sources/assets/css/src/gantt.css | 2 +- sources/assets/css/src/popover.css | 6 +- sources/assets/css/src/table.css | 4 + sources/assets/css/src/task.css | 32 +- .../assets/css/vendor/font-awesome.min.css | 4 +- sources/assets/fonts/FontAwesome.otf | Bin 93888 -> 106260 bytes sources/assets/fonts/fontawesome-webfont.eot | Bin 60767 -> 68875 bytes sources/assets/fonts/fontawesome-webfont.svg | 105 +- sources/assets/fonts/fontawesome-webfont.ttf | Bin 122092 -> 138204 bytes sources/assets/fonts/fontawesome-webfont.woff | Bin 71508 -> 81284 bytes .../assets/fonts/fontawesome-webfont.woff2 | Bin 56780 -> 64464 bytes sources/assets/js/app.js | 2 +- sources/assets/js/src/App.js | 2 + sources/assets/js/src/Board.js | 72 +- sources/assets/js/src/BudgetChart.js | 55 - sources/assets/js/src/Dropdown.js | 25 +- sources/assets/js/src/Gantt.js | 15 +- sources/assets/js/src/Markdown.js | 14 +- sources/assets/js/src/Popover.js | 40 +- sources/assets/js/src/Router.js | 1 - sources/assets/js/src/Search.js | 6 + sources/assets/js/src/Swimlane.js | 10 +- sources/assets/js/src/Task.js | 10 + sources/config.default.php | 42 +- sources/data/.htaccess | 8 +- sources/doc/.htaccess | 8 +- sources/doc/api-json-rpc.markdown | 147 +++ sources/doc/budget.markdown | 34 - sources/doc/closing-tasks.markdown | 6 +- sources/doc/config.markdown | 40 + sources/doc/custom-filters.markdown | 19 + sources/doc/docker.markdown | 16 +- sources/doc/fr/2fa.markdown | 33 + sources/doc/fr/analytics-tasks.markdown | 24 + sources/doc/fr/analytics.markdown | 70 ++ .../doc/fr/application-configuration.markdown | 41 + .../doc/fr/application-configuration.markup | 41 + sources/doc/fr/automatic-actions.markdown | 137 +++ .../doc/fr/board-collapsed-expanded.markdown | 19 + sources/doc/fr/board-configuration.markdown | 24 + ...zontal-scrolling-and-compact-view.markdown | 13 + .../doc/fr/board-show-hide-columns.markdown | 12 + .../doc/fr/calendar-configuration.markdown | 43 + sources/doc/fr/calendar.markdown | 20 + .../doc/fr/captures/kanboard-acces-prive.png | Bin 0 -> 14432 bytes .../doc/fr/captures/kanboard-acces-public.png | Bin 0 -> 26672 bytes sources/doc/fr/captures/kanboard-board.png | Bin 0 -> 65587 bytes .../captures/kanboard-creer-utilisateur.png | Bin 0 -> 35907 bytes .../captures/kanboard-nouveauprojet-prive.png | Bin 0 -> 17942 bytes .../fr/captures/kanboard-nouveauprojet.png | Bin 0 -> 21282 bytes .../doc/fr/captures/kanboard-swimlanes.png | Bin 0 -> 43399 bytes .../fr/captures/kanboard-vue-calendrier.png | Bin 0 -> 31640 bytes .../doc/fr/captures/kanboard-vue-gantt.png | Bin 0 -> 42360 bytes .../doc/fr/captures/kanboard-vue-liste.png | Bin 0 -> 38316 bytes sources/doc/fr/closing-tasks.markdown | 16 + sources/doc/fr/create-tasks-by-email.markdown | 45 + sources/doc/fr/creating-projects.markdown | 32 + sources/doc/fr/creating-tasks.markdown | 27 + sources/doc/fr/currency-rate.markdown | 11 + sources/doc/fr/duplicate-move-tasks.markdown | 58 + sources/doc/fr/editing-projects.markdown | 16 + sources/doc/fr/gantt-chart-projects.markdown | 17 + sources/doc/fr/gantt-chart-tasks.markdown | 20 + sources/doc/fr/index.markdown | 61 + .../doc/fr/kanban-vs-todo-and-scrum.markdown | 36 + sources/doc/fr/keyboard-shortcuts.markdown | 28 + sources/doc/fr/link-labels.markdown | 13 + sources/doc/fr/notifications.markdown | 48 + sources/doc/fr/project-configuration.markdown | 42 + sources/doc/fr/project-permissions.markdown | 49 + sources/doc/fr/project-views.markdown | 44 + sources/doc/fr/recurring-tasks.markdown | 24 + sources/doc/fr/screenshots.markdown | 26 + sources/doc/fr/sharing-projects.markdown | 37 + sources/doc/fr/subtasks.markdown | 43 + sources/doc/fr/swimlanes.markdown | 28 + sources/doc/fr/task-links.markdown | 22 + sources/doc/fr/time-tracking.markdown | 44 + sources/doc/fr/transitions.markdown | 20 + sources/doc/fr/usage-examples.markdown | 69 ++ sources/doc/fr/user-management.markdown | 81 ++ sources/doc/fr/what-is-kanban.markdown | 34 + sources/doc/gitlab-authentication.markdown | 5 + sources/doc/hourly-rate.markdown | 11 - sources/doc/index.markdown | 8 +- sources/doc/installation.markdown | 9 +- sources/doc/ldap-authentication.markdown | 76 +- sources/doc/ldap-group-sync.markdown | 36 + sources/doc/mysql-configuration.markdown | 13 + sources/doc/nice-urls.markdown | 55 +- sources/doc/notifications.markdown | 31 +- sources/doc/plugins.markdown | 431 +++++++ sources/doc/postgresql-configuration.markdown | 12 + sources/doc/screenshots.markdown | 2 +- sources/doc/subtasks.markdown | 2 +- sources/doc/timetable.markdown | 46 - sources/doc/user-management.markdown | 2 +- sources/doc/vagrant.markdown | 50 +- sources/index.php | 4 +- sources/plugins/.gitignore | 2 + sources/vendor/autoload.php | 2 +- sources/vendor/composer/autoload_classmap.php | 67 +- sources/vendor/composer/autoload_psr4.php | 2 + sources/vendor/composer/autoload_real.php | 10 +- sources/vendor/composer/installed.json | 108 +- .../vendor/fguillot/json-rpc/README.markdown | 364 ------ .../fguillot/json-rpc/src/JsonRPC/Client.php | 14 +- .../src/JsonRPC/ResponseException.php | 61 + .../fguillot/json-rpc/src/JsonRPC/Server.php | 10 + .../league/html-to-markdown/CHANGELOG.md | 130 ++ .../html-to-markdown/LICENSE | 4 +- .../html-to-markdown/src/Configuration.php | 60 + .../src/ConfigurationAwareInterface.php | 11 + .../src/Converter/BlockquoteConverter.php | 44 + .../src/Converter/CommentConverter.php | 26 + .../src/Converter/ConverterInterface.php | 20 + .../src/Converter/DefaultConverter.php | 50 + .../src/Converter/DivConverter.php | 45 + .../src/Converter/EmphasisConverter.php | 50 + .../src/Converter/HardBreakConverter.php | 26 + .../src/Converter/HeaderConverter.php | 78 ++ .../src/Converter/HorizontalRuleConverter.php | 26 + .../src/Converter/ImageConverter.php | 37 + .../src/Converter/LinkConverter.php | 42 + .../src/Converter/ListBlockConverter.php | 26 + .../src/Converter/ListItemConverter.php | 37 + .../src/Converter/ParagraphConverter.php | 28 + .../src/Converter/PreformattedConverter.php | 73 ++ .../src/Converter/TextConverter.php | 42 + .../league/html-to-markdown/src/Element.php | 234 ++++ .../html-to-markdown/src/ElementInterface.php | 80 ++ .../html-to-markdown/src/Environment.php | 102 ++ .../html-to-markdown/src/HtmlConverter.php | 194 +++ .../html-to-markdown/HTML_To_Markdown.php | 598 ---------- .../nickcernis/html-to-markdown/circle.yml | 4 - .../html-to-markdown/demo/index.php | 181 --- sources/vendor/pimple/pimple/CHANGELOG | 5 + .../pimple/pimple/ext/pimple/php_pimple.h | 13 +- .../vendor/pimple/pimple/ext/pimple/pimple.c | 89 +- .../pimple/pimple/src/Pimple/Container.php | 5 +- .../PimpleServiceProviderInterfaceTest.php | 2 +- .../pimple/src/Pimple/Tests/PimpleTest.php | 6 +- .../symfony/console/Command/Command.php | 2 +- .../console/Descriptor/JsonDescriptor.php | 4 +- .../console/Descriptor/MarkdownDescriptor.php | 4 +- .../console/Descriptor/TextDescriptor.php | 14 +- .../console/Event/ConsoleCommandEvent.php | 10 +- .../console/Helper/DebugFormatterHelper.php | 10 +- .../symfony/console/Helper/QuestionHelper.php | 8 +- .../vendor/symfony/console/Helper/Table.php | 4 +- .../symfony/console/Logger/ConsoleLogger.php | 5 +- .../console/Question/ConfirmationQuestion.php | 4 +- .../symfony/console/Style/OutputStyle.php | 2 +- .../symfony/console/Tests/ApplicationTest.php | 4 + .../console/Tests/Command/CommandTest.php | 2 + .../console/Tests/Fixtures/DummyOutput.php | 2 +- .../Tests/Fixtures/application_asxml1.txt | 2 +- .../Tests/Fixtures/application_asxml2.txt | 2 +- .../Tests/Helper/ProcessHelperTest.php | 6 +- .../console/Tests/Helper/ProgressBarTest.php | 7 +- .../console/Tests/Helper/TableTest.php | 2 +- .../Tests/Logger/ConsoleLoggerTest.php | 2 +- .../Tests/AbstractEventDispatcherTest.php | 2 +- .../Debug/TraceableEventDispatcherTest.php | 10 +- 367 files changed, 12063 insertions(+), 7777 deletions(-) delete mode 100644 sources/app/Controller/Budget.php create mode 100644 sources/app/Controller/Customfilter.php delete mode 100644 sources/app/Controller/Hourlyrate.php delete mode 100644 sources/app/Controller/Timetable.php delete mode 100644 sources/app/Controller/Timetableday.php delete mode 100644 sources/app/Controller/Timetableextra.php delete mode 100644 sources/app/Controller/Timetableoff.php delete mode 100644 sources/app/Controller/Timetableweek.php create mode 100644 sources/app/Controller/Webnotification.php delete mode 100644 sources/app/Core/Cache.php create mode 100644 sources/app/Core/Cache/Base.php create mode 100644 sources/app/Core/Cache/CacheInterface.php create mode 100644 sources/app/Core/Cache/MemoryCache.php delete mode 100644 sources/app/Core/MemoryCache.php create mode 100644 sources/app/Core/NotificationInterface.php create mode 100644 sources/app/Core/ObjectStorage/FileStorage.php create mode 100644 sources/app/Core/ObjectStorage/ObjectStorageException.php create mode 100644 sources/app/Core/ObjectStorage/ObjectStorageInterface.php create mode 100644 sources/app/Core/Plugin/Base.php create mode 100644 sources/app/Core/Plugin/Hook.php create mode 100644 sources/app/Core/Plugin/Loader.php create mode 100644 sources/app/Formatter/FormatterInterface.php create mode 100644 sources/app/Formatter/ProjectGanttFormatter.php create mode 100644 sources/app/Formatter/TaskFilterAutoCompleteFormatter.php create mode 100644 sources/app/Formatter/TaskFilterCalendarEvent.php create mode 100644 sources/app/Formatter/TaskFilterCalendarFormatter.php create mode 100644 sources/app/Formatter/TaskFilterGanttFormatter.php create mode 100644 sources/app/Formatter/TaskFilterICalendarFormatter.php create mode 100644 sources/app/Helper/Hook.php create mode 100644 sources/app/Locale/id_ID/translations.php delete mode 100644 sources/app/Model/Budget.php create mode 100644 sources/app/Model/CustomFilter.php create mode 100644 sources/app/Model/EmailNotification.php delete mode 100644 sources/app/Model/HourlyRate.php create mode 100644 sources/app/Model/NotificationFilter.php create mode 100644 sources/app/Model/NotificationType.php create mode 100644 sources/app/Model/OverdueNotification.php delete mode 100644 sources/app/Model/SubtaskForecast.php delete mode 100644 sources/app/Model/Timetable.php delete mode 100644 sources/app/Model/TimetableDay.php delete mode 100644 sources/app/Model/TimetableExtra.php delete mode 100644 sources/app/Model/TimetableOff.php delete mode 100644 sources/app/Model/TimetableWeek.php create mode 100644 sources/app/Model/WebNotification.php create mode 100644 sources/app/Template/app/notifications.php create mode 100644 sources/app/Template/board/table_column.php create mode 100644 sources/app/Template/board/table_tasks.php rename sources/app/Template/board/{private_view.php => view_private.php} (90%) rename sources/app/Template/board/{public_view.php => view_public.php} (100%) delete mode 100644 sources/app/Template/budget/breakdown.php delete mode 100644 sources/app/Template/budget/create.php delete mode 100644 sources/app/Template/budget/index.php delete mode 100644 sources/app/Template/budget/remove.php delete mode 100644 sources/app/Template/budget/sidebar.php create mode 100644 sources/app/Template/config/plugins.php create mode 100644 sources/app/Template/custom_filter/add.php create mode 100644 sources/app/Template/custom_filter/edit.php create mode 100644 sources/app/Template/custom_filter/index.php create mode 100644 sources/app/Template/header.php delete mode 100644 sources/app/Template/hourlyrate/index.php delete mode 100644 sources/app/Template/hourlyrate/remove.php create mode 100644 sources/app/Template/task/color_picker.php delete mode 100644 sources/app/Template/timetable/index.php delete mode 100644 sources/app/Template/timetable_day/index.php delete mode 100644 sources/app/Template/timetable_day/remove.php delete mode 100644 sources/app/Template/timetable_extra/index.php delete mode 100644 sources/app/Template/timetable_extra/remove.php delete mode 100644 sources/app/Template/timetable_off/index.php delete mode 100644 sources/app/Template/timetable_off/remove.php delete mode 100644 sources/app/Template/timetable_week/index.php delete mode 100644 sources/app/Template/timetable_week/remove.php create mode 100644 sources/app/routes.php delete mode 100644 sources/assets/js/src/BudgetChart.js create mode 100644 sources/assets/js/src/Task.js delete mode 100644 sources/doc/budget.markdown create mode 100644 sources/doc/custom-filters.markdown create mode 100644 sources/doc/fr/2fa.markdown create mode 100644 sources/doc/fr/analytics-tasks.markdown create mode 100644 sources/doc/fr/analytics.markdown create mode 100644 sources/doc/fr/application-configuration.markdown create mode 100644 sources/doc/fr/application-configuration.markup create mode 100644 sources/doc/fr/automatic-actions.markdown create mode 100644 sources/doc/fr/board-collapsed-expanded.markdown create mode 100644 sources/doc/fr/board-configuration.markdown create mode 100644 sources/doc/fr/board-horizontal-scrolling-and-compact-view.markdown create mode 100644 sources/doc/fr/board-show-hide-columns.markdown create mode 100644 sources/doc/fr/calendar-configuration.markdown create mode 100644 sources/doc/fr/calendar.markdown create mode 100644 sources/doc/fr/captures/kanboard-acces-prive.png create mode 100644 sources/doc/fr/captures/kanboard-acces-public.png create mode 100644 sources/doc/fr/captures/kanboard-board.png create mode 100644 sources/doc/fr/captures/kanboard-creer-utilisateur.png create mode 100644 sources/doc/fr/captures/kanboard-nouveauprojet-prive.png create mode 100644 sources/doc/fr/captures/kanboard-nouveauprojet.png create mode 100644 sources/doc/fr/captures/kanboard-swimlanes.png create mode 100644 sources/doc/fr/captures/kanboard-vue-calendrier.png create mode 100644 sources/doc/fr/captures/kanboard-vue-gantt.png create mode 100644 sources/doc/fr/captures/kanboard-vue-liste.png create mode 100644 sources/doc/fr/closing-tasks.markdown create mode 100644 sources/doc/fr/create-tasks-by-email.markdown create mode 100644 sources/doc/fr/creating-projects.markdown create mode 100644 sources/doc/fr/creating-tasks.markdown create mode 100644 sources/doc/fr/currency-rate.markdown create mode 100644 sources/doc/fr/duplicate-move-tasks.markdown create mode 100644 sources/doc/fr/editing-projects.markdown create mode 100644 sources/doc/fr/gantt-chart-projects.markdown create mode 100644 sources/doc/fr/gantt-chart-tasks.markdown create mode 100644 sources/doc/fr/index.markdown create mode 100644 sources/doc/fr/kanban-vs-todo-and-scrum.markdown create mode 100644 sources/doc/fr/keyboard-shortcuts.markdown create mode 100644 sources/doc/fr/link-labels.markdown create mode 100644 sources/doc/fr/notifications.markdown create mode 100644 sources/doc/fr/project-configuration.markdown create mode 100644 sources/doc/fr/project-permissions.markdown create mode 100644 sources/doc/fr/project-views.markdown create mode 100644 sources/doc/fr/recurring-tasks.markdown create mode 100644 sources/doc/fr/screenshots.markdown create mode 100644 sources/doc/fr/sharing-projects.markdown create mode 100644 sources/doc/fr/subtasks.markdown create mode 100644 sources/doc/fr/swimlanes.markdown create mode 100644 sources/doc/fr/task-links.markdown create mode 100644 sources/doc/fr/time-tracking.markdown create mode 100644 sources/doc/fr/transitions.markdown create mode 100644 sources/doc/fr/usage-examples.markdown create mode 100644 sources/doc/fr/user-management.markdown create mode 100644 sources/doc/fr/what-is-kanban.markdown delete mode 100644 sources/doc/hourly-rate.markdown create mode 100644 sources/doc/ldap-group-sync.markdown create mode 100644 sources/doc/plugins.markdown delete mode 100644 sources/doc/timetable.markdown create mode 100644 sources/plugins/.gitignore delete mode 100644 sources/vendor/fguillot/json-rpc/README.markdown create mode 100644 sources/vendor/fguillot/json-rpc/src/JsonRPC/ResponseException.php create mode 100644 sources/vendor/league/html-to-markdown/CHANGELOG.md rename sources/vendor/{nickcernis => league}/html-to-markdown/LICENSE (93%) create mode 100644 sources/vendor/league/html-to-markdown/src/Configuration.php create mode 100644 sources/vendor/league/html-to-markdown/src/ConfigurationAwareInterface.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/BlockquoteConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/CommentConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/ConverterInterface.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/DefaultConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/DivConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/EmphasisConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/HardBreakConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/HeaderConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/ImageConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/LinkConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/ListBlockConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/ListItemConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/ParagraphConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/PreformattedConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Converter/TextConverter.php create mode 100644 sources/vendor/league/html-to-markdown/src/Element.php create mode 100644 sources/vendor/league/html-to-markdown/src/ElementInterface.php create mode 100644 sources/vendor/league/html-to-markdown/src/Environment.php create mode 100644 sources/vendor/league/html-to-markdown/src/HtmlConverter.php delete mode 100644 sources/vendor/nickcernis/html-to-markdown/HTML_To_Markdown.php delete mode 100644 sources/vendor/nickcernis/html-to-markdown/circle.yml delete mode 100644 sources/vendor/nickcernis/html-to-markdown/demo/index.php diff --git a/conf/config.php b/conf/config.php index 6cdda70..59c560c 100644 --- a/conf/config.php +++ b/conf/config.php @@ -6,6 +6,9 @@ define('DEBUG', false); // Debug file path define('DEBUG_FILE', __DIR__.'/data/debug.log'); +// Plugins directory +define('PLUGINS_DIR', 'data/plugins'); + // Folder for uploaded files, don't forget the trailing slash define('FILES_DIR', 'data/files/'); @@ -65,20 +68,20 @@ define('LDAP_SERVER', ''); // LDAP server port (389 by default) define('LDAP_PORT', 389); -// By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification. +// By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification define('LDAP_SSL_VERIFY', true); // Enable LDAP START_TLS define('LDAP_START_TLS', false); -// LDAP bind type: "anonymous", "user" (use the given user/password from the form) and "proxy" (a specific user to browse the LDAP directory) +// LDAP bind type: "anonymous", "user" or "proxy" define('LDAP_BIND_TYPE', 'anonymous'); -// LDAP username to connect with. null for anonymous bind (by default). -// Or for user bind type, you can use a pattern: %s@kanboard.local +// LDAP username to use with proxy mode +// LDAP username pattern to use with user mode define('LDAP_USERNAME', null); -// LDAP password to connect with. null for anonymous bind (by default). +// LDAP password to use for proxy mode define('LDAP_PASSWORD', null); // LDAP account base, i.e. root of all user account @@ -90,16 +93,27 @@ define('LDAP_ACCOUNT_BASE', ''); // Example for OpenLDAP: 'uid=%s' define('LDAP_USER_PATTERN', ''); -// Name of an attribute of the user account object which should be used as the full name of the user. +// Name of an attribute of the user account object which should be used as the full name of the user define('LDAP_ACCOUNT_FULLNAME', 'displayname'); -// Name of an attribute of the user account object which should be used as the email of the user. +// Name of an attribute of the user account object which should be used as the email of the user define('LDAP_ACCOUNT_EMAIL', 'mail'); -// Name of an attribute of the user account object which should be used as the id of the user. +// Name of an attribute of the user account object which should be used as the id of the user. (optional) // Example for ActiveDirectory: 'samaccountname' // Example for OpenLDAP: 'uid' -define('LDAP_ACCOUNT_ID', 'samaccountname'); +define('LDAP_ACCOUNT_ID', ''); + +// LDAP Attribute for group membership +define('LDAP_ACCOUNT_MEMBEROF', 'memberof'); + +// DN for administrators +// Example: CN=Kanboard Admins,CN=Users,DC=kanboard,DC=local +define('LDAP_GROUP_ADMIN_DN', ''); + +// DN for project administrators +// Example: CN=Kanboard Project Admins,CN=Users,DC=kanboard,DC=local +define('LDAP_GROUP_PROJECT_ADMIN_DN', ''); // By default Kanboard lowercase the ldap username to avoid duplicate users (the database is case sensitive) // Set to true if you want to preserve the case @@ -174,6 +188,9 @@ define('ENABLE_HSTS', true); // Enable or disable "X-Frame-Options: DENY" HTTP header define('ENABLE_XFRAME', true); +// Enable syslog logging +define('ENABLE_SYSLOG', true); + // Escape html inside markdown text define('MARKDOWN_ESCAPE_HTML', true); @@ -198,3 +215,10 @@ define('BRUTEFORCE_LOCKDOWN_DURATION', 15); // Session duration in second (0 = until the browser is closed) // See http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime define('SESSION_DURATION', 1); + +// HTTP client proxy +define('HTTP_PROXY_HOSTNAME', ''); +define('HTTP_PROXY_PORT', '3128'); +define('HTTP_PROXY_USERNAME', ''); +define('HTTP_PROXY_PASSWORD', ''); + diff --git a/sources/.htaccess b/sources/.htaccess index 0d873f5..45123a9 100644 --- a/sources/.htaccess +++ b/sources/.htaccess @@ -7,3 +7,20 @@ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] + + + + = 2.3> + Require all denied + + + Order allow,deny + Deny from all + + + + + Order allow,deny + Deny from all + + diff --git a/sources/ChangeLog b/sources/ChangeLog index ddfb2f7..6b9f551 100644 --- a/sources/ChangeLog +++ b/sources/ChangeLog @@ -1,3 +1,67 @@ +Version 1.0.19 +-------------- + +New features: + +* Added web notifications +* Added LDAP group sync +* Added swimlane description +* New plugin system (alpha) +* Added Bahasa Indonesia translation +* Added API procedures: getMyOverdueTasks, getOverdueTasksByProject and GetMyProjects +* Added user API access for procedure getProjectActivity() +* Added config parameter to enable/disable Syslog +* Added custom filters +* Added http client proxy support + +Core functionalities moved to plugins: + +* Budget planning: https://github.com/kanboard/plugin-budget +* SubtaskForecast: https://github.com/kanboard/plugin-subtask-forecast +* Timetable: https://github.com/kanboard/plugin-timetable + +Improvements: + +* When duplicating a task redirect to the new task +* Include more shortcut links into the view "My projects" +* Duplicate a project with tasks will copy the new tasks in the same columns +* Offer alternative method to create Mysql and Postgres databases (import sql dump) +* Make sure there is always a trailing slash for application_url +* Do not show the checkbox "Show default swimlane" when there is no active swimlanes +* Append filters instead of replacing value for users and categories dropdowns +* Do not show empty swimlanes in public view +* Change swimlane layout to save space on the screen +* Add the possibility to set/unset max column height (column scrolling) +* Show "Open this task" in dropdown menu for closed tasks +* Show assignee on card only when someone is assigned (hide nobody text) +* Highlight selected item in dropdown menus +* Gantt chart: change bar color according to task progress +* Replace color dropdown by color picker in task forms +* Creating another task stay in the popover (no full page refresh anymore) +* Avoid scrollbar in Gantt chart for row title on Windows platform +* Remove unnecessary margin for calendar header +* Show localized documentation if available +* Add event subtask.delete +* Add abstract storage layer +* Add abstract cache layer +* Add Docker tag for stable version + +Others: + +* Data directory permissions are not checked anymore +* Data directory is not mandatory anymore for people that use a remote database and remote object storage + +Bug fixes: + +* Fix typo in template that prevent the Gitlab OAuth link to be displayed +* Fix Markdown preview links focus +* Avoid dropdown menu to be truncated inside a column with scrolling +* Deleting subtask doesn't update task time tracking +* Fix Mysql error about gitlab_id when creating remote user +* Fix subtask timer bug (event called recursively) +* Fix Postgres issue "Cardinality violation" when there is multiple "is_milestone_of" links +* Fix issue with due date greater than year 2038 + Version 1.0.18 -------------- diff --git a/sources/app/.htaccess b/sources/app/.htaccess index 14249c5..c47998c 100644 --- a/sources/app/.htaccess +++ b/sources/app/.htaccess @@ -1 +1,7 @@ -Deny from all \ No newline at end of file += 2.3> + Require all denied + + + Order allow,deny + Deny from all + diff --git a/sources/app/Action/Base.php b/sources/app/Action/Base.php index d0c81d8..c8ff02a 100644 --- a/sources/app/Action/Base.php +++ b/sources/app/Action/Base.php @@ -126,6 +126,17 @@ abstract class Base extends \Core\Base return get_called_class(); } + /** + * Get project id + * + * @access public + * @return integer + */ + public function getProjectId() + { + return $this->project_id; + } + /** * Set an user defined parameter * diff --git a/sources/app/Action/TaskDuplicateAnotherProject.php b/sources/app/Action/TaskDuplicateAnotherProject.php index 55ebc76..7b7c6bf 100644 --- a/sources/app/Action/TaskDuplicateAnotherProject.php +++ b/sources/app/Action/TaskDuplicateAnotherProject.php @@ -64,7 +64,9 @@ class TaskDuplicateAnotherProject extends Base */ public function doAction(array $data) { - return (bool) $this->taskDuplication->duplicateToProject($data['task_id'], $this->getParam('project_id')); + $destination_column_id = $this->board->getFirstColumn($this->getParam('project_id')); + + return (bool) $this->taskDuplication->duplicateToProject($data['task_id'], $this->getParam('project_id'), null, $destination_column_id); } /** diff --git a/sources/app/Api/Base.php b/sources/app/Api/Base.php index 17c7f79..0287e0e 100644 --- a/sources/app/Api/Base.php +++ b/sources/app/Api/Base.php @@ -19,6 +19,8 @@ abstract class Base extends \Core\Base 'getMyActivityStream', 'createMyPrivateProject', 'getMyProjectsList', + 'getMyProjects', + 'getMyOverdueTasks', ); private $both_allowed_procedures = array( @@ -37,6 +39,8 @@ abstract class Base extends \Core\Base 'createTask', 'updateTask', 'getBoard', + 'getProjectActivity', + 'getOverdueTasksByProject', ); public function checkProcedurePermission($is_user, $procedure) @@ -50,6 +54,8 @@ abstract class Base extends \Core\Base else if (! $is_user && ! $is_both_procedure && $is_user_procedure) { throw new AccessDeniedException('Permission denied'); } + + $this->logger->debug('API call: '.$procedure); } public function checkProjectPermission($project_id) diff --git a/sources/app/Api/File.php b/sources/app/Api/File.php index 97aa9d8..ad736ad 100644 --- a/sources/app/Api/File.php +++ b/sources/app/Api/File.php @@ -2,6 +2,8 @@ namespace Api; +use Core\ObjectStorage\ObjectStorageException; + /** * File API controller * @@ -22,16 +24,17 @@ class File extends \Core\Base public function downloadFile($file_id) { - $file = $this->file->getById($file_id); + try { - if (! empty($file)) { + $file = $this->file->getById($file_id); - $filename = FILES_DIR.$file['path']; - - if (file_exists($filename)) { - return base64_encode(file_get_contents($filename)); + if (! empty($file)) { + return base64_encode($this->objectStorage->get($file['path'])); } } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); + } return ''; } diff --git a/sources/app/Api/Me.php b/sources/app/Api/Me.php index 29a8052..e761155 100644 --- a/sources/app/Api/Me.php +++ b/sources/app/Api/Me.php @@ -33,7 +33,8 @@ class Me extends Base public function getMyActivityStream() { - return $this->projectActivity->getProjects($this->projectPermission->getActiveMemberProjectIds($this->userSession->getId()), 100); + $project_ids = $this->projectPermission->getActiveMemberProjectIds($this->userSession->getId()); + return $this->projectActivity->getProjects($project_ids, 100); } public function createMyPrivateProject($name, $description = null) @@ -52,4 +53,17 @@ class Me extends Base { return $this->projectPermission->getMemberProjects($this->userSession->getId()); } + + public function getMyOverdueTasks() + { + return $this->taskFinder->getOverdueTasksByUser($this->userSession->getId()); + } + + public function getMyProjects() + { + $project_ids = $this->projectPermission->getActiveMemberProjectIds($this->userSession->getId()); + $projects = $this->project->getAllByIds($project_ids); + + return $this->formatProjects($projects); + } } diff --git a/sources/app/Api/Project.php b/sources/app/Api/Project.php index c3ae503..8ed382c 100644 --- a/sources/app/Api/Project.php +++ b/sources/app/Api/Project.php @@ -58,6 +58,7 @@ class Project extends Base public function getProjectActivity($project_id) { + $this->checkProjectPermission($project_id); return $this->projectActivity->getProject($project_id); } diff --git a/sources/app/Api/Swimlane.php b/sources/app/Api/Swimlane.php index fb40841..13838d7 100644 --- a/sources/app/Api/Swimlane.php +++ b/sources/app/Api/Swimlane.php @@ -40,14 +40,18 @@ class Swimlane extends \Core\Base return $this->swimlane->getDefault($project_id); } - public function addSwimlane($project_id, $name) + public function addSwimlane($project_id, $name, $description = '') { - return $this->swimlane->create($project_id, $name); + return $this->swimlane->create(array('project_id' => $project_id, 'name' => $name, 'description' => $description)); } - public function updateSwimlane($swimlane_id, $name) + public function updateSwimlane($swimlane_id, $name, $description = null) { - return $this->swimlane->rename($swimlane_id, $name); + $values = array('id' => $swimlane_id, 'name' => $name); + if (!is_null($description)) { + $values['description'] = $description; + } + return $this->swimlane->update($values); } public function removeSwimlane($project_id, $swimlane_id) diff --git a/sources/app/Api/Task.php b/sources/app/Api/Task.php index 946a9e8..23a8c5b 100644 --- a/sources/app/Api/Task.php +++ b/sources/app/Api/Task.php @@ -34,6 +34,12 @@ class Task extends Base { return $this->taskFinder->getOverdueTasks(); } + + public function getOverdueTasksByProject($project_id) + { + $this->checkProjectPermission($project_id); + return $this->taskFinder->getOverdueTasksByProject($project_id); + } public function openTask($task_id) { diff --git a/sources/app/Auth/Ldap.php b/sources/app/Auth/Ldap.php index c1459b4..3a48c40 100644 --- a/sources/app/Auth/Ldap.php +++ b/sources/app/Auth/Ldap.php @@ -19,6 +19,190 @@ class Ldap extends Base */ const AUTH_NAME = 'LDAP'; + /** + * Get LDAP server name + * + * @access public + * @return string + */ + public function getLdapServer() + { + return LDAP_SERVER; + } + + /** + * Get LDAP bind type + * + * @access public + * @return integer + */ + public function getLdapBindType() + { + return LDAP_BIND_TYPE; + } + + /** + * Get LDAP server port + * + * @access public + * @return integer + */ + public function getLdapPort() + { + return LDAP_PORT; + } + + /** + * Get LDAP username (proxy auth) + * + * @access public + * @return string + */ + public function getLdapUsername() + { + return LDAP_USERNAME; + } + + /** + * Get LDAP password (proxy auth) + * + * @access public + * @return string + */ + public function getLdapPassword() + { + return LDAP_PASSWORD; + } + + /** + * Get LDAP Base DN + * + * @access public + * @return string + */ + public function getLdapBaseDn() + { + return LDAP_ACCOUNT_BASE; + } + + /** + * Get LDAP account id attribute + * + * @access public + * @return string + */ + public function getLdapAccountId() + { + return LDAP_ACCOUNT_ID; + } + + /** + * Get LDAP account email attribute + * + * @access public + * @return string + */ + public function getLdapAccountEmail() + { + return LDAP_ACCOUNT_EMAIL; + } + + /** + * Get LDAP account name attribute + * + * @access public + * @return string + */ + public function getLdapAccountName() + { + return LDAP_ACCOUNT_FULLNAME; + } + + /** + * Get LDAP account memberof attribute + * + * @access public + * @return string + */ + public function getLdapAccountMemberOf() + { + return LDAP_ACCOUNT_MEMBEROF; + } + + /** + * Get LDAP admin group DN + * + * @access public + * @return string + */ + public function getLdapGroupAdmin() + { + return LDAP_GROUP_ADMIN_DN; + } + + /** + * Get LDAP project admin group DN + * + * @access public + * @return string + */ + public function getLdapGroupProjectAdmin() + { + return LDAP_GROUP_PROJECT_ADMIN_DN; + } + + /** + * Get LDAP username pattern + * + * @access public + * @param string $username + * @return string + */ + public function getLdapUserPattern($username) + { + return sprintf(LDAP_USER_PATTERN, $username); + } + + /** + * Return true if the LDAP username is case sensitive + * + * @access public + * @return boolean + */ + public function isLdapAccountCaseSensitive() + { + return LDAP_USERNAME_CASE_SENSITIVE; + } + + /** + * Return true if the automatic account creation is enabled + * + * @access public + * @return boolean + */ + public function isLdapAccountCreationEnabled() + { + return LDAP_ACCOUNT_CREATION; + } + + /** + * Ge the list of attributes to fetch when reading the LDAP user entry + * + * Must returns array with index that start at 0 otherwise ldap_search returns a warning "Array initialization wrong" + * + * @access public + * @return array + */ + public function getProfileAttributes() + { + return array_values(array_filter(array( + $this->getLdapAccountId(), + $this->getLdapAccountName(), + $this->getLdapAccountEmail(), + $this->getLdapAccountMemberOf() + ))); + } + /** * Authenticate the user * @@ -29,7 +213,7 @@ class Ldap extends Base */ public function authenticate($username, $password) { - $username = LDAP_USERNAME_CASE_SENSITIVE ? $username : strtolower($username); + $username = $this->isLdapAccountCaseSensitive() ? $username : strtolower($username); $result = $this->findUser($username, $password); if (is_array($result)) { @@ -46,7 +230,7 @@ class Ldap extends Base else { // We create automatically a new user - if (LDAP_ACCOUNT_CREATION && $this->createUser($username, $result['name'], $result['email'])) { + if ($this->isLdapAccountCreationEnabled() && $this->user->create($result) !== false) { $user = $this->user->getByUsername($username); } else { @@ -64,28 +248,6 @@ class Ldap extends Base return false; } - /** - * Create a new local user after the LDAP authentication - * - * @access public - * @param string $username Username - * @param string $name Name of the user - * @param string $email Email address - * @return bool - */ - public function createUser($username, $name, $email) - { - $values = array( - 'username' => $username, - 'name' => $name, - 'email' => $email, - 'is_admin' => 0, - 'is_ldap_user' => 1, - ); - - return $this->user->create($values); - } - /** * Find the user from the LDAP server * @@ -98,8 +260,8 @@ class Ldap extends Base { $ldap = $this->connect(); - if (is_resource($ldap) && $this->bind($ldap, $username, $password)) { - return $this->search($ldap, $username, $password); + if ($ldap !== false && $this->bind($ldap, $username, $password)) { + return $this->getProfile($ldap, $username, $password); } return false; @@ -108,13 +270,14 @@ class Ldap extends Base /** * LDAP connection * - * @access private - * @return resource $ldap LDAP connection + * @access public + * @return resource|boolean */ - private function connect() + public function connect() { if (! function_exists('ldap_connect')) { - die('The PHP LDAP extension is required'); + $this->logger->error('LDAP: The PHP LDAP extension is required'); + return false; } // Skip SSL certificate verification @@ -122,10 +285,11 @@ class Ldap extends Base putenv('LDAPTLS_REQCERT=never'); } - $ldap = ldap_connect(LDAP_SERVER, LDAP_PORT); + $ldap = ldap_connect($this->getLdapServer(), $this->getLdapPort()); - if (! is_resource($ldap)) { - die('Unable to connect to the LDAP server: "'.LDAP_SERVER.'"'); + if ($ldap === false) { + $this->logger->error('LDAP: Unable to connect to the LDAP server'); + return false; } ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); @@ -134,30 +298,31 @@ class Ldap extends Base ldap_set_option($ldap, LDAP_OPT_TIMELIMIT, 1); if (LDAP_START_TLS && ! @ldap_start_tls($ldap)) { - die('Unable to use ldap_start_tls()'); + $this->logger->error('LDAP: Unable to use ldap_start_tls()'); + return false; } return $ldap; } /** - * LDAP bind + * LDAP authentication * - * @access private - * @param resource $ldap LDAP connection - * @param string $username Username - * @param string $password Password + * @access public + * @param resource $ldap + * @param string $username + * @param string $password * @return boolean */ - private function bind($ldap, $username, $password) + public function bind($ldap, $username, $password) { - if (LDAP_BIND_TYPE === 'user') { - $ldap_username = sprintf(LDAP_USERNAME, $username); + if ($this->getLdapBindType() === 'user') { + $ldap_username = sprintf($this->getLdapUsername(), $username); $ldap_password = $password; } - else if (LDAP_BIND_TYPE === 'proxy') { - $ldap_username = LDAP_USERNAME; - $ldap_password = LDAP_PASSWORD; + else if ($this->getLdapBindType() === 'proxy') { + $ldap_username = $this->getLdapUsername(); + $ldap_password = $this->getLdapPassword(); } else { $ldap_username = null; @@ -165,6 +330,8 @@ class Ldap extends Base } if (! @ldap_bind($ldap, $ldap_username, $ldap_password)) { + $this->logger->error('LDAP: Unable to bind to server with: '.$ldap_username); + $this->logger->error('LDAP: bind type='.$this->getLdapBindType()); return false; } @@ -172,118 +339,189 @@ class Ldap extends Base } /** - * LDAP user lookup + * Get LDAP user profile * - * @access private - * @param resource $ldap LDAP connection - * @param string $username Username - * @param string $password Password + * @access public + * @param resource $ldap + * @param string $username + * @param string $password * @return boolean|array */ - private function search($ldap, $username, $password) + public function getProfile($ldap, $username, $password) { - $sr = @ldap_search($ldap, LDAP_ACCOUNT_BASE, sprintf(LDAP_USER_PATTERN, $username), array(LDAP_ACCOUNT_FULLNAME, LDAP_ACCOUNT_EMAIL)); + $user_pattern = $this->getLdapUserPattern($username); + $entries = $this->executeQuery($ldap, $user_pattern); - if ($sr === false) { + if ($entries === false) { + $this->logger->error('LDAP: Unable to get user profile: '.$user_pattern); return false; } - $info = ldap_get_entries($ldap, $sr); - - // User not found - if (count($info) == 0 || $info['count'] == 0) { - return false; + if (@ldap_bind($ldap, $entries[0]['dn'], $password)) { + return $this->prepareProfile($ldap, $entries, $username); } - // We got our user - if (@ldap_bind($ldap, $info[0]['dn'], $password)) { - - return array( - 'username' => $username, - 'name' => $this->getFromInfo($info, LDAP_ACCOUNT_FULLNAME), - 'email' => $this->getFromInfo($info, LDAP_ACCOUNT_EMAIL), - ); + if (DEBUG) { + $this->logger->debug('LDAP: wrong password for '.$entries[0]['dn']); } return false; } /** - * Retrieve info on LDAP user + * Build user profile from LDAP information * - * @param string $username Username - * @param string $email Email address + * @access public + * @param resource $ldap + * @param array $entries + * @param string $username + * @return boolean|array */ - public function lookup($username = null, $email = null) + public function prepareProfile($ldap, array $entries, $username) { - $query = $this->getQuery($username, $email); - if ($query === false) { + if ($this->getLdapAccountId() !== '') { + $username = $this->getEntry($entries, $this->getLdapAccountId(), $username); + } + + return array( + 'username' => $username, + 'name' => $this->getEntry($entries, $this->getLdapAccountName()), + 'email' => $this->getEntry($entries, $this->getLdapAccountEmail()), + 'is_admin' => (int) $this->isMemberOf($this->getEntries($entries, $this->getLdapAccountMemberOf()), $this->getLdapGroupAdmin()), + 'is_project_admin' => (int) $this->isMemberOf($this->getEntries($entries, $this->getLdapAccountMemberOf()), $this->getLdapGroupProjectAdmin()), + 'is_ldap_user' => 1, + ); + } + + /** + * Check group membership + * + * @access public + * @param array $group_entries + * @param string $group_dn + * @return boolean + */ + public function isMemberOf(array $group_entries, $group_dn) + { + if (! isset($group_entries['count']) || empty($group_dn)) { return false; } - // Connect and attempt anonymous bind + for ($i = 0; $i < $group_entries['count']; $i++) { + if ($group_entries[$i] === $group_dn) { + return true; + } + } + + return false; + } + + /** + * Retrieve info on LDAP user by username or email + * + * @access public + * @param string $username + * @param string $email + * @return boolean|array + */ + public function lookup($username = null, $email = null) + { + $query = $this->getLookupQuery($username, $email); + if ($query === '') { + return false; + } + + // Connect and attempt anonymous or proxy binding $ldap = $this->connect(); - if (! is_resource($ldap) || ! $this->bind($ldap, null, null)) { + if ($ldap === false || ! $this->bind($ldap, null, null)) { return false; } // Try to find user - $sr = @ldap_search($ldap, LDAP_ACCOUNT_BASE, $query, array(LDAP_ACCOUNT_FULLNAME, LDAP_ACCOUNT_EMAIL, LDAP_ACCOUNT_ID)); - if ($sr === false) { - return false; - } - - $info = ldap_get_entries($ldap, $sr); - - // User not found - if (count($info) == 0 || $info['count'] == 0) { + $entries = $this->executeQuery($ldap, $query); + if ($entries === false) { return false; } // User id not retrieved: LDAP_ACCOUNT_ID not properly configured - if (empty($username) && ! isset($info[0][LDAP_ACCOUNT_ID][0])) { + if (empty($username) && ! isset($entries[0][$this->getLdapAccountId()][0])) { return false; } - return array( - 'username' => $this->getFromInfo($info, LDAP_ACCOUNT_ID, $username), - 'name' => $this->getFromInfo($info, LDAP_ACCOUNT_FULLNAME), - 'email' => $this->getFromInfo($info, LDAP_ACCOUNT_EMAIL, $email), - ); + return $this->prepareProfile($ldap, $entries, $username); + } + + /** + * Execute LDAP query + * + * @access private + * @param resource $ldap + * @param string $query + * @return boolean|array + */ + private function executeQuery($ldap, $query) + { + $sr = @ldap_search($ldap, $this->getLdapBaseDn(), $query, $this->getProfileAttributes()); + if ($sr === false) { + return false; + } + + $entries = ldap_get_entries($ldap, $sr); + if ($entries === false || count($entries) === 0 || $entries['count'] == 0) { + return false; + } + + return $entries; } /** * Get the LDAP query to find a user * - * @param string $username Username - * @param string $email Email address + * @access private + * @param string $username + * @param string $email + * @return string */ - private function getQuery($username, $email) + private function getLookupQuery($username, $email) { - if ($username && $email) { - return '(&('.sprintf(LDAP_USER_PATTERN, $username).')('.LDAP_ACCOUNT_EMAIL.'='.$email.'))'; + if (! empty($username) && ! empty($email)) { + return '(&('.$this->getLdapUserPattern($username).')('.$this->getLdapAccountEmail().'='.$email.'))'; } - else if ($username) { - return sprintf(LDAP_USER_PATTERN, $username); + else if (! empty($username)) { + return $this->getLdapUserPattern($username); } - else if ($email) { - return '('.LDAP_ACCOUNT_EMAIL.'='.$email.')'; - } - else { - return false; + else if (! empty($email)) { + return '('.$this->getLdapAccountEmail().'='.$email.')'; } + + return ''; } /** - * Return a value from the LDAP info + * Return one entry from a list of entries * - * @param array $info LDAP info - * @param string $key Key - * @param string $default Default value if key not set in entry + * @access private + * @param array $entries LDAP entries + * @param string $key Key + * @param string $default Default value if key not set in entry * @return string */ - private function getFromInfo($info, $key, $default = '') + private function getEntry(array $entries, $key, $default = '') { - return isset($info[0][$key][0]) ? $info[0][$key][0] : $default; + return isset($entries[0][$key][0]) ? $entries[0][$key][0] : $default; + } + + /** + * Return subset of entries + * + * @access private + * @param array $entries + * @param string $key + * @param array $default + * @return array + */ + private function getEntries(array $entries, $key, $default = array()) + { + return isset($entries[0][$key]) ? $entries[0][$key] : $default; } } diff --git a/sources/app/Auth/ReverseProxy.php b/sources/app/Auth/ReverseProxy.php index c8fd5ee..7818254 100644 --- a/sources/app/Auth/ReverseProxy.php +++ b/sources/app/Auth/ReverseProxy.php @@ -28,7 +28,6 @@ class ReverseProxy extends Base public function authenticate() { if (isset($_SERVER[REVERSE_PROXY_USER_HEADER])) { - $login = $_SERVER[REVERSE_PROXY_USER_HEADER]; $user = $this->user->getByUsername($login); diff --git a/sources/app/Console/TaskOverdueNotification.php b/sources/app/Console/TaskOverdueNotification.php index 3d254ae..2428ad3 100644 --- a/sources/app/Console/TaskOverdueNotification.php +++ b/sources/app/Console/TaskOverdueNotification.php @@ -19,7 +19,7 @@ class TaskOverdueNotification extends Base protected function execute(InputInterface $input, OutputInterface $output) { - $tasks = $this->notification->sendOverdueTaskNotifications(); + $tasks = $this->overdueNotification->sendOverdueTaskNotifications(); if ($input->getOption('show')) { $this->showTable($output, $tasks); diff --git a/sources/app/Controller/App.php b/sources/app/Controller/App.php index fe1e648..8a1a6e2 100644 --- a/sources/app/Controller/App.php +++ b/sources/app/Controller/App.php @@ -3,7 +3,6 @@ namespace Controller; use Model\Subtask as SubtaskModel; -use Model\Task as TaskModel; /** * Application controller @@ -188,6 +187,22 @@ class App extends Base ))); } + /** + * My notifications + * + * @access public + */ + public function notifications() + { + $user = $this->getUser(); + + $this->response->html($this->layout('app/notifications', array( + 'title' => t('My notifications'), + 'notifications' => $this->webNotification->getAll($user['id']), + 'user' => $user, + ))); + } + /** * Render Markdown text and reply with the HTML Code * @@ -213,7 +228,7 @@ class App extends Base { $search = $this->request->getStringParam('term'); - $filter = $this->taskFilter + $filter = $this->taskFilterAutoCompleteFormatter ->create() ->filterByProjects($this->projectPermission->getActiveMemberProjectIds($this->userSession->getId())) ->excludeTasks(array($this->request->getIntegerParam('exclude_task_id'))); @@ -226,6 +241,6 @@ class App extends Base $filter->filterByTitle($search); } - $this->response->json($filter->toAutoCompletion()); + $this->response->json($filter->format()); } } diff --git a/sources/app/Controller/Base.php b/sources/app/Controller/Base.php index 480976b..e0fd59c 100644 --- a/sources/app/Controller/Base.php +++ b/sources/app/Controller/Base.php @@ -80,7 +80,7 @@ abstract class Base extends \Core\Base private function sendHeaders($action) { // HTTP secure headers - $this->response->csp(array('style-src' => "'self' 'unsafe-inline'", 'img-src' => '* data:')); + $this->response->csp($this->container['cspRules']); $this->response->nosniff(); $this->response->xss(); diff --git a/sources/app/Controller/Board.php b/sources/app/Controller/Board.php index 179c6b3..840db05 100644 --- a/sources/app/Controller/Board.php +++ b/sources/app/Controller/Board.php @@ -27,7 +27,7 @@ class Board extends Base } // Display the board with a specific layout - $this->response->html($this->template->layout('board/public_view', array( + $this->response->html($this->template->layout('board/view_public', array( 'project' => $project, 'swimlanes' => $this->board->getBoard($project['id']), 'title' => $project['name'], @@ -49,9 +49,10 @@ class Board extends Base { $params = $this->getProjectFilters('board', 'show'); - $this->response->html($this->template->layout('board/private_view', array( + $this->response->html($this->template->layout('board/view_private', array( 'categories_list' => $this->category->getList($params['project']['id'], false), 'users_list' => $this->projectPermission->getMemberList($params['project']['id'], false), + 'custom_filters_list' => $this->customFilter->getAll($params['project']['id'], $this->userSession->getId()), 'swimlanes' => $this->taskFilter->search($params['filters']['search'])->getBoard($params['project']['id']), 'description' => $params['project']['description'], 'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'), @@ -136,7 +137,7 @@ class Board extends Base } $values = $this->request->getJson(); - $this->userSession->setFilters($project_id, $values['search']); + $this->userSession->setFilters($project_id, empty($values['search']) ? '' : $values['search']); $this->response->html($this->renderBoard($project_id)); } @@ -320,6 +321,18 @@ class Board extends Base ))); } + /** + * Display swimlane description in tooltip + * + * @access public + */ + public function swimlane() + { + $this->getProject(); + $swimlane = $this->swimlane->getById($this->request->getIntegerParam('swimlane_id')); + $this->response->html($this->template->render('board/tooltip_description', array('task' => $swimlane))); + } + /** * Enable collapsed mode * diff --git a/sources/app/Controller/Budget.php b/sources/app/Controller/Budget.php deleted file mode 100644 index a2f7e0d..0000000 --- a/sources/app/Controller/Budget.php +++ /dev/null @@ -1,135 +0,0 @@ -getProject(); - - $this->response->html($this->projectLayout('budget/index', array( - 'daily_budget' => $this->budget->getDailyBudgetBreakdown($project['id']), - 'project' => $project, - 'title' => t('Budget') - ), 'budget/sidebar')); - } - - /** - * Cost breakdown by users/subtasks/tasks - * - * @access public - */ - public function breakdown() - { - $project = $this->getProject(); - - $paginator = $this->paginator - ->setUrl('budget', 'breakdown', array('project_id' => $project['id'])) - ->setMax(30) - ->setOrder('start') - ->setDirection('DESC') - ->setQuery($this->budget->getSubtaskBreakdown($project['id'])) - ->calculate(); - - $this->response->html($this->projectLayout('budget/breakdown', array( - 'paginator' => $paginator, - 'project' => $project, - 'title' => t('Budget') - ), 'budget/sidebar')); - } - - /** - * Create budget lines - * - * @access public - */ - public function create(array $values = array(), array $errors = array()) - { - $project = $this->getProject(); - - if (empty($values)) { - $values['date'] = date('Y-m-d'); - } - - $this->response->html($this->projectLayout('budget/create', array( - 'lines' => $this->budget->getAll($project['id']), - 'values' => $values + array('project_id' => $project['id']), - 'errors' => $errors, - 'project' => $project, - 'title' => t('Budget lines') - ), 'budget/sidebar')); - } - - /** - * Validate and save a new budget - * - * @access public - */ - public function save() - { - $project = $this->getProject(); - - $values = $this->request->getValues(); - list($valid, $errors) = $this->budget->validateCreation($values); - - if ($valid) { - - if ($this->budget->create($values['project_id'], $values['amount'], $values['comment'], $values['date'])) { - $this->session->flash(t('The budget line have been created successfully.')); - $this->response->redirect($this->helper->url->to('budget', 'create', array('project_id' => $project['id']))); - } - else { - $this->session->flashError(t('Unable to create the budget line.')); - } - } - - $this->create($values, $errors); - } - - /** - * Confirmation dialog before removing a budget - * - * @access public - */ - public function confirm() - { - $project = $this->getProject(); - - $this->response->html($this->projectLayout('budget/remove', array( - 'project' => $project, - 'budget_id' => $this->request->getIntegerParam('budget_id'), - 'title' => t('Remove a budget line'), - ), 'budget/sidebar')); - } - - /** - * Remove a budget - * - * @access public - */ - public function remove() - { - $this->checkCSRFParam(); - $project = $this->getProject(); - - if ($this->budget->remove($this->request->getIntegerParam('budget_id'))) { - $this->session->flash(t('Budget line removed successfully.')); - } else { - $this->session->flashError(t('Unable to remove this budget line.')); - } - - $this->response->redirect($this->helper->url->to('budget', 'create', array('project_id' => $project['id']))); - } -} diff --git a/sources/app/Controller/Calendar.php b/sources/app/Controller/Calendar.php index 8a24d70..7050e54 100644 --- a/sources/app/Controller/Calendar.php +++ b/sources/app/Controller/Calendar.php @@ -37,20 +37,26 @@ class Calendar extends Base $end = $this->request->getStringParam('end'); // Common filter - $filter = $this->taskFilter + $filter = $this->taskFilterCalendarFormatter ->search($this->userSession->getFilters($project_id)) ->filterByProject($project_id); // Tasks if ($this->config->get('calendar_project_tasks', 'date_started') === 'date_creation') { - $events = $filter->copy()->filterByCreationDateRange($start, $end)->toDateTimeCalendarEvents('date_creation', 'date_completed'); + $events = $filter->copy()->filterByCreationDateRange($start, $end)->setColumns('date_creation', 'date_completed')->format(); } else { - $events = $filter->copy()->filterByStartDateRange($start, $end)->toDateTimeCalendarEvents('date_started', 'date_completed'); + $events = $filter->copy()->filterByStartDateRange($start, $end)->setColumns('date_started', 'date_completed')->format(); } // Tasks with due date - $events = array_merge($events, $filter->copy()->filterByDueDateRange($start, $end)->toAllDayCalendarEvents()); + $events = array_merge($events, $filter->copy()->filterByDueDateRange($start, $end)->setColumns('date_due')->setFullDay()->format()); + + $events = $this->hook->merge('controller:calendar:project:events', $events, array( + 'project_id' => $project_id, + 'start' => $start, + 'end' => $end, + )); $this->response->json($events); } @@ -65,17 +71,17 @@ class Calendar extends Base $user_id = $this->request->getIntegerParam('user_id'); $start = $this->request->getStringParam('start'); $end = $this->request->getStringParam('end'); - $filter = $this->taskFilter->create()->filterByOwner($user_id)->filterByStatus(TaskModel::STATUS_OPEN); + $filter = $this->taskFilterCalendarFormatter->create()->filterByOwner($user_id)->filterByStatus(TaskModel::STATUS_OPEN); // Task with due date - $events = $filter->copy()->filterByDueDateRange($start, $end)->toAllDayCalendarEvents(); + $events = $filter->copy()->filterByDueDateRange($start, $end)->setColumns('date_due')->setFullDay()->format(); // Tasks if ($this->config->get('calendar_user_tasks', 'date_started') === 'date_creation') { - $events = array_merge($events, $filter->copy()->filterByCreationDateRange($start, $end)->toDateTimeCalendarEvents('date_creation', 'date_completed')); + $events = array_merge($events, $filter->copy()->filterByCreationDateRange($start, $end)->setColumns('date_creation', 'date_completed')->format()); } else { - $events = array_merge($events, $filter->copy()->filterByStartDateRange($start, $end)->toDateTimeCalendarEvents('date_started', 'date_completed')); + $events = array_merge($events, $filter->copy()->filterByStartDateRange($start, $end)->setColumns('date_started', 'date_completed')->format()); } // Subtasks time tracking @@ -83,10 +89,11 @@ class Calendar extends Base $events = array_merge($events, $this->subtaskTimeTracking->getUserCalendarEvents($user_id, $start, $end)); } - // Subtask estimates - if ($this->config->get('calendar_user_subtasks_forecast') == 1) { - $events = array_merge($events, $this->subtaskForecast->getCalendarEvents($user_id, $end)); - } + $events = $this->hook->merge('controller:calendar:user:events', $events, array( + 'user_id' => $user_id, + 'start' => $start, + 'end' => $end, + )); $this->response->json($events); } diff --git a/sources/app/Controller/Config.php b/sources/app/Controller/Config.php index 6f14cc3..1ae390c 100644 --- a/sources/app/Controller/Config.php +++ b/sources/app/Controller/Config.php @@ -48,7 +48,7 @@ class Config extends Base $values += array('integration_slack_webhook' => 0, 'integration_hipchat' => 0, 'integration_gravatar' => 0, 'integration_jabber' => 0); break; case 'calendar': - $values += array('calendar_user_subtasks_forecast' => 0, 'calendar_user_subtasks_time_tracking' => 0); + $values += array('calendar_user_subtasks_time_tracking' => 0); break; } @@ -77,6 +77,19 @@ class Config extends Base ))); } + /** + * Display the plugin page + * + * @access public + */ + public function plugins() + { + $this->response->html($this->layout('config/plugins', array( + 'plugins' => $this->pluginLoader->plugins, + 'title' => t('Settings').' > '.t('Plugins'), + ))); + } + /** * Display the application settings page * diff --git a/sources/app/Controller/Customfilter.php b/sources/app/Controller/Customfilter.php new file mode 100644 index 0000000..c403cb4 --- /dev/null +++ b/sources/app/Controller/Customfilter.php @@ -0,0 +1,142 @@ +getProject(); + + $this->response->html($this->projectLayout('custom_filter/index', array( + 'values' => $values + array('project_id' => $project['id']), + 'errors' => $errors, + 'project' => $project, + 'custom_filters' => $this->customFilter->getAll($project['id'], $this->userSession->getId()), + 'title' => t('Custom filters'), + ))); + } + + /** + * Save a new custom filter + * + * @access public + */ + public function save() + { + $project = $this->getProject(); + + $values = $this->request->getValues(); + $values['user_id'] = $this->userSession->getId(); + + list($valid, $errors) = $this->customFilter->validateCreation($values); + + if ($valid) { + if ($this->customFilter->create($values)) { + $this->session->flash(t('Your custom filter have been created successfully.')); + $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); + } + else { + $this->session->flashError(t('Unable to create your custom filter.')); + } + } + + $this->index($values, $errors); + } + + /** + * Remove a custom filter + * + * @access public + */ + public function remove() + { + $this->checkCSRFParam(); + $project = $this->getProject(); + $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); + + $this->checkPermission($project, $filter); + + if ($this->customFilter->remove($filter['id'])) { + $this->session->flash(t('Custom filter removed successfully.')); + } else { + $this->session->flashError(t('Unable to remove this custom filter.')); + } + + $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); + } + + /** + * Edit a custom filter (display the form) + * + * @access public + */ + public function edit(array $values = array(), array $errors = array()) + { + $project = $this->getProject(); + $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); + + $this->checkPermission($project, $filter); + + $this->response->html($this->projectLayout('custom_filter/edit', array( + 'values' => empty($values) ? $filter : $values, + 'errors' => $errors, + 'project' => $project, + 'filter' => $filter, + 'title' => t('Edit custom filter') + ))); + } + + /** + * Edit a custom filter (validate the form and update the database) + * + * @access public + */ + public function update() + { + $project = $this->getProject(); + $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); + + $this->checkPermission($project, $filter); + + $values = $this->request->getValues(); + + if (! isset($values['is_shared'])) { + $values += array('is_shared' => 0); + } + + list($valid, $errors) = $this->customFilter->validateModification($values); + + if ($valid) { + if ($this->customFilter->update($values)) { + $this->session->flash(t('Your custom filter have been updated successfully.')); + $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); + } + else { + $this->session->flashError(t('Unable to update custom filter.')); + } + } + + $this->edit($values, $errors); + } + + private function checkPermission(array $project, array $filter) + { + $user_id = $this->userSession->getId(); + + if ($filter['user_id'] != $user_id && (! $this->projectPermission->isManager($project['id'], $user_id) || ! $this->userSession->isAdmin())) { + $this->forbidden(); + } + } +} diff --git a/sources/app/Controller/Doc.php b/sources/app/Controller/Doc.php index 19644b8..f9f0a67 100644 --- a/sources/app/Controller/Doc.php +++ b/sources/app/Controller/Doc.php @@ -16,7 +16,7 @@ class Doc extends Base { $url = $this->helper->url; $data = file_get_contents($filename); - list($title,, $content) = explode("\n", $data, 3); + list($title,) = explode("\n", $data, 2); $replaceUrl = function (array $matches) use ($url) { return '('.$url->to('doc', 'show', array('file' => str_replace('.markdown', '', $matches[1]))).')'; @@ -32,16 +32,24 @@ class Doc extends Base public function show() { - $filename = $this->request->getStringParam('file', 'index'); + $page = $this->request->getStringParam('file', 'index'); - if (! preg_match('/^[a-z0-9\-]+/', $filename)) { - $filename = 'index'; + if (! preg_match('/^[a-z0-9\-]+/', $page)) { + $page = 'index'; } - $filename = __DIR__.'/../../doc/'.$filename.'.markdown'; + $filenames = array(__DIR__.'/../../doc/'.$page.'.markdown'); + $filename = __DIR__.'/../../doc/index.markdown'; - if (! file_exists($filename)) { - $filename = __DIR__.'/../../doc/index.markdown'; + if ($this->config->getCurrentLanguage() === 'fr_FR') { + array_unshift($filenames, __DIR__.'/../../doc/fr/'.$page.'.markdown'); + } + + foreach ($filenames as $file) { + if (file_exists($file)) { + $filename = $file; + break; + } } $this->response->html($this->template->layout('doc/show', $this->readFile($filename) + array( diff --git a/sources/app/Controller/File.php b/sources/app/Controller/File.php index f73a9de..ef90c55 100644 --- a/sources/app/Controller/File.php +++ b/sources/app/Controller/File.php @@ -2,6 +2,8 @@ namespace Controller; +use Core\ObjectStorage\ObjectStorageException; + /** * File controller * @@ -60,7 +62,7 @@ class File extends Base { $task = $this->getTask(); - if (! $this->file->upload($task['project_id'], $task['id'], 'files')) { + if (! $this->file->uploadFiles($task['project_id'], $task['id'], 'files')) { $this->session->flashError(t('Unable to upload the file.')); } @@ -74,16 +76,21 @@ class File extends Base */ public function download() { - $task = $this->getTask(); - $file = $this->file->getById($this->request->getIntegerParam('file_id')); - $filename = FILES_DIR.$file['path']; + try { + + $task = $this->getTask(); + $file = $this->file->getById($this->request->getIntegerParam('file_id')); + + if ($file['task_id'] != $task['id']) { + $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); + } - if ($file['task_id'] == $task['id'] && file_exists($filename)) { $this->response->forceDownload($file['name']); - $this->response->binary(file_get_contents($filename)); + $this->objectStorage->output($file['path']); + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); } - - $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); } /** @@ -111,17 +118,20 @@ class File extends Base */ public function image() { - $task = $this->getTask(); - $file = $this->file->getById($this->request->getIntegerParam('file_id')); - $filename = FILES_DIR.$file['path']; + try { - if ($file['task_id'] == $task['id'] && file_exists($filename)) { - $metadata = getimagesize($filename); + $task = $this->getTask(); + $file = $this->file->getById($this->request->getIntegerParam('file_id')); - if (isset($metadata['mime'])) { - $this->response->contentType($metadata['mime']); - readfile($filename); + if ($file['task_id'] != $task['id']) { + $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); } + + $this->response->contentType($this->file->getImageMimeType($file['name'])); + $this->objectStorage->output($file['path']); + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); } } @@ -132,18 +142,20 @@ class File extends Base */ public function thumbnail() { - $task = $this->getTask(); - $file = $this->file->getById($this->request->getIntegerParam('file_id')); - $filename = FILES_DIR.$file['path']; + try { - if ($file['task_id'] == $task['id'] && file_exists($filename)) { + $task = $this->getTask(); + $file = $this->file->getById($this->request->getIntegerParam('file_id')); + + if ($file['task_id'] != $task['id']) { + $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); + } $this->response->contentType('image/jpeg'); - $this->file->generateThumbnail( - $filename, - $this->request->getIntegerParam('width'), - $this->request->getIntegerParam('height') - ); + $this->objectStorage->output($this->file->getThumbnailPath($file['path'])); + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); } } diff --git a/sources/app/Controller/Gantt.php b/sources/app/Controller/Gantt.php index a2d3f36..879ab37 100644 --- a/sources/app/Controller/Gantt.php +++ b/sources/app/Controller/Gantt.php @@ -25,7 +25,7 @@ class Gantt extends Base } $this->response->html($this->template->layout('gantt/projects', array( - 'projects' => $this->project->getGanttBars($project_ids), + 'projects' => $this->projectGanttFormatter->filter($project_ids)->format(), 'title' => t('Gantt chart for all projects'), 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()), ))); @@ -57,7 +57,7 @@ class Gantt extends Base public function project() { $params = $this->getProjectFilters('gantt', 'project'); - $filter = $this->taskFilter->search($params['filters']['search'])->filterByProject($params['project']['id']); + $filter = $this->taskFilterGanttFormatter->search($params['filters']['search'])->filterByProject($params['project']['id']); $sorting = $this->request->getStringParam('sorting', 'board'); if ($sorting === 'date') { @@ -70,7 +70,7 @@ class Gantt extends Base $this->response->html($this->template->layout('gantt/project', $params + array( 'users_list' => $this->projectPermission->getMemberList($params['project']['id'], false), 'sorting' => $sorting, - 'tasks' => $filter->toGanttBars(), + 'tasks' => $filter->format(), ))); } diff --git a/sources/app/Controller/Hourlyrate.php b/sources/app/Controller/Hourlyrate.php deleted file mode 100644 index 19650ed..0000000 --- a/sources/app/Controller/Hourlyrate.php +++ /dev/null @@ -1,89 +0,0 @@ -getUser(); - - $this->response->html($this->layout('hourlyrate/index', array( - 'rates' => $this->hourlyRate->getAllByUser($user['id']), - 'currencies_list' => $this->config->getCurrencies(), - 'values' => $values + array('user_id' => $user['id']), - 'errors' => $errors, - 'user' => $user, - ))); - } - - /** - * Validate and save a new rate - * - * @access public - */ - public function save() - { - $values = $this->request->getValues(); - list($valid, $errors) = $this->hourlyRate->validateCreation($values); - - if ($valid) { - - if ($this->hourlyRate->create($values['user_id'], $values['rate'], $values['currency'], $values['date_effective'])) { - $this->session->flash(t('Hourly rate created successfully.')); - $this->response->redirect($this->helper->url->to('hourlyrate', 'index', array('user_id' => $values['user_id']))); - } - else { - $this->session->flashError(t('Unable to save the hourly rate.')); - } - } - - $this->index($values, $errors); - } - - /** - * Confirmation dialag box to remove a row - * - * @access public - */ - public function confirm() - { - $user = $this->getUser(); - - $this->response->html($this->layout('hourlyrate/remove', array( - 'rate_id' => $this->request->getIntegerParam('rate_id'), - 'user' => $user, - ))); - } - - /** - * Remove a row - * - * @access public - */ - public function remove() - { - $this->checkCSRFParam(); - $user = $this->getUser(); - - if ($this->hourlyRate->remove($this->request->getIntegerParam('rate_id'))) { - $this->session->flash(t('Rate removed successfully.')); - } - else { - $this->session->flash(t('Unable to remove this rate.')); - } - - $this->response->redirect($this->helper->url->to('hourlyrate', 'index', array('user_id' => $user['id']))); - } -} diff --git a/sources/app/Controller/Ical.php b/sources/app/Controller/Ical.php index 0129915..e89b7e3 100644 --- a/sources/app/Controller/Ical.php +++ b/sources/app/Controller/Ical.php @@ -29,7 +29,7 @@ class Ical extends Base } // Common filter - $filter = $this->taskFilter + $filter = $this->taskFilterICalendarFormatter ->create() ->filterByOwner($user['id']); @@ -58,7 +58,7 @@ class Ical extends Base } // Common filter - $filter = $this->taskFilter + $filter = $this->taskFilterICalendarFormatter ->create() ->filterByProject($project['id']); @@ -83,16 +83,31 @@ class Ical extends Base // Tasks if ($this->config->get('calendar_project_tasks', 'date_started') === 'date_creation') { - $filter->copy()->filterByCreationDateRange($start, $end)->addDateTimeIcalEvents('date_creation', 'date_completed', $calendar); + $filter + ->copy() + ->filterByCreationDateRange($start, $end) + ->setColumns('date_creation', 'date_completed') + ->setCalendar($calendar) + ->addDateTimeEvents(); } else { - $filter->copy()->filterByStartDateRange($start, $end)->addDateTimeIcalEvents('date_started', 'date_completed', $calendar); + $filter + ->copy() + ->filterByStartDateRange($start, $end) + ->setColumns('date_started', 'date_completed') + ->setCalendar($calendar) + ->addDateTimeEvents($calendar); } // Tasks with due date - $filter->copy()->filterByDueDateRange($start, $end)->addAllDayIcalEvents('date_due', $calendar); + $filter + ->copy() + ->filterByDueDateRange($start, $end) + ->setColumns('date_due') + ->setCalendar($calendar) + ->addFullDayEvents($calendar); $this->response->contentType('text/calendar; charset=utf-8'); - echo $calendar->render(); + echo $filter->setCalendar($calendar)->format(); } } diff --git a/sources/app/Controller/Swimlane.php b/sources/app/Controller/Swimlane.php index 054fa4b..f92e9fe 100644 --- a/sources/app/Controller/Swimlane.php +++ b/sources/app/Controller/Swimlane.php @@ -59,13 +59,12 @@ class Swimlane extends Base public function save() { $project = $this->getProject(); - $values = $this->request->getValues(); list($valid, $errors) = $this->swimlane->validateCreation($values); if ($valid) { - if ($this->swimlane->create($project['id'], $values['name'])) { + if ($this->swimlane->create($values)) { $this->session->flash(t('Your swimlane have been created successfully.')); $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id']))); } @@ -134,8 +133,7 @@ class Swimlane extends Base list($valid, $errors) = $this->swimlane->validateModification($values); if ($valid) { - - if ($this->swimlane->rename($values['id'], $values['name'])) { + if ($this->swimlane->update($values)) { $this->session->flash(t('Swimlane updated successfully.')); $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id']))); } diff --git a/sources/app/Controller/Taskcreation.php b/sources/app/Controller/Taskcreation.php index ff25c5d..b9e9a33 100644 --- a/sources/app/Controller/Taskcreation.php +++ b/sources/app/Controller/Taskcreation.php @@ -59,25 +59,29 @@ class Taskcreation extends Base list($valid, $errors) = $this->taskValidator->validateCreation($values); - if ($valid) { - - if ($this->taskCreation->create($values)) { - $this->session->flash(t('Task created successfully.')); - - if (isset($values['another_task']) && $values['another_task'] == 1) { - unset($values['title']); - unset($values['description']); - $this->response->redirect($this->helper->url->to('taskcreation', 'create', $values)); - } - else { - $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project['id']))); - } - } - else { - $this->session->flashError(t('Unable to create your task.')); - } + if ($valid && $this->taskCreation->create($values)) { + $this->session->flash(t('Task created successfully.')); + $this->afterSave($project, $values); + } + else { + $this->session->flashError(t('Unable to create your task.')); } $this->create($values, $errors); } + + private function afterSave(array $project, array &$values) + { + if (isset($values['another_task']) && $values['another_task'] == 1) { + unset($values['title']); + unset($values['description']); + + if (! $this->request->isAjax()) { + $this->response->redirect($this->helper->url->to('taskcreation', 'create', $values)); + } + } + else { + $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project['id']))); + } + } } diff --git a/sources/app/Controller/Taskduplication.php b/sources/app/Controller/Taskduplication.php index aebbcfc..8d329ca 100644 --- a/sources/app/Controller/Taskduplication.php +++ b/sources/app/Controller/Taskduplication.php @@ -26,7 +26,7 @@ class Taskduplication extends Base if ($task_id > 0) { $this->session->flash(t('Task created successfully.')); - $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); + $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task_id))); } else { $this->session->flashError(t('Unable to create this task.')); $this->response->redirect($this->helper->url->to('taskduplication', 'duplicate', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); @@ -83,15 +83,16 @@ class Taskduplication extends Base $values = $this->request->getValues(); list($valid,) = $this->taskValidator->validateProjectModification($values); - if ($valid && $this->taskDuplication->duplicateToProject($task['id'], - $values['project_id'], - $values['swimlane_id'], - $values['column_id'], - $values['category_id'], - $values['owner_id'])) { + if ($valid) { + $task_id = $this->taskDuplication->duplicateToProject( + $task['id'], $values['project_id'], $values['swimlane_id'], + $values['column_id'], $values['category_id'], $values['owner_id'] + ); - $this->session->flash(t('Task created successfully.')); - $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); + if ($task_id > 0) { + $this->session->flash(t('Task created successfully.')); + $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $values['project_id'], 'task_id' => $task_id))); + } } $this->session->flashError(t('Unable to create your task.')); diff --git a/sources/app/Controller/Taskmodification.php b/sources/app/Controller/Taskmodification.php index 56d2b9f..638af59 100644 --- a/sources/app/Controller/Taskmodification.php +++ b/sources/app/Controller/Taskmodification.php @@ -126,11 +126,13 @@ class Taskmodification extends Base ); if ($ajax) { - $this->response->html($this->template->render('task_modification/edit_task', $params)); + $html = $this->template->render('task_modification/edit_task', $params); } else { - $this->response->html($this->taskLayout('task_modification/edit_task', $params)); + $html = $this->taskLayout('task_modification/edit_task', $params); } + + $this->response->html($html); } /** @@ -145,24 +147,20 @@ class Taskmodification extends Base list($valid, $errors) = $this->taskValidator->validateModification($values); - if ($valid) { + if ($valid && $this->taskModification->update($values)) { + $this->session->flash(t('Task updated successfully.')); - if ($this->taskModification->update($values)) { - $this->session->flash(t('Task updated successfully.')); - - if ($this->request->getIntegerParam('ajax')) { - $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $task['project_id']))); - } - else { - $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); - } + if ($this->request->isAjax()) { + $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $task['project_id']))); } else { - $this->session->flashError(t('Unable to update your task.')); + $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); } } - - $this->edit($values, $errors); + else { + $this->session->flashError(t('Unable to update your task.')); + $this->edit($values, $errors); + } } /** diff --git a/sources/app/Controller/Taskstatus.php b/sources/app/Controller/Taskstatus.php index a47d9da..1768b77 100644 --- a/sources/app/Controller/Taskstatus.php +++ b/sources/app/Controller/Taskstatus.php @@ -18,36 +18,8 @@ class Taskstatus extends Base public function close() { $task = $this->getTask(); - $redirect = $this->request->getStringParam('redirect'); - - if ($this->request->getStringParam('confirmation') === 'yes') { - - $this->checkCSRFParam(); - - if ($this->taskStatus->close($task['id'])) { - $this->session->flash(t('Task closed successfully.')); - } else { - $this->session->flashError(t('Unable to close this task.')); - } - - if ($redirect === 'board') { - $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $task['project_id']))); - } - - $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); - } - - if ($this->request->isAjax()) { - $this->response->html($this->template->render('task_status/close', array( - 'task' => $task, - 'redirect' => $redirect, - ))); - } - - $this->response->html($this->taskLayout('task_status/close', array( - 'task' => $task, - 'redirect' => $redirect, - ))); + $this->changeStatus($task, 'close', t('Task closed successfully.'), t('Unable to close this task.')); + $this->renderTemplate($task, 'task_status/close'); } /** @@ -58,22 +30,44 @@ class Taskstatus extends Base public function open() { $task = $this->getTask(); + $this->changeStatus($task, 'open', t('Task opened successfully.'), t('Unable to open this task.')); + $this->renderTemplate($task, 'task_status/open'); + } + private function changeStatus(array $task, $method, $success_message, $failure_message) + { if ($this->request->getStringParam('confirmation') === 'yes') { $this->checkCSRFParam(); - if ($this->taskStatus->open($task['id'])) { - $this->session->flash(t('Task opened successfully.')); + if ($this->taskStatus->$method($task['id'])) { + $this->session->flash($success_message); } else { - $this->session->flashError(t('Unable to open this task.')); + $this->session->flashError($failure_message); } - $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); + if ($this->request->getStringParam('redirect') === 'board') { + $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $task['project_id']))); + } + + $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); + } + } + + private function renderTemplate(array $task, $template) + { + $redirect = $this->request->getStringParam('redirect'); + + if ($this->request->isAjax()) { + $this->response->html($this->template->render($template, array( + 'task' => $task, + 'redirect' => $redirect, + ))); } - $this->response->html($this->taskLayout('task_status/open', array( + $this->response->html($this->taskLayout($template, array( 'task' => $task, + 'redirect' => $redirect, ))); } } diff --git a/sources/app/Controller/Timetable.php b/sources/app/Controller/Timetable.php deleted file mode 100644 index 65edb44..0000000 --- a/sources/app/Controller/Timetable.php +++ /dev/null @@ -1,39 +0,0 @@ -getUser(); - $from = $this->request->getStringParam('from', date('Y-m-d')); - $to = $this->request->getStringParam('to', date('Y-m-d', strtotime('next week'))); - $timetable = $this->timetable->calculate($user['id'], new DateTime($from), new DateTime($to)); - - $this->response->html($this->layout('timetable/index', array( - 'user' => $user, - 'timetable' => $timetable, - 'values' => array( - 'from' => $from, - 'to' => $to, - 'controller' => 'timetable', - 'action' => 'index', - 'user_id' => $user['id'], - ), - ))); - } -} diff --git a/sources/app/Controller/Timetableday.php b/sources/app/Controller/Timetableday.php deleted file mode 100644 index c8f7ac8..0000000 --- a/sources/app/Controller/Timetableday.php +++ /dev/null @@ -1,88 +0,0 @@ -getUser(); - - $this->response->html($this->layout('timetable_day/index', array( - 'timetable' => $this->timetableDay->getByUser($user['id']), - 'values' => $values + array('user_id' => $user['id']), - 'errors' => $errors, - 'user' => $user, - ))); - } - - /** - * Validate and save - * - * @access public - */ - public function save() - { - $values = $this->request->getValues(); - list($valid, $errors) = $this->timetableDay->validateCreation($values); - - if ($valid) { - - if ($this->timetableDay->create($values['user_id'], $values['start'], $values['end'])) { - $this->session->flash(t('Time slot created successfully.')); - $this->response->redirect($this->helper->url->to('timetableday', 'index', array('user_id' => $values['user_id']))); - } - else { - $this->session->flashError(t('Unable to save this time slot.')); - } - } - - $this->index($values, $errors); - } - - /** - * Confirmation dialag box to remove a row - * - * @access public - */ - public function confirm() - { - $user = $this->getUser(); - - $this->response->html($this->layout('timetable_day/remove', array( - 'slot_id' => $this->request->getIntegerParam('slot_id'), - 'user' => $user, - ))); - } - - /** - * Remove a row - * - * @access public - */ - public function remove() - { - $this->checkCSRFParam(); - $user = $this->getUser(); - - if ($this->timetableDay->remove($this->request->getIntegerParam('slot_id'))) { - $this->session->flash(t('Time slot removed successfully.')); - } - else { - $this->session->flash(t('Unable to remove this time slot.')); - } - - $this->response->redirect($this->helper->url->to('timetableday', 'index', array('user_id' => $user['id']))); - } -} diff --git a/sources/app/Controller/Timetableextra.php b/sources/app/Controller/Timetableextra.php deleted file mode 100644 index 7c6fe26..0000000 --- a/sources/app/Controller/Timetableextra.php +++ /dev/null @@ -1,16 +0,0 @@ -getUser(); - - $paginator = $this->paginator - ->setUrl($this->controller_url, 'index', array('user_id' => $user['id'])) - ->setMax(10) - ->setOrder('date') - ->setDirection('desc') - ->setQuery($this->{$this->model}->getUserQuery($user['id'])) - ->calculate(); - - $this->response->html($this->layout($this->template_dir.'/index', array( - 'values' => $values + array('user_id' => $user['id']), - 'errors' => $errors, - 'paginator' => $paginator, - 'user' => $user, - ))); - } - - /** - * Validate and save - * - * @access public - */ - public function save() - { - $values = $this->request->getValues(); - list($valid, $errors) = $this->{$this->model}->validateCreation($values); - - if ($valid) { - - if ($this->{$this->model}->create( - $values['user_id'], - $values['date'], - isset($values['all_day']) && $values['all_day'] == 1, - $values['start'], - $values['end'], - $values['comment'])) { - - $this->session->flash(t('Time slot created successfully.')); - $this->response->redirect($this->helper->url->to($this->controller_url, 'index', array('user_id' => $values['user_id']))); - } - else { - $this->session->flashError(t('Unable to save this time slot.')); - } - } - - $this->index($values, $errors); - } - - /** - * Confirmation dialag box to remove a row - * - * @access public - */ - public function confirm() - { - $user = $this->getUser(); - - $this->response->html($this->layout($this->template_dir.'/remove', array( - 'slot_id' => $this->request->getIntegerParam('slot_id'), - 'user' => $user, - ))); - } - - /** - * Remove a row - * - * @access public - */ - public function remove() - { - $this->checkCSRFParam(); - $user = $this->getUser(); - - if ($this->{$this->model}->remove($this->request->getIntegerParam('slot_id'))) { - $this->session->flash(t('Time slot removed successfully.')); - } - else { - $this->session->flash(t('Unable to remove this time slot.')); - } - - $this->response->redirect($this->helper->url->to($this->controller_url, 'index', array('user_id' => $user['id']))); - } -} diff --git a/sources/app/Controller/Timetableweek.php b/sources/app/Controller/Timetableweek.php deleted file mode 100644 index b8ce00e..0000000 --- a/sources/app/Controller/Timetableweek.php +++ /dev/null @@ -1,99 +0,0 @@ -getUser(); - - if (empty($values)) { - - $day = $this->timetableDay->getByUser($user['id']); - - $values = array( - 'user_id' => $user['id'], - 'start' => isset($day[0]['start']) ? $day[0]['start'] : null, - 'end' => isset($day[0]['end']) ? $day[0]['end'] : null, - ); - } - - $this->response->html($this->layout('timetable_week/index', array( - 'timetable' => $this->timetableWeek->getByUser($user['id']), - 'values' => $values, - 'errors' => $errors, - 'user' => $user, - ))); - } - - /** - * Validate and save - * - * @access public - */ - public function save() - { - $values = $this->request->getValues(); - list($valid, $errors) = $this->timetableWeek->validateCreation($values); - - if ($valid) { - - if ($this->timetableWeek->create($values['user_id'], $values['day'], $values['start'], $values['end'])) { - $this->session->flash(t('Time slot created successfully.')); - $this->response->redirect($this->helper->url->to('timetableweek', 'index', array('user_id' => $values['user_id']))); - } - else { - $this->session->flashError(t('Unable to save this time slot.')); - } - } - - $this->index($values, $errors); - } - - /** - * Confirmation dialag box to remove a row - * - * @access public - */ - public function confirm() - { - $user = $this->getUser(); - - $this->response->html($this->layout('timetable_week/remove', array( - 'slot_id' => $this->request->getIntegerParam('slot_id'), - 'user' => $user, - ))); - } - - /** - * Remove a row - * - * @access public - */ - public function remove() - { - $this->checkCSRFParam(); - $user = $this->getUser(); - - if ($this->timetableWeek->remove($this->request->getIntegerParam('slot_id'))) { - $this->session->flash(t('Time slot removed successfully.')); - } - else { - $this->session->flash(t('Unable to remove this time slot.')); - } - - $this->response->redirect($this->helper->url->to('timetableweek', 'index', array('user_id' => $user['id']))); - } -} diff --git a/sources/app/Controller/User.php b/sources/app/Controller/User.php index 04e5741..0b39619 100644 --- a/sources/app/Controller/User.php +++ b/sources/app/Controller/User.php @@ -2,6 +2,8 @@ namespace Controller; +use Model\NotificationType; + /** * User controller * @@ -92,6 +94,11 @@ class User extends Base if ($user_id !== false) { $this->projectPermission->addMember($project_id, $user_id); + + if (! empty($values['notifications_enabled'])) { + $this->notificationType->saveUserSelectedTypes($user_id, array(NotificationType::TYPE_EMAIL)); + } + $this->session->flash(t('User created successfully.')); $this->response->redirect($this->helper->url->to('user', 'show', array('user_id' => $user_id))); } @@ -202,6 +209,8 @@ class User extends Base $this->response->html($this->layout('user/notifications', array( 'projects' => $this->projectPermission->getMemberProjects($user['id']), 'notifications' => $this->notification->readSettings($user['id']), + 'types' => $this->notificationType->getTypes(), + 'filters' => $this->notificationFilter->getFilters(), 'user' => $user, ))); } diff --git a/sources/app/Controller/Webnotification.php b/sources/app/Controller/Webnotification.php new file mode 100644 index 0000000..a481e9b --- /dev/null +++ b/sources/app/Controller/Webnotification.php @@ -0,0 +1,39 @@ +userSession->getId(); + + $this->webNotification->markAllAsRead($user_id); + $this->response->redirect($this->helper->url->to('app', 'notifications', array('user_id' => $user_id))); + } + + /** + * Mark a notification as read + * + * @access public + */ + public function remove() + { + $user_id = $this->userSession->getId(); + $notification_id = $this->request->getIntegerParam('notification_id'); + + $this->webNotification->markAsRead($user_id, $notification_id); + $this->response->redirect($this->helper->url->to('app', 'notifications', array('user_id' => $user_id))); + } +} diff --git a/sources/app/Core/Base.php b/sources/app/Core/Base.php index 3db0cf7..7503e84 100644 --- a/sources/app/Core/Base.php +++ b/sources/app/Core/Base.php @@ -10,78 +10,86 @@ use Pimple\Container; * @package core * @author Frederic Guillot * - * @property \Core\Helper $helper - * @property \Core\EmailClient $emailClient - * @property \Core\HttpClient $httpClient - * @property \Core\Paginator $paginator - * @property \Core\Request $request - * @property \Core\Session $session - * @property \Core\Template $template - * @property \Core\MemoryCache $memoryCache - * @property \Core\OAuth2 $oauth - * @property \Core\Router $router - * @property \Core\Lexer $lexer - * @property \Integration\BitbucketWebhook $bitbucketWebhook - * @property \Integration\GithubWebhook $githubWebhook - * @property \Integration\GitlabWebhook $gitlabWebhook - * @property \Integration\HipchatWebhook $hipchatWebhook - * @property \Integration\Jabber $jabber - * @property \Integration\Mailgun $mailgun - * @property \Integration\Postmark $postmark - * @property \Integration\Sendgrid $sendgrid - * @property \Integration\SlackWebhook $slackWebhook - * @property \Integration\Smtp $smtp - * @property \Model\Acl $acl - * @property \Model\Action $action - * @property \Model\Authentication $authentication - * @property \Model\Board $board - * @property \Model\Budget $budget - * @property \Model\Category $category - * @property \Model\Color $color - * @property \Model\Comment $comment - * @property \Model\Config $config - * @property \Model\Currency $currency - * @property \Model\DateParser $dateParser - * @property \Model\File $file - * @property \Model\HourlyRate $hourlyRate - * @property \Model\LastLogin $lastLogin - * @property \Model\Link $link - * @property \Model\Notification $notification - * @property \Model\Project $project - * @property \Model\ProjectActivity $projectActivity - * @property \Model\ProjectAnalytic $projectAnalytic - * @property \Model\ProjectDuplication $projectDuplication - * @property \Model\ProjectDailyColumnStats $projectDailyColumnStats - * @property \Model\ProjectDailyStats $projectDailyStats - * @property \Model\ProjectIntegration $projectIntegration - * @property \Model\ProjectPermission $projectPermission - * @property \Model\Subtask $subtask - * @property \Model\SubtaskExport $subtaskExport - * @property \Model\SubtaskForecast $subtaskForecast - * @property \Model\SubtaskTimeTracking $subtaskTimeTracking - * @property \Model\Swimlane $swimlane - * @property \Model\Task $task - * @property \Model\TaskAnalytic $taskAnalytic - * @property \Model\TaskCreation $taskCreation - * @property \Model\TaskDuplication $taskDuplication - * @property \Model\TaskExport $taskExport - * @property \Model\TaskFinder $taskFinder - * @property \Model\TaskFilter $taskFilter - * @property \Model\TaskLink $taskLink - * @property \Model\TaskModification $taskModification - * @property \Model\TaskPermission $taskPermission - * @property \Model\TaskPosition $taskPosition - * @property \Model\TaskStatus $taskStatus - * @property \Model\TaskValidator $taskValidator - * @property \Model\Timetable $timetable - * @property \Model\TimetableDay $timetableDay - * @property \Model\TimetableExtra $timetableExtra - * @property \Model\TimetableOff $timetableOff - * @property \Model\TimetableWeek $timetableWeek - * @property \Model\Transition $transition - * @property \Model\User $user - * @property \Model\UserSession $userSession - * @property \Model\Webhook $webhook + * @property \Core\Helper $helper + * @property \Core\EmailClient $emailClient + * @property \Core\HttpClient $httpClient + * @property \Core\Paginator $paginator + * @property \Core\Request $request + * @property \Core\Session $session + * @property \Core\Template $template + * @property \Core\OAuth2 $oauth + * @property \Core\Router $router + * @property \Core\Lexer $lexer + * @property \Core\ObjectStorage\ObjectStorageInterface $objectStorage + * @property \Core\Cache\Cache $memoryCache + * @property \Core\Plugin\Hook $hook + * @property \Core\Plugin\Loader $pluginLoader + * @property \Integration\BitbucketWebhook $bitbucketWebhook + * @property \Integration\GithubWebhook $githubWebhook + * @property \Integration\GitlabWebhook $gitlabWebhook + * @property \Integration\HipchatWebhook $hipchatWebhook + * @property \Integration\Jabber $jabber + * @property \Integration\Mailgun $mailgun + * @property \Integration\Postmark $postmark + * @property \Integration\Sendgrid $sendgrid + * @property \Integration\SlackWebhook $slackWebhook + * @property \Integration\Smtp $smtp + * @property \Formatter\ProjectGanttFormatter $projectGanttFormatter + * @property \Formatter\TaskFilterGanttFormatter $taskFilterGanttFormatter + * @property \Formatter\TaskFilterAutoCompleteFormatter $taskFilterAutoCompleteFormatter + * @property \Formatter\TaskFilterCalendarFormatter $taskFilterCalendarFormatter + * @property \Formatter\TaskFilterICalendarFormatter $taskFilterICalendarFormatter + * @property \Model\Acl $acl + * @property \Model\Action $action + * @property \Model\Authentication $authentication + * @property \Model\Board $board + * @property \Model\Category $category + * @property \Model\Color $color + * @property \Model\Comment $comment + * @property \Model\Config $config + * @property \Model\Currency $currency + * @property \Model\CustomFilter $customFilter + * @property \Model\DateParser $dateParser + * @property \Model\File $file + * @property \Model\LastLogin $lastLogin + * @property \Model\Link $link + * @property \Model\Notification $notification + * @property \Model\NotificationType $notificationType + * @property \Model\NotificationFilter $notificationFilter + * @property \Model\OverdueNotification $overdueNotification + * @property \Model\WebNotification $webNotification + * @property \Model\Project $project + * @property \Model\ProjectActivity $projectActivity + * @property \Model\ProjectAnalytic $projectAnalytic + * @property \Model\ProjectDuplication $projectDuplication + * @property \Model\ProjectDailyColumnStats $projectDailyColumnStats + * @property \Model\ProjectDailyStats $projectDailyStats + * @property \Model\ProjectIntegration $projectIntegration + * @property \Model\ProjectPermission $projectPermission + * @property \Model\Subtask $subtask + * @property \Model\SubtaskExport $subtaskExport + * @property \Model\SubtaskTimeTracking $subtaskTimeTracking + * @property \Model\Swimlane $swimlane + * @property \Model\Task $task + * @property \Model\TaskAnalytic $taskAnalytic + * @property \Model\TaskCreation $taskCreation + * @property \Model\TaskDuplication $taskDuplication + * @property \Model\TaskExport $taskExport + * @property \Model\TaskFinder $taskFinder + * @property \Model\TaskFilter $taskFilter + * @property \Model\TaskLink $taskLink + * @property \Model\TaskModification $taskModification + * @property \Model\TaskPermission $taskPermission + * @property \Model\TaskPosition $taskPosition + * @property \Model\TaskStatus $taskStatus + * @property \Model\TaskValidator $taskValidator + * @property \Model\Transition $transition + * @property \Model\User $user + * @property \Model\UserSession $userSession + * @property \Model\Webhook $webhook + * @property \Psr\Log\LoggerInterface $logger + * @property \League\HTMLToMarkdown\HtmlConverter $htmlConverter + * @property \PicoDb\Database $db */ abstract class Base { diff --git a/sources/app/Core/Cache.php b/sources/app/Core/Cache.php deleted file mode 100644 index 670a76e..0000000 --- a/sources/app/Core/Cache.php +++ /dev/null @@ -1,58 +0,0 @@ -container = $container; - $this->init(); - } - - /** - * Proxy cache - * - * Note: Arguments must be scalar types - * - * @access public - * @param string $container Container name - * @param string $method Container method - * @return mixed - */ - public function proxy($container, $method) - { - $args = func_get_args(); - $key = 'proxy_'.implode('_', $args); - $result = $this->get($key); - - if ($result === null) { - $result = call_user_func_array(array($this->container[$container], $method), array_splice($args, 2)); - $this->set($key, $result); - } - - return $result; - } -} diff --git a/sources/app/Core/Cache/Base.php b/sources/app/Core/Cache/Base.php new file mode 100644 index 0000000..a16c12f --- /dev/null +++ b/sources/app/Core/Cache/Base.php @@ -0,0 +1,38 @@ +get($key); + + if ($result === null) { + $result = call_user_func_array(array($class, $method), array_splice($args, 1)); + $this->set($key, $result); + } + + return $result; + } +} diff --git a/sources/app/Core/Cache/CacheInterface.php b/sources/app/Core/Cache/CacheInterface.php new file mode 100644 index 0000000..8675ef8 --- /dev/null +++ b/sources/app/Core/Cache/CacheInterface.php @@ -0,0 +1,45 @@ +storage[$key] = $value; + } + + /** + * Fetch value from cache + * + * @access public + * @param string $key + * @return mixed Null when not found, cached value otherwise + */ + public function get($key) + { + return isset($this->storage[$key]) ? $this->storage[$key] : null; + } + + /** + * Clear all cache + * + * @access public + */ + public function flush() + { + $this->storage = array(); + } + + /** + * Remove cached value + * + * @access public + * @param string $key + */ + public function remove($key) + { + unset($this->storage[$key]); + } +} diff --git a/sources/app/Core/HttpClient.php b/sources/app/Core/HttpClient.php index b808f75..99534cf 100644 --- a/sources/app/Core/HttpClient.php +++ b/sources/app/Core/HttpClient.php @@ -99,9 +99,18 @@ class HttpClient extends Base return ''; } - $headers = array_merge(array('User-Agent: '.self::HTTP_USER_AGENT, 'Connection: close'), $headers); + $default_headers = array( + 'User-Agent: '.self::HTTP_USER_AGENT, + 'Connection: close', + ); - $context = stream_context_create(array( + if (HTTP_PROXY_USERNAME) { + $default_headers[] = 'Proxy-Authorization: Basic '.base64_encode(HTTP_PROXY_USERNAME.':'.HTTP_PROXY_PASSWORD); + } + + $headers = array_merge($default_headers, $headers); + + $context = array( 'http' => array( 'method' => $method, 'protocol_version' => 1.1, @@ -110,9 +119,14 @@ class HttpClient extends Base 'header' => implode("\r\n", $headers), 'content' => $content ) - )); + ); - $stream = @fopen(trim($url), 'r', false, $context); + if (HTTP_PROXY_HOSTNAME) { + $context['http']['proxy'] = 'tcp://'.HTTP_PROXY_HOSTNAME.':'.HTTP_PROXY_PORT; + $context['http']['request_fulluri'] = true; + } + + $stream = @fopen(trim($url), 'r', false, stream_context_create($context)); $response = ''; if (is_resource($stream)) { diff --git a/sources/app/Core/MemoryCache.php b/sources/app/Core/MemoryCache.php deleted file mode 100644 index f80a66e..0000000 --- a/sources/app/Core/MemoryCache.php +++ /dev/null @@ -1,32 +0,0 @@ -storage[$key] = $value; - } - - public function get($key) - { - return isset($this->storage[$key]) ? $this->storage[$key] : null; - } - - public function flush() - { - $this->storage = array(); - } - - public function remove($key) - { - unset($this->storage[$key]); - } -} diff --git a/sources/app/Core/NotificationInterface.php b/sources/app/Core/NotificationInterface.php new file mode 100644 index 0000000..5dca74e --- /dev/null +++ b/sources/app/Core/NotificationInterface.php @@ -0,0 +1,22 @@ +path = $path; + } + + /** + * Fetch object contents + * + * @access public + * @param string $key + * @return string + */ + public function get($key) + { + $filename = $this->path.DIRECTORY_SEPARATOR.$key; + + if (! file_exists($filename)) { + throw new ObjectStorageException('File not found: '.$filename); + } + + return file_get_contents($filename); + } + + /** + * Save object + * + * @access public + * @param string $key + * @param string $blob + */ + public function put($key, &$blob) + { + $this->createFolder($key); + + if (file_put_contents($this->path.DIRECTORY_SEPARATOR.$key, $blob) === false) { + throw new ObjectStorageException('Unable to write the file: '.$this->path.DIRECTORY_SEPARATOR.$key); + } + } + + /** + * Output directly object content + * + * @access public + * @param string $key + */ + public function output($key) + { + $filename = $this->path.DIRECTORY_SEPARATOR.$key; + + if (! file_exists($filename)) { + throw new ObjectStorageException('File not found: '.$filename); + } + + readfile($filename); + } + + /** + * Move local file to object storage + * + * @access public + * @param string $src_filename + * @param string $key + * @return boolean + */ + public function moveFile($src_filename, $key) + { + $this->createFolder($key); + $dst_filename = $this->path.DIRECTORY_SEPARATOR.$key; + + if (! rename($src_filename, $dst_filename)) { + throw new ObjectStorageException('Unable to move the file: '.$src_filename.' to '.$dst_filename); + } + + return true; + } + + /** + * Move uploaded file to object storage + * + * @access public + * @param string $filename + * @param string $key + * @return boolean + */ + public function moveUploadedFile($filename, $key) + { + $this->createFolder($key); + return move_uploaded_file($filename, $this->path.DIRECTORY_SEPARATOR.$key); + } + + /** + * Remove object + * + * @access public + * @param string $key + * @return boolean + */ + public function remove($key) + { + $filename = $this->path.DIRECTORY_SEPARATOR.$key; + + if (file_exists($filename)) { + return unlink($filename); + } + + return false; + } + + /** + * Create object folder + * + * @access private + * @param string $key + */ + private function createFolder($key) + { + $folder = strpos($key, '/') !== false ? $this->path.DIRECTORY_SEPARATOR.dirname($key) : $this->path; + + if (! is_dir($folder) && ! mkdir($folder, 0755, true)) { + throw new ObjectStorageException('Unable to create folder: '.$folder); + } + } +} diff --git a/sources/app/Core/ObjectStorage/ObjectStorageException.php b/sources/app/Core/ObjectStorage/ObjectStorageException.php new file mode 100644 index 0000000..e89aeb2 --- /dev/null +++ b/sources/app/Core/ObjectStorage/ObjectStorageException.php @@ -0,0 +1,9 @@ +container['cspRules'] = $rules; + } + + /** + * Returns all classes that needs to be stored in the DI container + * + * @access public + * @return array + */ + public function getClasses() + { + return array(); + } + + /** + * Listen on internal events + * + * @access public + * @param string $event + * @param callable $callback + */ + public function on($event, $callback) + { + $container = $this->container; + + $this->container['dispatcher']->addListener($event, function() use ($container, $callback) { + call_user_func($callback, $container); + }); + } + + /** + * Get plugin name + * + * This method should be overrided by your Plugin class + * + * @access public + * @return string + */ + public function getPluginName() + { + return ucfirst(substr(get_called_class(), 7, -7)); + } + + /** + * Get plugin description + * + * This method should be overrided by your Plugin class + * + * @access public + * @return string + */ + public function getPluginDescription() + { + return ''; + } + + /** + * Get plugin author + * + * This method should be overrided by your Plugin class + * + * @access public + * @return string + */ + public function getPluginAuthor() + { + return '?'; + } + + /** + * Get plugin version + * + * This method should be overrided by your Plugin class + * + * @access public + * @return string + */ + public function getPluginVersion() + { + return '?'; + } + + /** + * Get plugin homepage + * + * This method should be overrided by your Plugin class + * + * @access public + * @return string + */ + public function getPluginHomepage() + { + return ''; + } +} diff --git a/sources/app/Core/Plugin/Hook.php b/sources/app/Core/Plugin/Hook.php new file mode 100644 index 0000000..fa14af1 --- /dev/null +++ b/sources/app/Core/Plugin/Hook.php @@ -0,0 +1,99 @@ +hooks[$hook])) { + $this->hooks[$hook] = array(); + } + + $this->hooks[$hook][] = $value; + } + + /** + * Get all bindings for a hook + * + * @access public + * @param string $hook + * @return array + */ + public function getListeners($hook) + { + return isset($this->hooks[$hook]) ? $this->hooks[$hook] : array(); + } + + /** + * Return true if the hook is used + * + * @access public + * @param string $hook + * @return boolean + */ + public function exists($hook) + { + return isset($this->hooks[$hook]); + } + + /** + * Merge listener results with input array + * + * @access public + * @param string $hook + * @param array $values + * @param array $params + * @return array + */ + public function merge($hook, array &$values, array $params = array()) + { + foreach ($this->getListeners($hook) as $listener) { + $result = call_user_func_array($listener, $params); + + if (is_array($result) && ! empty($result)) { + $values = array_merge($values, $result); + } + } + + return $values; + } + + /** + * Execute only first listener + * + * @access public + * @param string $hook + * @param array $params + * @return mixed + */ + public function first($hook, array $params = array()) + { + foreach ($this->getListeners($hook) as $listener) { + return call_user_func_array($listener, $params); + } + + return null; + } +} diff --git a/sources/app/Core/Plugin/Loader.php b/sources/app/Core/Plugin/Loader.php new file mode 100644 index 0000000..9a884da --- /dev/null +++ b/sources/app/Core/Plugin/Loader.php @@ -0,0 +1,148 @@ +isDot() && $fileinfo->isDir()) { + $plugin = $fileinfo->getFilename(); + $this->loadSchema($plugin); + $this->load($plugin); + } + } + } + } + + /** + * Load plugin + * + * @access public + * @param string $plugin + */ + public function load($plugin) + { + $class = '\Plugin\\'.$plugin.'\\Plugin'; + $instance = new $class($this->container); + + Tool::buildDic($this->container, $instance->getClasses()); + + $instance->initialize(); + $this->plugins[] = $instance; + } + + /** + * Load plugin schema + * + * @access public + * @param string $plugin + */ + public function loadSchema($plugin) + { + $filename = PLUGINS_DIR.'/'.$plugin.'/Schema/'.ucfirst(DB_DRIVER).'.php'; + + if (file_exists($filename)) { + require_once($filename); + $this->migrateSchema($plugin); + } + } + + /** + * Execute plugin schema migrations + * + * @access public + * @param string $plugin + */ + public function migrateSchema($plugin) + { + $last_version = constant('\Plugin\\'.$plugin.'\Schema\VERSION'); + $current_version = $this->getSchemaVersion($plugin); + + try { + + $this->db->startTransaction(); + $this->db->getDriver()->disableForeignKeys(); + + for ($i = $current_version + 1; $i <= $last_version; $i++) { + $function_name = '\Plugin\\'.$plugin.'\Schema\version_'.$i; + + if (function_exists($function_name)) { + call_user_func($function_name, $this->db->getConnection()); + } + } + + $this->db->getDriver()->enableForeignKeys(); + $this->db->closeTransaction(); + $this->setSchemaVersion($plugin, $i - 1); + } + catch (PDOException $e) { + $this->db->cancelTransaction(); + $this->db->getDriver()->enableForeignKeys(); + die('Unable to migrate schema for the plugin: '.$plugin.' => '.$e->getMessage()); + } + } + + /** + * Get current plugin schema version + * + * @access public + * @param string $plugin + * @return integer + */ + public function getSchemaVersion($plugin) + { + return (int) $this->db->table(self::TABLE_SCHEMA)->eq('plugin', strtolower($plugin))->findOneColumn('version'); + } + + /** + * Save last plugin schema version + * + * @access public + * @param string $plugin + * @param integer $version + * @return boolean + */ + public function setSchemaVersion($plugin, $version) + { + $dictionary = array( + strtolower($plugin) => $version + ); + + return $this->db->getDriver()->upsert(self::TABLE_SCHEMA, 'plugin', 'version', $dictionary); + } +} diff --git a/sources/app/Core/Response.php b/sources/app/Core/Response.php index d42a8f1..f8ca015 100644 --- a/sources/app/Core/Response.php +++ b/sources/app/Core/Response.php @@ -66,7 +66,13 @@ class Response */ public function redirect($url) { - header('Location: '.$url); + if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') { + header('X-Ajax-Redirect: '.$url); + } + else { + header('Location: '.$url); + } + exit; } diff --git a/sources/app/Core/Router.php b/sources/app/Core/Router.php index 6e7576d..93d266b 100644 --- a/sources/app/Core/Router.php +++ b/sources/app/Core/Router.php @@ -80,7 +80,7 @@ class Router extends Base $path = substr($path, 0, - strlen($query_string) - 1); } - if ($path{0} === '/') { + if (! empty($path) && $path{0} === '/') { $path = substr($path, 1); } @@ -206,56 +206,22 @@ class Router extends Base * @access public * @param string $uri * @param string $query_string - * @return boolean */ public function dispatch($uri, $query_string = '') { if (! empty($_GET['controller']) && ! empty($_GET['action'])) { - $controller = $this->sanitize($_GET['controller'], 'app'); - $action = $this->sanitize($_GET['action'], 'index'); + $this->controller = $this->sanitize($_GET['controller'], 'app'); + $this->action = $this->sanitize($_GET['action'], 'index'); + $plugin = ! empty($_GET['plugin']) ? $this->sanitize($_GET['plugin'], '') : ''; } else { - list($controller, $action) = $this->findRoute($this->getPath($uri, $query_string)); + list($this->controller, $this->action) = $this->findRoute($this->getPath($uri, $query_string)); // TODO: add plugin for routes + $plugin = ''; } + $class = empty($plugin) ? '\Controller\\'.ucfirst($this->controller) : '\Plugin\\'.ucfirst($plugin).'\Controller\\'.ucfirst($this->controller); - return $this->load( - __DIR__.'/../Controller/'.ucfirst($controller).'.php', - $controller, - '\Controller\\'.ucfirst($controller), - $action - ); - } - - /** - * Load a controller and execute the action - * - * @access private - * @param string $filename - * @param string $controller - * @param string $class - * @param string $method - * @return bool - */ - private function load($filename, $controller, $class, $method) - { - if (file_exists($filename)) { - - require $filename; - - if (! method_exists($class, $method)) { - return false; - } - - $this->action = $method; - $this->controller = $controller; - - $instance = new $class($this->container); - $instance->beforeAction($controller, $method); - $instance->$method(); - - return true; - } - - return false; + $instance = new $class($this->container); + $instance->beforeAction($this->controller, $this->action); + $instance->{$this->action}(); } } diff --git a/sources/app/Core/Session.php b/sources/app/Core/Session.php index df0ec5f..4f5fde7 100644 --- a/sources/app/Core/Session.php +++ b/sources/app/Core/Session.php @@ -45,7 +45,9 @@ class Session implements ArrayAccess ini_set('session.use_only_cookies', '1'); // Enable strict mode - ini_set('session.use_strict_mode', '1'); + if (version_compare(PHP_VERSION, '7.0.0') < 0) { + ini_set('session.use_strict_mode', '1'); + } // Ensure session ID integrity ini_set('session.entropy_file', '/dev/urandom'); diff --git a/sources/app/Core/Template.php b/sources/app/Core/Template.php index ba869ee..9ca904d 100644 --- a/sources/app/Core/Template.php +++ b/sources/app/Core/Template.php @@ -2,8 +2,6 @@ namespace Core; -use LogicException; - /** * Template class * @@ -13,11 +11,12 @@ use LogicException; class Template extends Helper { /** - * Template path + * List of template overrides * - * @var string + * @access private + * @var array */ - const PATH = 'app/Template/'; + private $overrides = array(); /** * Render a template @@ -33,16 +32,10 @@ class Template extends Helper */ public function render($__template_name, array $__template_args = array()) { - $__template_file = self::PATH.$__template_name.'.php'; - - if (! file_exists($__template_file)) { - throw new LogicException('Unable to load the template: "'.$__template_name.'"'); - } - extract($__template_args); ob_start(); - include $__template_file; + include $this->getTemplateFile($__template_name); return ob_get_clean(); } @@ -62,4 +55,41 @@ class Template extends Helper $template_args + array('content_for_layout' => $this->render($template_name, $template_args)) ); } + + /** + * Define a new template override + * + * @access public + * @param string $original_template + * @param string $new_template + */ + public function setTemplateOverride($original_template, $new_template) + { + $this->overrides[$original_template] = $new_template; + } + + /** + * Find template filename + * + * Core template name: 'task/show' + * Plugin template name: 'myplugin:task/show' + * + * @access public + * @param string $template_name + * @return string + */ + public function getTemplateFile($template_name) + { + $template_name = isset($this->overrides[$template_name]) ? $this->overrides[$template_name] : $template_name; + + if (strpos($template_name, ':') !== false) { + list($plugin, $template) = explode(':', $template_name); + $path = __DIR__.'/../../plugins/'.ucfirst($plugin).'/Template/'.$template.'.php'; + } + else { + $path = __DIR__.'/../Template/'.$template_name.'.php'; + } + + return $path; + } } diff --git a/sources/app/Core/Tool.php b/sources/app/Core/Tool.php index 84e42ba..887c8fb 100644 --- a/sources/app/Core/Tool.php +++ b/sources/app/Core/Tool.php @@ -2,6 +2,8 @@ namespace Core; +use Pimple\Container; + /** * Tool class * @@ -23,7 +25,6 @@ class Tool $fp = fopen($filename, 'w'); if (is_resource($fp)) { - foreach ($rows as $fields) { fputcsv($fp, $fields); } @@ -51,4 +52,102 @@ class Tool return $identifier; } + + /** + * Build dependency injection container from an array + * + * @static + * @access public + * @param Container $container + * @param array $namespaces + */ + public static function buildDIC(Container $container, array $namespaces) + { + foreach ($namespaces as $namespace => $classes) { + foreach ($classes as $name) { + $class = '\\'.$namespace.'\\'.$name; + $container[lcfirst($name)] = function ($c) use ($class) { + return new $class($c); + }; + } + } + } + + /** + * Generate a jpeg thumbnail from an image + * + * @static + * @access public + * @param string $src_file Source file image + * @param string $dst_file Destination file image + * @param integer $resize_width Desired image width + * @param integer $resize_height Desired image height + */ + public static function generateThumbnail($src_file, $dst_file, $resize_width = 250, $resize_height = 100) + { + $metadata = getimagesize($src_file); + $src_width = $metadata[0]; + $src_height = $metadata[1]; + $dst_y = 0; + $dst_x = 0; + + if (empty($metadata['mime'])) { + return; + } + + if ($resize_width == 0 && $resize_height == 0) { + $resize_width = 100; + $resize_height = 100; + } + + if ($resize_width > 0 && $resize_height == 0) { + $dst_width = $resize_width; + $dst_height = floor($src_height * ($resize_width / $src_width)); + $dst_image = imagecreatetruecolor($dst_width, $dst_height); + } + elseif ($resize_width == 0 && $resize_height > 0) { + $dst_width = floor($src_width * ($resize_height / $src_height)); + $dst_height = $resize_height; + $dst_image = imagecreatetruecolor($dst_width, $dst_height); + } + else { + + $src_ratio = $src_width / $src_height; + $resize_ratio = $resize_width / $resize_height; + + if ($src_ratio <= $resize_ratio) { + $dst_width = $resize_width; + $dst_height = floor($src_height * ($resize_width / $src_width)); + + $dst_y = ($dst_height - $resize_height) / 2 * (-1); + } + else { + $dst_width = floor($src_width * ($resize_height / $src_height)); + $dst_height = $resize_height; + + $dst_x = ($dst_width - $resize_width) / 2 * (-1); + } + + $dst_image = imagecreatetruecolor($resize_width, $resize_height); + } + + switch ($metadata['mime']) { + case 'image/jpeg': + case 'image/jpg': + $src_image = imagecreatefromjpeg($src_file); + break; + case 'image/png': + $src_image = imagecreatefrompng($src_file); + break; + case 'image/gif': + $src_image = imagecreatefromgif($src_file); + break; + default: + return; + } + + imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $dst_width, $dst_height, $src_width, $src_height); + imagejpeg($dst_image, $dst_file); + imagedestroy($dst_image); + } } diff --git a/sources/app/Core/Translator.php b/sources/app/Core/Translator.php index e3d1969..e9aa1f3 100644 --- a/sources/app/Core/Translator.php +++ b/sources/app/Core/Translator.php @@ -15,7 +15,7 @@ class Translator * * @var string */ - const PATH = 'app/Locale/'; + const PATH = 'app/Locale'; /** * Locale @@ -196,18 +196,27 @@ class Translator * @static * @access public * @param string $language Locale code: fr_FR + * @param string $path Locale folder */ - public static function load($language) + public static function load($language, $path = self::PATH) { setlocale(LC_TIME, $language.'.UTF-8', $language); - $filename = self::PATH.$language.DIRECTORY_SEPARATOR.'translations.php'; + $filename = $path.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'translations.php'; if (file_exists($filename)) { - self::$locales = require $filename; - } - else { - self::$locales = array(); + self::$locales = array_merge(self::$locales, require($filename)); } } + + /** + * Clear locales stored in memory + * + * @static + * @access public + */ + public static function unload() + { + self::$locales = array(); + } } diff --git a/sources/app/Formatter/FormatterInterface.php b/sources/app/Formatter/FormatterInterface.php new file mode 100644 index 0000000..4193bd4 --- /dev/null +++ b/sources/app/Formatter/FormatterInterface.php @@ -0,0 +1,14 @@ +projects = array(); + } + else { + + $this->projects = $this->db + ->table(self::TABLE) + ->asc('start_date') + ->in('id', $project_ids) + ->eq('is_active', self::ACTIVE) + ->eq('is_private', 0) + ->findAll(); + } + + return $this; + } + + /** + * Format projects to be displayed in the Gantt chart + * + * @access public + * @return array + */ + public function format() + { + $colors = $this->color->getDefaultColors(); + $bars = array(); + + foreach ($this->projects as $project) { + $start = empty($project['start_date']) ? time() : strtotime($project['start_date']); + $end = empty($project['end_date']) ? $start : strtotime($project['end_date']); + $color = next($colors) ?: reset($colors); + + $bars[] = array( + 'type' => 'project', + 'id' => $project['id'], + 'title' => $project['name'], + 'start' => array( + (int) date('Y', $start), + (int) date('n', $start), + (int) date('j', $start), + ), + 'end' => array( + (int) date('Y', $end), + (int) date('n', $end), + (int) date('j', $end), + ), + 'link' => $this->helper->url->href('project', 'show', array('project_id' => $project['id'])), + 'board_link' => $this->helper->url->href('board', 'show', array('project_id' => $project['id'])), + 'gantt_link' => $this->helper->url->href('gantt', 'project', array('project_id' => $project['id'])), + 'color' => $color, + 'not_defined' => empty($project['start_date']) || empty($project['end_date']), + 'users' => $this->projectPermission->getProjectUsers($project['id']), + ); + } + + return $bars; + } +} diff --git a/sources/app/Formatter/TaskFilterAutoCompleteFormatter.php b/sources/app/Formatter/TaskFilterAutoCompleteFormatter.php new file mode 100644 index 0000000..999a894 --- /dev/null +++ b/sources/app/Formatter/TaskFilterAutoCompleteFormatter.php @@ -0,0 +1,33 @@ +query->columns(Task::TABLE.'.id', Task::TABLE.'.title')->findAll(); + + foreach ($tasks as &$task) { + $task['value'] = $task['title']; + $task['label'] = '#'.$task['id'].' - '.$task['title']; + } + + return $tasks; + } +} diff --git a/sources/app/Formatter/TaskFilterCalendarEvent.php b/sources/app/Formatter/TaskFilterCalendarEvent.php new file mode 100644 index 0000000..8733ee8 --- /dev/null +++ b/sources/app/Formatter/TaskFilterCalendarEvent.php @@ -0,0 +1,76 @@ +startColumn = $start_column; + $this->endColumn = $end_column ?: $start_column; + return $this; + } + + /** + * When called calendar events will be full day + * + * @access public + * @return TaskFilterCalendarEvent + */ + public function setFullDay() + { + $this->fullDay = true; + return $this; + } + + /** + * Return true if the events are full day + * + * @access public + * @return boolean + */ + public function isFullDay() + { + return $this->fullDay; + } +} diff --git a/sources/app/Formatter/TaskFilterCalendarFormatter.php b/sources/app/Formatter/TaskFilterCalendarFormatter.php new file mode 100644 index 0000000..f3f42b9 --- /dev/null +++ b/sources/app/Formatter/TaskFilterCalendarFormatter.php @@ -0,0 +1,52 @@ +query->findAll() as $task) { + $events[] = array( + 'timezoneParam' => $this->config->getCurrentTimezone(), + 'id' => $task['id'], + 'title' => t('#%d', $task['id']).' '.$task['title'], + 'backgroundColor' => $this->color->getBackgroundColor($task['color_id']), + 'borderColor' => $this->color->getBorderColor($task['color_id']), + 'textColor' => 'black', + 'url' => $this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), + 'start' => date($this->getDateTimeFormat(), $task[$this->startColumn]), + 'end' => date($this->getDateTimeFormat(), $task[$this->endColumn] ?: time()), + 'editable' => $this->isFullDay(), + 'allday' => $this->isFullDay(), + ); + } + + return $events; + } + + /** + * Get DateTime format for event + * + * @access private + * @return string + */ + private function getDateTimeFormat() + { + return $this->isFullDay() ? 'Y-m-d' : 'Y-m-d\TH:i:s'; + } +} diff --git a/sources/app/Formatter/TaskFilterGanttFormatter.php b/sources/app/Formatter/TaskFilterGanttFormatter.php new file mode 100644 index 0000000..069daa3 --- /dev/null +++ b/sources/app/Formatter/TaskFilterGanttFormatter.php @@ -0,0 +1,78 @@ +query->findAll() as $task) { + $bars[] = $this->formatTask($task); + } + + return $bars; + } + + /** + * Format a single task + * + * @access private + * @param array $task + * @return array + */ + private function formatTask(array $task) + { + if (! isset($this->columns[$task['project_id']])) { + $this->columns[$task['project_id']] = $this->board->getColumnsList($task['project_id']); + } + + $start = $task['date_started'] ?: time(); + $end = $task['date_due'] ?: $start; + + return array( + 'type' => 'task', + 'id' => $task['id'], + 'title' => $task['title'], + 'start' => array( + (int) date('Y', $start), + (int) date('n', $start), + (int) date('j', $start), + ), + 'end' => array( + (int) date('Y', $end), + (int) date('n', $end), + (int) date('j', $end), + ), + 'column_title' => $task['column_name'], + 'assignee' => $task['assignee_name'] ?: $task['assignee_username'], + 'progress' => $this->task->getProgress($task, $this->columns[$task['project_id']]).'%', + 'link' => $this->helper->url->href('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), + 'color' => $this->color->getColorProperties($task['color_id']), + 'not_defined' => empty($task['date_due']) || empty($task['date_started']), + ); + } +} diff --git a/sources/app/Formatter/TaskFilterICalendarFormatter.php b/sources/app/Formatter/TaskFilterICalendarFormatter.php new file mode 100644 index 0000000..8aed1e2 --- /dev/null +++ b/sources/app/Formatter/TaskFilterICalendarFormatter.php @@ -0,0 +1,135 @@ +vCalendar->render(); + } + + /** + * Set calendar object + * + * @access public + * @param \Eluceo\iCal\Component\Calendar $vCalendar + * @return TaskFilterICalendarFormatter + */ + public function setCalendar(Calendar $vCalendar) + { + $this->vCalendar = $vCalendar; + return $this; + } + + /** + * Transform results to ical events + * + * @access public + * @return TaskFilterICalendarFormatter + */ + public function addDateTimeEvents() + { + foreach ($this->query->findAll() as $task) { + + $start = new DateTime; + $start->setTimestamp($task[$this->startColumn]); + + $end = new DateTime; + $end->setTimestamp($task[$this->endColumn] ?: time()); + + $vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-'.$this->startColumn.'-'.$this->endColumn); + $vEvent->setDtStart($start); + $vEvent->setDtEnd($end); + + $this->vCalendar->addComponent($vEvent); + } + + return $this; + } + + /** + * Transform results to all day ical events + * + * @access public + * @return TaskFilterICalendarFormatter + */ + public function addFullDayEvents() + { + foreach ($this->query->findAll() as $task) { + + $date = new DateTime; + $date->setTimestamp($task[$this->startColumn]); + + $vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-'.$this->startColumn); + $vEvent->setDtStart($date); + $vEvent->setDtEnd($date); + $vEvent->setNoTime(true); + + $this->vCalendar->addComponent($vEvent); + } + + return $this; + } + + /** + * Get common events for task ical events + * + * @access protected + * @param array $task + * @param string $uid + * @return Event + */ + protected function getTaskIcalEvent(array &$task, $uid) + { + $dateCreation = new DateTime; + $dateCreation->setTimestamp($task['date_creation']); + + $dateModif = new DateTime; + $dateModif->setTimestamp($task['date_modification']); + + $vEvent = new Event($uid); + $vEvent->setCreated($dateCreation); + $vEvent->setModified($dateModif); + $vEvent->setUseTimezone(true); + $vEvent->setSummary(t('#%d', $task['id']).' '.$task['title']); + $vEvent->setUrl($this->helper->url->base().$this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); + + if (! empty($task['owner_id'])) { + $vEvent->setOrganizer($task['assignee_name'] ?: $task['assignee_username'], $task['assignee_email']); + } + + if (! empty($task['creator_id'])) { + $attendees = new Attendees; + $attendees->add('MAILTO:'.($task['creator_email'] ?: $task['creator_username'].'@kanboard.local')); + $vEvent->setAttendees($attendees); + } + + return $vEvent; + } +} diff --git a/sources/app/Helper/App.php b/sources/app/Helper/App.php index e5ebefc..5fb89af 100644 --- a/sources/app/Helper/App.php +++ b/sources/app/Helper/App.php @@ -67,9 +67,11 @@ class App extends \Core\Base if (isset($this->session['flash_message'])) { $html = '
'.$this->helper->e($this->session['flash_message']).'
'; unset($this->session['flash_message']); + unset($this->session['flash_error_message']); } else if (isset($this->session['flash_error_message'])) { $html = '
'.$this->helper->e($this->session['flash_error_message']).'
'; + unset($this->session['flash_message']); unset($this->session['flash_error_message']); } diff --git a/sources/app/Helper/Form.php b/sources/app/Helper/Form.php index 83e3b11..a37cc81 100644 --- a/sources/app/Helper/Form.php +++ b/sources/app/Helper/Form.php @@ -103,6 +103,26 @@ class Form extends \Core\Base return ''; } + /** + * Display a checkboxes group + * + * @access public + * @param string $name Field name + * @param array $options Options + * @param array $values Form values + * @return string + */ + public function checkboxes($name, array $options, array $values = array()) + { + $html = ''; + + foreach ($options as $value => $label) { + $html .= $this->checkbox($name.'['.$value.']', $label, $value, isset($values[$name]) && in_array($value, $values[$name])); + } + + return $html; + } + /** * Display a checkbox field * diff --git a/sources/app/Helper/Hook.php b/sources/app/Helper/Hook.php new file mode 100644 index 0000000..dc76e5e --- /dev/null +++ b/sources/app/Helper/Hook.php @@ -0,0 +1,64 @@ +hook->getListeners($hook) as $file) { + $buffer .= $this->helper->asset->$type($file); + } + + return $buffer; + } + + /** + * Render all attached hooks + * + * @access public + * @param string $hook + * @param array $variables + * @return string + */ + public function render($hook, array $variables = array()) + { + $buffer = ''; + + foreach ($this->hook->getListeners($hook) as $template) { + $buffer .= $this->template->render($template, $variables); + } + + return $buffer; + } + + /** + * Attach a template to a hook + * + * @access public + * @param string $hook + * @param string $template + * @return \Helper\Hook + */ + public function attach($hook, $template) + { + $this->hook->on($hook, $template); + return $this; + } +} diff --git a/sources/app/Helper/User.php b/sources/app/Helper/User.php index cb596fb..6b7d6f7 100644 --- a/sources/app/Helper/User.php +++ b/sources/app/Helper/User.php @@ -10,6 +10,17 @@ namespace Helper; */ class User extends \Core\Base { + /** + * Return true if the logged user as unread notifications + * + * @access public + * @return boolean + */ + public function hasNotifications() + { + return $this->webNotification->hasNotifications($this->userSession->getId()); + } + /** * Get initials from a user * @@ -99,7 +110,7 @@ class User extends \Core\Base return true; } - return $this->memoryCache->proxy('acl', 'handleProjectAdminPermissions', $project_id); + return $this->memoryCache->proxy($this->container['acl'], 'handleProjectAdminPermissions', $project_id); } /** @@ -114,7 +125,7 @@ class User extends \Core\Base return true; } - return $this->memoryCache->proxy('acl', 'handleProjectManagerPermissions', $project_id); + return $this->memoryCache->proxy($this->container['acl'], 'handleProjectManagerPermissions', $project_id); } /** diff --git a/sources/app/Integration/Mailgun.php b/sources/app/Integration/Mailgun.php index 1451b21..076c311 100644 --- a/sources/app/Integration/Mailgun.php +++ b/sources/app/Integration/Mailgun.php @@ -2,7 +2,6 @@ namespace Integration; -use HTML_To_Markdown; use Core\Tool; /** @@ -76,8 +75,7 @@ class Mailgun extends \Core\Base // Get the Markdown contents if (! empty($payload['stripped-html'])) { - $markdown = new HTML_To_Markdown($payload['stripped-html'], array('strip_tags' => true)); - $description = $markdown->output(); + $description = $this->htmlConverter->convert($payload['stripped-html']); } else if (! empty($payload['stripped-text'])) { $description = $payload['stripped-text']; diff --git a/sources/app/Integration/Postmark.php b/sources/app/Integration/Postmark.php index dbb70ae..05bdf58 100644 --- a/sources/app/Integration/Postmark.php +++ b/sources/app/Integration/Postmark.php @@ -2,8 +2,6 @@ namespace Integration; -use HTML_To_Markdown; - /** * Postmark integration * @@ -76,8 +74,7 @@ class Postmark extends \Core\Base // Get the Markdown contents if (! empty($payload['HtmlBody'])) { - $markdown = new HTML_To_Markdown($payload['HtmlBody'], array('strip_tags' => true)); - $description = $markdown->output(); + $description = $this->htmlConverter->convert($payload['HtmlBody']); } else if (! empty($payload['TextBody'])) { $description = $payload['TextBody']; diff --git a/sources/app/Integration/Sendgrid.php b/sources/app/Integration/Sendgrid.php index 902749f..fd58342 100644 --- a/sources/app/Integration/Sendgrid.php +++ b/sources/app/Integration/Sendgrid.php @@ -2,7 +2,6 @@ namespace Integration; -use HTML_To_Markdown; use Core\Tool; /** @@ -79,8 +78,7 @@ class Sendgrid extends \Core\Base // Get the Markdown contents if (! empty($payload['html'])) { - $markdown = new HTML_To_Markdown($payload['html'], array('strip_tags' => true)); - $description = $markdown->output(); + $description = $this->htmlConverter->convert($payload['html']); } else if (! empty($payload['text'])) { $description = $payload['text']; diff --git a/sources/app/Integration/SlackWebhook.php b/sources/app/Integration/SlackWebhook.php index d238652..7124473 100644 --- a/sources/app/Integration/SlackWebhook.php +++ b/sources/app/Integration/SlackWebhook.php @@ -36,7 +36,7 @@ class SlackWebhook extends \Core\Base } $options = $this->projectIntegration->getParameters($project_id); - return $options['slack_webhook_url']; + return isset($options['slack_webhook_url']) ? $options['slack_webhook_url'] : ''; } /** @@ -52,14 +52,14 @@ class SlackWebhook extends \Core\Base if (! empty($channel)) { return $channel; - } + } - $options = $this->projectIntegration->getParameters($project_id); - return $options['slack_webhook_channel']; + $options = $this->projectIntegration->getParameters($project_id); + return isset($options['slack_webhook_channel']) ? $options['slack_webhook_channel'] : ''; } /** - * Send message to the incoming Slack webhook + * Send notification to Slack * * @access public * @param integer $project_id Project id @@ -76,23 +76,52 @@ class SlackWebhook extends \Core\Base $event['event_name'] = $event_name; $event['author'] = $this->user->getFullname($this->session['user']); - $payload = array( - 'text' => '*['.$project['name'].']* '.str_replace('"', '"', $this->projectActivity->getTitle($event)).(isset($event['task']['title']) ? ' ('.$event['task']['title'].')' : ''), - 'username' => 'Kanboard', - 'icon_url' => 'http://kanboard.net/assets/img/favicon.png', - ); + $message = '*['.$project['name'].']* '; + $message .= str_replace('"', '"', $this->projectActivity->getTitle($event)); + $message .= isset($event['task']['title']) ? ' ('.$event['task']['title'].')' : ''; if ($this->config->get('application_url')) { - $payload['text'] .= ' - <'.$this->helper->url->href('task', 'show', array('task_id' => $task_id, 'project_id' => $project_id), false, '', true); - $payload['text'] .= '|'.t('view the task on Kanboard').'>'; + $message .= ' - <'.$this->helper->url->href('task', 'show', array('task_id' => $task_id, 'project_id' => $project_id), false, '', true); + $message .= '|'.t('view the task on Kanboard').'>'; } - $channel = $this->getChannel($project_id); - if (! empty($channel)) { - $payload['channel'] = $channel; - } - - $this->httpClient->postJson($this->getWebhookUrl($project_id), $payload); + $this->sendMessage($project_id, $message); } } + + /** + * Send message to Slack + * + * @access public + * @param integer $project_id + * @param string $message + */ + public function sendMessage($project_id, $message) + { + $payload = array( + 'text' => $message, + 'username' => 'Kanboard', + 'icon_url' => 'http://kanboard.net/assets/img/favicon.png', + ); + + $this->sendPayload($project_id, $payload); + } + + /** + * Send payload to Slack + * + * @access public + * @param integer $project_id + * @param array $payload + */ + public function sendPayload($project_id, array $payload) + { + $channel = $this->getChannel($project_id); + + if (! empty($channel)) { + $payload['channel'] = $channel; + } + + $this->httpClient->postJson($this->getWebhookUrl($project_id), $payload); + } } diff --git a/sources/app/Locale/cs_CZ/translations.php b/sources/app/Locale/cs_CZ/translations.php index 557a62c..ba3d809 100644 --- a/sources/app/Locale/cs_CZ/translations.php +++ b/sources/app/Locale/cs_CZ/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Vzdálený', 'Enabled' => 'Povoleno', 'Disabled' => 'Zakázáno', - 'Google account linked' => 'Google účet byl propojen', - 'Github account linked' => 'Mit Githubaccount verbunden', 'Username:' => 'Uživatelské jméno:', 'Name:' => 'Jméno:', 'Email:' => 'e-mail', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Horizontální rolování', 'Compact/wide view' => 'Kompaktní/plné zobrazení', 'No results match:' => 'Žádná shoda:', - 'Remove hourly rate' => 'Stundensatz entfernen', - 'Do you really want to remove this hourly rate?' => 'Opravdu chcete odstranit tuto hodinovou sazbu?', - 'Hourly rates' => 'Hodinové sazby', - 'Hourly rate' => 'Hodinová sazba', 'Currency' => 'Měna', - 'Effective date' => 'Datum účinnosti', - 'Add new rate' => 'Přidat novou hodinovou sazbu', - 'Rate removed successfully.' => 'Sazba byla úspěšně odstraněna', - 'Unable to remove this rate.' => 'Sazbu nelze odstranit.', - 'Unable to save the hourly rate.' => 'Hodinovou sazbu nelze uložit', - 'Hourly rate created successfully.' => 'Hodinová sazba byla úspěšně vytvořena.', - 'Start time' => 'Počáteční datum', - 'End time' => 'Konečné datum', - 'Comment' => 'Komentář', - 'All day' => 'Všechny dny', - 'Day' => 'Den', - 'Manage timetable' => 'Spravovat pracovní dobu', - 'Overtime timetable' => 'Přesčasy', - 'Time off timetable' => 'Pracovní volno', - 'Timetable' => 'Pracovní doba', - 'Work timetable' => 'Pracovní doba', - 'Week timetable' => 'Týdenní pracovní doba', - 'Day timetable' => 'Denní pracovní doba', - 'From' => 'Od', - 'To' => 'Do', - 'Time slot created successfully.' => 'Časový úsek byl úspěšně vytvořen.', - 'Unable to save this time slot.' => 'Nelze uložit tento časový úsek.', - 'Time slot removed successfully.' => 'Časový úsek byl odstraněn.', - 'Unable to remove this time slot.' => 'Nelze odstranit tento časový úsek', - 'Do you really want to remove this time slot?' => 'Opravdu chcete odstranit tento časový úsek?', - 'Remove time slot' => 'Odstranit časový úsek', - 'Add new time slot' => 'Přidat nový časový úsek', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Tato pracovní doba se použije když je zaškrtnuto políčko "Celý den" pro plánovanou pracovní dobu i přesčas .', 'Files' => 'Soubory', 'Images' => 'Obrázky', 'Private project' => 'Soukromý projekt', - 'Amount' => 'Částka', // 'AUD - Australian Dollar' => '', - 'Budget' => 'Rozpočet', - 'Budget line' => 'Položka rozpočtu', - 'Budget line removed successfully.' => 'Položka rozpočtu byla odstraněna', - 'Budget lines' => 'Položky rozpočtu', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - 'Cost' => 'Cena', - 'Cost breakdown' => 'Rozpis nákladů', 'Custom Stylesheet' => 'Vlastní šablony stylů', 'download' => 'Stáhnout', - 'Do you really want to remove this budget line?' => 'Opravdu chcete odstranit tuto rozpočtovou řádku?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Náklady', 'GBP - British Pound' => 'GBP - Britská Libra', 'INR - Indian Rupee' => 'INR - Indische Rupien', 'JPY - Japanese Yen' => 'JPY - Japanischer Yen', - 'New budget line' => 'Nová položka rozpočtu', 'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar', - 'Remove a budget line' => 'Budgetlinie entfernen', - 'Remove budget line' => 'Budgetlinie entfernen', 'RSD - Serbian dinar' => 'RSD - Serbische Dinar', - 'The budget line have been created successfully.' => 'Položka rozpočtu byla úspěšně vytvořena.', - 'Unable to create the budget line.' => 'Nelze vytvořit rozpočtovou řádku.', - 'Unable to remove this budget line.' => 'Nelze vyjmout rozpočtovou řádku.', 'USD - US Dollar' => 'USD - US Dollar', - 'Remaining' => 'Zbývající', 'Destination column' => 'Cílový sloupec', 'Move the task to another column when assigned to a user' => 'Přesunout úkol do jiného sloupce, když je úkol přiřazen uživateli.', 'Move the task to another column when assignee is cleared' => 'Přesunout úkol do jiného sloupce, když je pověření uživatele vymazáno.', 'Source column' => 'Zdrojový sloupec', - // 'Show subtask estimates (forecast of future work)' => '', 'Transitions' => 'Změny etap', 'Executer' => 'Vykonavatel', 'Time spent in the column' => 'Trvání jednotlivých etap', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Kurz', 'Change reference currency' => 'Změnit referenční měnu', 'Add a new currency rate' => 'Přidat nový směnný kurz', - 'Currency rates are used to calculate project budget.' => 'Měnové sazby se používají k výpočtu rozpočtu projektu.', 'Reference currency' => 'Referenční měna', 'The currency rate have been added successfully.' => 'Směnný kurz byl úspěšně přidán.', 'Unable to add this currency rate.' => 'Nelze přidat tento směnný kurz', @@ -878,9 +826,6 @@ return array( '%s moved the task #%d to the first swimlane' => '%s hat die Aufgabe #%d in die erste Swimlane verschoben', '%s moved the task #%d to the swimlane "%s"' => '%s hat die Aufgabe #%d in die Swimlane "%s" verschoben', // 'Swimlane' => '', - 'Budget overview' => 'Budget Übersicht', - 'Type' => 'Typ', - 'There is not enough data to show something.' => 'Es gibt nicht genug Daten für die Anzeige', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/da_DK/translations.php b/sources/app/Locale/da_DK/translations.php index 6a41f06..fa45e58 100644 --- a/sources/app/Locale/da_DK/translations.php +++ b/sources/app/Locale/da_DK/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'Aktiv', 'Disabled' => 'Deaktiveret', - 'Google account linked' => 'Google-konto forbundet', - 'Github account linked' => 'Github-konto forbundet', 'Username:' => 'Brugernavn', 'Name:' => 'Navn:', 'Email:' => 'Email:', @@ -667,75 +665,26 @@ return array( // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', // 'No results match:' => '', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - // 'Hourly rates' => '', - // 'Hourly rate' => '', // 'Currency' => '', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - // 'Manage timetable' => '', - // 'Overtime timetable' => '', - // 'Time off timetable' => '', - // 'Timetable' => '', - // 'Work timetable' => '', - // 'Week timetable' => '', - // 'Day timetable' => '', - // 'From' => '', - // 'To' => '', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', // 'Files' => '', // 'Images' => '', // 'Private project' => '', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - // 'Budget' => '', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', // 'download' => '', - // 'Do you really want to remove this budget line?' => '', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', // 'Move the task to another column when assignee is cleared' => '', // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/de_DE/translations.php b/sources/app/Locale/de_DE/translations.php index 7b38e9f..c15e437 100644 --- a/sources/app/Locale/de_DE/translations.php +++ b/sources/app/Locale/de_DE/translations.php @@ -195,7 +195,7 @@ return array( 'Invalid date' => 'Ungültiges Datum', 'Must be done before %B %e, %Y' => 'Muss vor dem %d.%m.%Y erledigt werden', '%B %e, %Y' => '%d.%m.%Y', - // '%b %e, %Y' => '', + '%b %e, %Y' => '%d.%m.%Y', 'Automatic actions' => 'Automatische Aktionen', 'Your automatic action have been created successfully.' => 'Die automatische Aktion wurde erfolgreich erstellt.', 'Unable to create your automatic action.' => 'Erstellen der automatischen Aktion nicht möglich.', @@ -263,10 +263,10 @@ return array( '%d comments' => '%d Kommentare', '%d comment' => '%d Kommentar', 'Email address invalid' => 'Ungültige E-Mail-Adresse', - // 'Your external account is not linked anymore to your profile.' => '', - // 'Unable to unlink your external account.' => '', - // 'External authentication failed' => '', - // 'Your external account is linked to your profile successfully.' => '', + 'Your external account is not linked anymore to your profile.' => 'Dein externer Account ist nicht mehr mit deinem Profil verbunden.', + 'Unable to unlink your external account.' => 'Externer Account konnte nicht getrennt werden.', + 'External authentication failed' => 'Externe Authentifizierung fehlgeschlagen', + 'Your external account is linked to your profile successfully.' => 'Dein externer Account wurde erfolgreich mit deinem Profil verbunden', 'Email' => 'E-Mail', 'Link my Google Account' => 'Verbinde meinen Google-Account', 'Unlink my Google Account' => 'Verbindung mit meinem Google-Account trennen', @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'angeschaltet', 'Disabled' => 'abgeschaltet', - 'Google account linked' => 'Mit Google-Account verbunden', - 'Github account linked' => 'Mit Github-Account verbunden', 'Username:' => 'Benutzername', 'Name:' => 'Name', 'Email:' => 'E-Mail', @@ -608,7 +606,7 @@ return array( 'Time Tracking' => 'Zeiterfassung', 'You already have one subtask in progress' => 'Bereits eine Teilaufgabe in Bearbeitung', 'Which parts of the project do you want to duplicate?' => 'Welcher Teil des Projekts soll kopiert werden?', - // 'Disallow login form' => '', + 'Disallow login form' => 'Verbiete Login-Formular', 'Bitbucket commit received' => 'Bitbucket-Commit erhalten', 'Bitbucket webhooks' => 'Bitbucket-Webhooks', 'Help on Bitbucket webhooks' => 'Hilfe für Bitbucket-Webhooks', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Horizontales Scrollen', 'Compact/wide view' => 'Kompakt/Breite-Ansicht', 'No results match:' => 'Keine Ergebnisse:', - 'Remove hourly rate' => 'Stundensatz entfernen', - 'Do you really want to remove this hourly rate?' => 'Diesen Stundensatz wirklich entfernen?', - 'Hourly rates' => 'Stundensätze', - 'Hourly rate' => 'Stundensatz', 'Currency' => 'Währung', - 'Effective date' => 'Inkraftsetzung', - 'Add new rate' => 'Neue Rate hinzufügen', - 'Rate removed successfully.' => 'Rate erfolgreich entfernt', - 'Unable to remove this rate.' => 'Nicht in der Lage, diese Rate zu entfernen.', - 'Unable to save the hourly rate.' => 'Nicht in der Lage, diese Rate zu speichern', - 'Hourly rate created successfully.' => 'Stundensatz erfolgreich angelegt.', - 'Start time' => 'Startzeit', - 'End time' => 'Endzeit', - 'Comment' => 'Kommentar', - 'All day' => 'ganztägig', - 'Day' => 'Tag', - 'Manage timetable' => 'Zeitplan verwalten', - 'Overtime timetable' => 'Überstunden Zeitplan', - 'Time off timetable' => 'Freizeit Zeitplan', - 'Timetable' => 'Zeitplan', - 'Work timetable' => 'Arbeitszeitplan', - 'Week timetable' => 'Wochenzeitplan', - 'Day timetable' => 'Tageszeitplan', - 'From' => 'von', - 'To' => 'bis', - 'Time slot created successfully.' => 'Zeitfenster erfolgreich erstellt.', - 'Unable to save this time slot.' => 'Nicht in der Lage, dieses Zeitfenster zu speichern.', - 'Time slot removed successfully.' => 'Zeitfenster erfolgreich entfernt.', - 'Unable to remove this time slot.' => 'Nicht in der Lage, dieses Zeitfenster zu entfernen', - 'Do you really want to remove this time slot?' => 'Soll diese Zeitfenster wirklich gelöscht werden?', - 'Remove time slot' => 'Zeitfenster entfernen', - 'Add new time slot' => 'Neues Zeitfenster hinzufügen', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Dieses Zeitfenster wird verwendet, wenn die Checkbox "ganztägig" für Freizeit und Überstunden angeklickt ist.', 'Files' => 'Dateien', 'Images' => 'Bilder', 'Private project' => 'privates Projekt', - 'Amount' => 'Betrag', 'AUD - Australian Dollar' => 'AUD - Australische Dollar', - 'Budget' => 'Budget', - 'Budget line' => 'Budgetlinie', - 'Budget line removed successfully.' => 'Budgetlinie erfolgreich entfernt', - 'Budget lines' => 'Budgetlinien', 'CAD - Canadian Dollar' => 'CAD - Kanadische Dollar', 'CHF - Swiss Francs' => 'CHF - Schweizer Franken', - 'Cost' => 'Kosten', - 'Cost breakdown' => 'Kostenaufschlüsselung', 'Custom Stylesheet' => 'benutzerdefiniertes Stylesheet', 'download' => 'Download', - 'Do you really want to remove this budget line?' => 'Soll diese Budgetlinie wirklich entfernt werden?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Kosten', 'GBP - British Pound' => 'GBP - Britische Pfund', 'INR - Indian Rupee' => 'INR - Indische Rupien', 'JPY - Japanese Yen' => 'JPY - Japanische Yen', - 'New budget line' => 'Neue Budgetlinie', 'NZD - New Zealand Dollar' => 'NZD - Neuseeland-Dollar', - 'Remove a budget line' => 'Budgetlinie entfernen', - 'Remove budget line' => 'Budgetlinie entfernen', 'RSD - Serbian dinar' => 'RSD - Serbische Dinar', - 'The budget line have been created successfully.' => 'Die Budgetlinie wurde erfolgreich angelegt.', - 'Unable to create the budget line.' => 'Budgetlinie konnte nicht erstellt werden.', - 'Unable to remove this budget line.' => 'Budgetlinie konnte nicht gelöscht werden.', 'USD - US Dollar' => 'USD - US-Dollar', - 'Remaining' => 'Verbleibend', 'Destination column' => 'Zielspalte', 'Move the task to another column when assigned to a user' => 'Aufgabe in eine andere Spalte verschieben, wenn ein User zugeordnet wurde.', 'Move the task to another column when assignee is cleared' => 'Aufgabe in eine andere Spalte verschieben, wenn die Zuordnung gelöscht wurde.', 'Source column' => 'Quellspalte', - 'Show subtask estimates (forecast of future work)' => 'Teilaufgaben-Schätzungen anzeigen (Prognose)', 'Transitions' => 'Übergänge', 'Executer' => 'Ausführender', 'Time spent in the column' => 'Zeit in Spalte verbracht', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Kurse', 'Change reference currency' => 'Referenzwährung ändern', 'Add a new currency rate' => 'Neuen Währungskurs hinzufügen', - 'Currency rates are used to calculate project budget.' => 'Währungskurse werden verwendet, um das Projektbudget zu berechnen.', 'Reference currency' => 'Referenzwährung', 'The currency rate have been added successfully.' => 'Der Währungskurs wurde erfolgreich hinzugefügt.', 'Unable to add this currency rate.' => 'Währungskurs konnte nicht hinzugefügt werden', @@ -777,8 +725,8 @@ return array( 'uploaded by: %s' => 'Hochgeladen von: %s', 'uploaded on: %s' => 'Hochgeladen am: %s', 'size: %s' => 'Größe: %s', - 'Burndown chart for "%s"' => 'Burndown-Chart für "%s"', - 'Burndown chart' => 'Burndown-Chart', + 'Burndown chart for "%s"' => 'Burndown-Diagramm für "%s"', + 'Burndown chart' => 'Burndown-Diagramm', 'This chart show the task complexity over the time (Work Remaining).' => 'Dieses Diagramm zeigt die Aufgabenkomplexität über den Faktor Zeit (Verbleibende Arbeit).', 'Screenshot taken %s' => 'Screenshot aufgenommen %s ', 'Add a screenshot' => 'Füge einen Screenshot hinzu', @@ -827,7 +775,7 @@ return array( 'When task is moved from first column' => 'Wenn Aufgabe von erster Spalte verschoben wird', 'When task is moved to last column' => 'Wenn Aufgabe in letzte Spalte verschoben wird', 'Year(s)' => 'Jahr(e)', - // 'Jabber (XMPP)' => '', + 'Jabber (XMPP)' => 'Jabber (XMPP)', 'Send notifications to Jabber' => 'Benachrichtigungen an Jabber senden', 'XMPP server address' => 'XMPP-Server-Adresse', 'Jabber domain' => 'Jabber-Domain', @@ -844,7 +792,7 @@ return array( 'Subtasks time tracking' => 'Teilaufgaben-Zeiterfassung', 'User calendar view' => 'Benutzer-Kalendersicht', 'Automatically update the start date' => 'Beginndatum automatisch aktualisieren', - // 'iCal feed' => '', + 'iCal feed' => 'iCal Feed', 'Preferences' => 'Einstellungen', 'Security' => 'Sicherheit', 'Two factor authentication disabled' => 'Zwei-Faktor-Authentifizierung deaktiviert', @@ -854,21 +802,21 @@ return array( 'User that will receive the email' => 'Empfänger der E-Mail', 'Email subject' => 'E-Mail-Betreff', 'Date' => 'Datum', - // 'By @%s on Bitbucket' => '', + 'By @%s on Bitbucket' => 'Durch @%s auf Bitbucket', 'Bitbucket Issue' => 'Bitbucket-Issue', - // 'Commit made by @%s on Bitbucket' => '', - // 'Commit made by @%s on Github' => '', - // 'By @%s on Github' => '', - // 'Commit made by @%s on Gitlab' => '', + 'Commit made by @%s on Bitbucket' => 'Commit von @%s auf Bitbucket', + 'Commit made by @%s on Github' => 'Commit von @%s auf Github', + 'By @%s on Github' => 'Durch @%s auf Github', + 'Commit made by @%s on Gitlab' => 'Commit von @%s auf Gitlab', 'Add a comment log when moving the task between columns' => 'Kommentar hinzufügen, wenn Aufgabe in andere Spalte verschoben wird', 'Move the task to another column when the category is changed' => 'Aufgabe in andere Spalte verschieben, wenn Kategorie geändert wird', 'Send a task by email to someone' => 'Aufgabe per E-Mail versenden', 'Reopen a task' => 'Aufgabe wieder öffnen', - // 'Bitbucket issue opened' => '', - // 'Bitbucket issue closed' => '', - // 'Bitbucket issue reopened' => '', - // 'Bitbucket issue assignee change' => '', - // 'Bitbucket issue comment created' => '', + 'Bitbucket issue opened' => 'Bitbucket Ticket eröffnet', + 'Bitbucket issue closed' => 'Bitbucket Ticket geschlossen', + 'Bitbucket issue reopened' => 'Bitbucket Ticket wieder eröffnet', + 'Bitbucket issue assignee change' => 'Bitbucket Ticket Zuordnung geändert', + 'Bitbucket issue comment created' => 'Bitbucket Ticket Kommentar erstellt', 'Column change' => 'Spalte geändert', 'Position change' => 'Position geändert', 'Swimlane change' => 'Swimlane geändert', @@ -877,13 +825,10 @@ return array( 'Notification' => 'Benachrichtigungen', '%s moved the task #%d to the first swimlane' => '%s hat die Aufgabe #%d in die erste Swimlane verschoben', '%s moved the task #%d to the swimlane "%s"' => '%s hat die Aufgabe #%d in die Swimlane "%s" verschoben', - // 'Swimlane' => '', - 'Budget overview' => 'Budget-Übersicht', - 'Type' => 'Typ', - 'There is not enough data to show something.' => 'Es gibt nicht genügend Daten für diese Anzeige', - // 'Gravatar' => '', - // 'Hipchat' => '', - // 'Slack' => '', + 'Swimlane' => 'Swimlane', + 'Gravatar' => 'Gravatar', + 'Hipchat' => 'Hipchat', + 'Slack' => 'Slack', '%s moved the task %s to the first swimlane' => '%s hat die Aufgabe %s in die erste Swimlane verschoben', '%s moved the task %s to the swimlane "%s"' => '%s hat die Aufgaben %s in die Swimlane "%s" verschoben', 'This report contains all subtasks information for the given date range.' => 'Der Bericht beinhaltet alle Teilaufgaben im gewählten Zeitraum', @@ -908,22 +853,22 @@ return array( 'The field "%s" have been updated' => 'Das Feld "%s" wurde verändert', 'The description have been modified' => 'Die Beschreibung wurde geändert', 'Do you really want to close the task "%s" as well as all subtasks?' => 'Soll die Aufgabe "%s" wirklich geschlossen werden? (einschließlich Teilaufgaben)', - // 'Swimlane: %s' => '', + 'Swimlane: %s' => 'Swimlane: %s', 'I want to receive notifications for:' => 'Ich möchte Benachrichtigungen erhalten für:', 'All tasks' => 'Alle Aufgaben', 'Only for tasks assigned to me' => 'nur mir zugeordnete Aufgane', 'Only for tasks created by me' => 'nur von mir erstellte Aufgaben', 'Only for tasks created by me and assigned to me' => 'nur mir zugeordnete und von mir erstellte Aufgaben', - // '%A' => '', - // '%b %e, %Y, %k:%M %p' => '', + '%A' => '%A', + '%b %e, %Y, %k:%M %p' => '%b %e, %Y, %k:%M %p', 'New due date: %B %e, %Y' => 'Neues Ablaufdatum: %B %e, %Y', 'Start date changed: %B %e, %Y' => 'Neues Beginndatum: %B %e, %Y', - // '%k:%M %p' => '', - // '%%Y-%%m-%%d' => '', + '%k:%M %p' => '%k:%M %p', + '%%Y-%%m-%%d' => '%%d.%%m.%%Y', 'Total for all columns' => 'Gesamt für alle Spalten', 'You need at least 2 days of data to show the chart.' => 'Es werden mindestens 2 Tage zur Darstellung benötigt', - // '<15m' => '', - // '<30m' => '', + '<15m' => '<15min', + '<30m' => '<30min', 'Stop timer' => 'Stoppe Timer', 'Start timer' => 'Starte Timer', 'Add project member' => 'Projektmitglied hinzufügen', @@ -943,7 +888,7 @@ return array( 'Not assigned' => 'Nicht zugewiesen', 'View advanced search syntax' => 'Zur erweiterten Suchsyntax', 'Overview' => 'Überblick', - // '%b %e %Y' => '', + '%b %e %Y' => '%b %e %Y', 'Board/Calendar/List view' => 'Board-/Kalender-/Listen-Ansicht', 'Switch to the board view' => 'Zur Board-Ansicht', 'Switch to the calendar view' => 'Zur Kalender-Ansicht', @@ -963,108 +908,152 @@ return array( 'Search by category: ' => 'Suche nach Kategorie: ', 'Search by description: ' => 'Suche nach Beschreibung: ', 'Search by due date: ' => 'Suche nach Fälligkeitsdatum: ', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', - // 'Average time spent into each column' => '', - // 'Average time spent' => '', - // 'This chart show the average time spent into each column for the last %d tasks.' => '', - // 'Average Lead and Cycle time' => '', - // 'Average lead time: ' => '', - // 'Average cycle time: ' => '', - // 'Cycle Time' => '', - // 'Lead Time' => '', - // 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '', - // 'Average time into each column' => '', - // 'Lead and cycle time' => '', - // 'Google Authentication' => '', - // 'Help on Google authentication' => '', - // 'Github Authentication' => '', - // 'Help on Github authentication' => '', - // 'Channel/Group/User (Optional)' => '', - // 'Lead time: ' => '', - // 'Cycle time: ' => '', - // 'Time spent into each column' => '', - // 'The lead time is the duration between the task creation and the completion.' => '', - // 'The cycle time is the duration between the start date and the completion.' => '', - // 'If the task is not closed the current time is used instead of the completion date.' => '', - // 'Set automatically the start date' => '', - // 'Edit Authentication' => '', - // 'Google Id' => '', - // 'Github Id' => '', - // 'Remote user' => '', - // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', - // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'By @%s on Gitlab' => '', - // 'Gitlab issue comment created' => '', - // 'New remote user' => '', - // 'New local user' => '', - // 'Default task color' => '', - // 'Hide sidebar' => '', - // 'Expand sidebar' => '', - // 'This feature does not work with all browsers.' => '', - // 'There is no destination project available.' => '', - // 'Trigger automatically subtask time tracking' => '', - // 'Include closed tasks in the cumulative flow diagram' => '', - // 'Current swimlane: %s' => '', - // 'Current column: %s' => '', - // 'Current category: %s' => '', - // 'no category' => '', - // 'Current assignee: %s' => '', - // 'not assigned' => '', - // 'Author:' => '', - // 'contributors' => '', - // 'License:' => '', - // 'License' => '', - // 'Project Administrator' => '', - // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', - // 'Start date:' => '', - // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', - // 'People who are project managers' => '', - // 'People who are project members' => '', - // 'NOK - Norwegian Krone' => '', - // 'Show this column' => '', - // 'Hide this column' => '', - // 'open file' => '', - // 'End date' => '', - // 'Users overview' => '', - // 'Managers' => '', - // 'Members' => '', - // 'Shared project' => '', - // 'Project managers' => '', - // 'Project members' => '', - // 'Gantt chart for all projects' => '', - // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', - // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', - // 'Start date: %s' => '', - // 'End date: %s' => '', - // 'Link type' => '', - // 'Change task color when using a specific task link' => '', - // 'Task link creation or modification' => '', - // 'Login with my Gitlab Account' => '', - // 'Milestone' => '', - // 'Gitlab Authentication' => '', - // 'Help on Gitlab authentication' => '', - // 'Gitlab Id' => '', - // 'Gitlab Account' => '', - // 'Link my Gitlab Account' => '', - // 'Unlink my Gitlab Account' => '', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Lead and Cycle time for "%s"' => 'Durchlauf und Zykluszeit für "%s"', + 'Average time spent into each column for "%s"' => 'Durchschnittliche Zeit in jeder Spalte für "%s"', + 'Average time spent into each column' => 'Durchschnittszeit in jeder Spalte', + 'Average time spent' => 'Durchschnittlicher Zeitverbrauch', + 'This chart show the average time spent into each column for the last %d tasks.' => 'Dieses Diagramm zeigt die durchschnittliche Zeit in jeder Spalte der letzten %d Aufgaben.', + 'Average Lead and Cycle time' => 'Durchschnittliche Zyklus- und Durchlaufzeit', + 'Average lead time: ' => 'Durchschnittliche Durchlaufzeit:', + 'Average cycle time: ' => 'Durchschnittliche Zykluszeit:', + 'Cycle Time' => 'Zykluszeit', + 'Lead Time' => 'Durchlaufzeit', + 'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Das Diagramm zeigt die durchschnittliche Durchlauf- und Zykluszeit der letzten %d Aufgaben über die Zeit an.', + 'Average time into each column' => 'Durchschnittzeit in jeder Spalte', + 'Lead and cycle time' => 'Durchlauf- und Zykluszeit', + 'Google Authentication' => 'Google-Authentifizierung', + 'Help on Google authentication' => 'Hilfe bei Google-Authentifizierung', + 'Github Authentication' => 'Github-Authentifizierung', + 'Help on Github authentication' => 'Hilfe bei Github-Authentifizierung', + 'Channel/Group/User (Optional)' => 'Kanal/Gruppe/Benutzer (optional)', + 'Lead time: ' => 'Durchlaufzeit:', + 'Cycle time: ' => 'Zykluszeit:', + 'Time spent into each column' => 'zeit verbracht in jeder Spalte', + 'The lead time is the duration between the task creation and the completion.' => 'Die Durchlaufzeit ist die Dauer zwischen Erstellung und Fertigstellung.', + 'The cycle time is the duration between the start date and the completion.' => 'Die Zykluszeit ist die Dauer zwischen Start und Fertigstellung.', + 'If the task is not closed the current time is used instead of the completion date.' => 'Wenn die Aufgabe nicht geschlossen ist, wird die aktuelle Zeit statt der Fertigstellung verwendet.', + 'Set automatically the start date' => 'Setze Startdatum automatisch', + 'Edit Authentication' => 'Authentifizierung bearbeiten', + 'Google Id' => 'Google Id', + 'Github Id' => 'Github Id', + 'Remote user' => 'Remote-Benutzer', + 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Remote-Benutzer haben kein Passwort in der Kanboard Datenbank, Beispiel LDAP, Goole und Github Accounts', + 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Wenn die Box "Verbiete Login-Formular" angeschaltet ist, werden Eingaben in das Login Formular ignoriert.', + 'By @%s on Gitlab' => 'Durch @%s auf Gitlab', + 'Gitlab issue comment created' => 'Gitlab Ticket Kommentar erstellt', + 'New remote user' => 'Neuer Remote-Benutzer', + 'New local user' => 'Neuer lokaler Benutzer', + 'Default task color' => 'Voreingestellte Aufgabenfarbe', + 'Hide sidebar' => 'Seitenleiste verstecken', + 'Expand sidebar' => 'Seitenleiste ausklappen', + 'This feature does not work with all browsers.' => 'Diese Funktion funktioniert nicht mit allen Browsern', + 'There is no destination project available.' => 'Es ist kein Zielprojekt vorhanden.', + 'Trigger automatically subtask time tracking' => 'Teilaufgaben Zeiterfassung automatisch starten', + 'Include closed tasks in the cumulative flow diagram' => 'Geschlossen Aufgaben ins kumulative Flussdiagramm einschließen', + 'Current swimlane: %s' => 'Aktuelle Swimlane: %s', + 'Current column: %s' => 'Aktuelle Spalte: %s', + 'Current category: %s' => 'Aktuelle Kategorie: %s', + 'no category' => 'keine Kategorie', + 'Current assignee: %s' => 'Aktuelle Zuordnung: %s', + 'not assigned' => 'nicht zugeordnet', + 'Author:' => 'Autor', + 'contributors' => 'Mitwirkende', + 'License:' => 'Lizenz:', + 'License' => 'Lizenz', + 'Project Administrator' => 'Projektadministrator', + 'Enter the text below' => 'Text unten eingeben', + 'Gantt chart for %s' => 'Gantt Diagramm für %s', + 'Sort by position' => 'Nach Position sortieren', + 'Sort by date' => 'Nach Datum sortieren', + 'Add task' => 'Aufgabe hinzufügen', + 'Start date:' => 'Startdatum:', + 'Due date:' => 'Ablaufdatum:', + 'There is no start date or due date for this task.' => 'Diese Aufgabe hat kein Start oder Ablaufdatum.', + 'Moving or resizing a task will change the start and due date of the task.' => 'Aufgabe verschieben/ändern, ändert auch Start- und Ablaufdatum der Aufgabe.', + 'There is no task in your project.' => 'Es gibt keine Aufgabe in deinem Projekt', + 'Gantt chart' => 'Gantt Diagramm', + 'People who are project managers' => 'Benutzer die Projektmanager sind', + 'People who are project members' => 'Benutzer die Projektmitglieder sind', + 'NOK - Norwegian Krone' => 'NOK - Norwegische Kronen', + 'Show this column' => 'Spalte anzeigen', + 'Hide this column' => 'Spalte verstecken', + 'open file' => 'Datei öffnen', + 'End date' => 'Endedatum', + 'Users overview' => 'Benutzerübersicht', + 'Managers' => 'Manager', + 'Members' => 'Mitglieder', + 'Shared project' => 'Geteiltes Projekt', + 'Project managers' => 'Projektmanager', + 'Project members' => 'Projektmitglieder', + 'Gantt chart for all projects' => 'Gantt Diagramm für alle Projekte', + 'Projects list' => 'Projektliste', + 'Gantt chart for this project' => 'Gantt Diagramm für dieses Projekt', + 'Project board' => 'Projekt Pinnwand', + 'End date:' => 'Endedatum:', + 'There is no start date or end date for this project.' => 'Es gibt kein Startdatum oder Endedatum für dieses Projekt', + 'Projects Gantt chart' => 'Projekt Gantt Diagramm', + 'Start date: %s' => 'Beginndatum: %s', + 'End date: %s' => 'Enddatum: %s', + 'Link type' => 'Verbindungstyp', + 'Change task color when using a specific task link' => 'Aufgabefarbe ändern bei bestimmter Aufgabenverbindung', + 'Task link creation or modification' => 'Aufgabenverbindung erstellen oder bearbeiten', + 'Login with my Gitlab Account' => 'Mit Gitlab Account einloggen', + 'Milestone' => 'Meilenstein', + 'Gitlab Authentication' => 'Gitlab-Authentifizierung', + 'Help on Gitlab authentication' => 'Hilfe bei Gitlab-Authentifizierung', + 'Gitlab Id' => 'Gitlab Id', + 'Gitlab Account' => 'Gitlab Account', + 'Link my Gitlab Account' => 'Verknüpfe mein Gitlab Account', + 'Unlink my Gitlab Account' => 'Trenne meinen Gitlab Account', + 'Documentation: %s' => 'Dokumentation: %s', + 'Switch to the Gantt chart view' => 'Zur Gantt-Diagramm Ansicht wechseln', + 'Reset the search/filter box' => 'Suche/Filter-Box zurücksetzen', + 'Documentation' => 'Dokumentation', + 'Table of contents' => 'Inhaltsverzeichnis', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Hilfe bei Projektberechtigungen', + 'Author' => 'Autor', + 'Version' => 'Version', + 'Plugins' => 'Plugins', + 'There is no plugin loaded.' => 'Es ist kein Plugin geladen.', + 'Set maximum column height' => 'Setze maximale Spaltenhöhe', + 'Remove maximum column height' => 'Entferne maximale Spaltenhöhe', + 'My notifications' => 'Meine Benachrichtigungen', + 'Custom filters' => 'benutzerdefinierte Filter', + 'Your custom filter have been created successfully.' => 'Benutzerdefinierten Filter erfolgreich erstellt.', + 'Unable to create your custom filter.' => 'Benutzerdefinierter Filter konnte nicht erstellt werden.', + 'Custom filter removed successfully.' => 'Benutzerdefinierten Filter erfolgreich entfernt.', + 'Unable to remove this custom filter.' => 'Benutzerdefinierten Filter konnte nicht entfernt werden.', + 'Edit custom filter' => 'Benutzerdefinierten Filter bearbeiten', + 'Your custom filter have been updated successfully.' => 'Benutzerdefinierten Filter erfolgreich bearbeitet.', + 'Unable to update custom filter.' => 'Benutzerdefinierter Filter konnte nicht geändert werden.', + 'Web' => 'Web', + 'New attachment on task #%d: %s' => 'Neuer Anhang für Aufgabe #%d: %s', + 'New comment on task #%d' => 'Neuer Kommentar für Aufgabe #%d', + 'Comment updated on task #%d' => 'Kommentar geändert für Aufgabe #%d', + 'New subtask on task #%d' => 'Neue Teilaufgabe für Aufgabe #%d', + 'Subtask updated on task #%d' => 'Teilaufgabe geändert für Aufgabe #%d', + 'New task #%d: %s' => 'Neue Aufgabe #%d: %s', + 'Task updated #%d' => 'Aufgabe bearbeitet #%d', + 'Task #%d closed' => 'Aufgabe #%d geschlossen', + 'Task #%d opened' => 'Aufgabe #%d eröffnet', + 'Column changed for task #%d' => 'Spalte geändert von Aufgabe #%d', + 'New position for task #%d' => 'Neue Position für Aufgabe #%d', + 'Swimlane changed for task #%d' => 'Neue Swimlane für Aufgabe #%d', + 'Assignee changed on task #%d' => 'Neue Zuordnung für Aufgabe #%d ', + '%d overdue tasks' => '%d überfällige Aufgaben', + 'Task #%d is overdue' => 'Aufgabe #%d ist überfällig', + 'No new notifications.' => 'Keine neuen Benachrichtigungen', + 'Mark all as read' => 'Alles als gelesen markieren', + 'Mark as read' => 'Als gelesen markieren', + 'Total number of tasks in this column across all swimlanes' => 'Anzahl an Aufgaben in dieser Spalte über alle Swimlanes', + 'Collapse swimlane' => 'Swimlane einklappen', + 'Expand swimlane' => 'Swimlane ausklappen', + 'Add a new filter' => 'Neuen Filter hinzufügen', + 'Share with all project members' => 'Mit allen Projektmitgliedern teilen.', + 'Shared' => 'Geteilt', + 'Owner' => 'Eigentümer', + 'Unread notifications' => 'Ungelesene Benachrichtigungen', + 'My filters' => 'Meine Filter', + 'Notification methods:' => 'Benachrichtigungs-Methoden:', ); diff --git a/sources/app/Locale/es_ES/translations.php b/sources/app/Locale/es_ES/translations.php index ac7c0e4..152a617 100644 --- a/sources/app/Locale/es_ES/translations.php +++ b/sources/app/Locale/es_ES/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remota', 'Enabled' => 'Activada', 'Disabled' => 'Desactivada', - 'Google account linked' => 'Vinculada con Cuenta de Google', - 'Github account linked' => 'Vinculada con Cuenta de Gitgub', 'Username:' => 'Nombre de Usuario:', 'Name:' => 'Nombre:', 'Email:' => 'Correo electrónico:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Desplazamiento horizontal', 'Compact/wide view' => 'Vista compacta/amplia', 'No results match:' => 'No hay resultados coincidentes:', - 'Remove hourly rate' => 'Quitar cobro horario', - 'Do you really want to remove this hourly rate?' => '¿Realmente quire quitar el cobro horario?', - 'Hourly rates' => 'Cobros horarios', - 'Hourly rate' => 'Cobro horario', 'Currency' => 'Moneda', - 'Effective date' => 'Fecha efectiva', - 'Add new rate' => 'Añadir nuevo cobro', - 'Rate removed successfully.' => 'Cobro quitado con éxito.', - 'Unable to remove this rate.' => 'No pude quitar este cobro.', - 'Unable to save the hourly rate.' => 'No pude grabar el cobro horario.', - 'Hourly rate created successfully.' => 'Cobro horario creado con éxito', - 'Start time' => 'Tiempo de inicio', - 'End time' => 'Tiempo de fin', - 'Comment' => 'Comentario', - 'All day' => 'Todos los días', - 'Day' => 'Día', - 'Manage timetable' => 'Gestionar horario', - 'Overtime timetable' => 'Horario de tiempo extra', - 'Time off timetable' => 'Horario de tiempo libre', - 'Timetable' => 'Horario', - 'Work timetable' => 'Horario de trabajo', - 'Week timetable' => 'Horario semanal', - 'Day timetable' => 'Horario diario', - 'From' => 'De', - 'To' => 'Para', - 'Time slot created successfully.' => 'Intervalo de tiempo creado correctamente.', - 'Unable to save this time slot.' => 'No pude grabar este intervalo de tiempo.', - 'Time slot removed successfully.' => 'Intervalo de tiempo quitado correctamente.', - 'Unable to remove this time slot.' => 'No pude quitar este intervalo de tiempo.', - 'Do you really want to remove this time slot?' => '¿Realmente quiere quitar este intervalo de tiempo?', - 'Remove time slot' => 'Quitar intervalo de tiempo', - 'Add new time slot' => 'Añadir nuevo intervalo de tiempo', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Este horario se usa cuando se marca la casilla "todos los días" para calendario de tiempo libre y horas extras.', 'Files' => 'Ficheros', 'Images' => 'Imágenes', 'Private project' => 'Proyecto privado', - 'Amount' => 'Cantidad', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', - 'Budget' => 'Presupuesto', - 'Budget line' => 'Línea de presupuesto', - 'Budget line removed successfully.' => 'Línea de presupuesto quitada con éxito', - 'Budget lines' => 'Líneas de presupuesto', 'CAD - Canadian Dollar' => 'CAD - Dólar canadiense', 'CHF - Swiss Francs' => 'CHF - Francos suizos', - 'Cost' => 'Costo', - 'Cost breakdown' => 'Desglose de costes', 'Custom Stylesheet' => 'Hoja de estilo Personalizada', 'download' => 'descargar', - 'Do you really want to remove this budget line?' => '¿Realmente quiere quitar esta línea de presupuesto?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Gastos', 'GBP - British Pound' => 'GBP - Libra británica', 'INR - Indian Rupee' => 'INR - Rupias indúes', 'JPY - Japanese Yen' => 'JPY - Yen japonés', - 'New budget line' => 'Nueva línea de presupuesto', 'NZD - New Zealand Dollar' => 'NZD - Dóloar neocelandés', - 'Remove a budget line' => 'Quitar una línea de presupuesto', - 'Remove budget line' => 'Quitar línea de presupuesto', 'RSD - Serbian dinar' => 'RSD - Dinar serbio', - 'The budget line have been created successfully.' => 'Se ha creado la línea de presupuesto con éxito.', - 'Unable to create the budget line.' => 'No pude crear la línea de presupuesto.', - 'Unable to remove this budget line.' => 'No pude quitar esta línea de presupuesto.', 'USD - US Dollar' => 'USD - Dólar Estadounidense', - 'Remaining' => 'Restante', 'Destination column' => 'Columna destino', 'Move the task to another column when assigned to a user' => 'Mover la tarea a otra columna al asignarse al usuario', 'Move the task to another column when assignee is cleared' => 'Mover la tarea a otra columna al quitar el concesionario', 'Source column' => 'Columna fuente', - 'Show subtask estimates (forecast of future work)' => 'Mostrar estimaciones para la subtarea (pronóstico de trabajo futuro)', 'Transitions' => 'Transiciones', 'Executer' => 'Ejecutor', 'Time spent in the column' => 'Tiempo transcurrido en la columna', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Cambio', 'Change reference currency' => 'Cambiar moneda de referencia', 'Add a new currency rate' => 'Añadir nuevo cambio de moneda', - 'Currency rates are used to calculate project budget.' => 'Se usan los cambios de moneda para calcular el presupuesto del proyecto.', 'Reference currency' => 'Moneda de referencia', 'The currency rate have been added successfully.' => 'Se ha añadido el cambio de moneda con éxito', 'Unable to add this currency rate.' => 'No pude añadir este cambio de moneda.', @@ -878,9 +826,6 @@ return array( '%s moved the task #%d to the first swimlane' => '%s movió la tarea #%d a la primera calle', '%s moved the task #%d to the swimlane "%s"' => '%s movió la tarea #%d a la calle "%s"', 'Swimlane' => 'Calle', - 'Budget overview' => 'Resumen del Presupuesto', - 'Type' => 'Tipo', - 'There is not enough data to show something.' => 'No hay datos suficientes como para mostrar algo.', 'Gravatar' => 'Gravatar', 'Hipchat' => 'Hipchat', 'Slack' => 'Desatendida', @@ -1040,31 +985,75 @@ return array( 'Shared project' => 'Proyecto compartido', 'Project managers' => 'Administradores de proyecto', 'Project members' => 'Miembros de proyecto', - // 'Gantt chart for all projects' => '', - // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', - // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', - // 'Start date: %s' => '', - // 'End date: %s' => '', - // 'Link type' => '', - // 'Change task color when using a specific task link' => '', - // 'Task link creation or modification' => '', - // 'Login with my Gitlab Account' => '', - // 'Milestone' => '', - // 'Gitlab Authentication' => '', - // 'Help on Gitlab authentication' => '', - // 'Gitlab Id' => '', - // 'Gitlab Account' => '', - // 'Link my Gitlab Account' => '', - // 'Unlink my Gitlab Account' => '', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Gantt chart for all projects' => 'Diagrama de Gantt para todos los proyectos', + 'Projects list' => 'Lista de proyectos', + 'Gantt chart for this project' => 'Diagrama de Gantt para este proyecto', + 'Project board' => 'Tablero del proyecto', + 'End date:' => 'Fecha final', + 'There is no start date or end date for this project.' => 'No existe fecha de inicio o de fin para este proyecto.', + 'Projects Gantt chart' => 'Diagramas de Gantt de los proyectos', + 'Start date: %s' => 'Fecha inicial: %s', + 'End date: %s' => 'Fecha final: %s', + 'Link type' => 'Tipo de enlace', + 'Change task color when using a specific task link' => 'Cambiar colo de la tarea al usar un enlace específico a tarea', + 'Task link creation or modification' => 'Creación o modificación de enlace a tarea', + 'Login with my Gitlab Account' => 'Ingresar usando mi Cuenta en Gitlab', + 'Milestone' => 'Hito', + 'Gitlab Authentication' => 'Autenticación Gitlab', + 'Help on Gitlab authentication' => 'Ayuda con autenticación Gitlab', + 'Gitlab Id' => 'Id de Gitlab', + 'Gitlab Account' => 'Cuenta de Gitlab', + 'Link my Gitlab Account' => 'Enlazar con mi Cuenta en Gitlab', + 'Unlink my Gitlab Account' => 'Desenlazar con mi Cuenta en Gitlab', + 'Documentation: %s' => 'Documentación: %s', + 'Switch to the Gantt chart view' => 'Conmutar a vista de diagrama de Gantt', + 'Reset the search/filter box' => 'Limpiar la caja del filtro de búsqueda', + 'Documentation' => 'Documentación', + 'Table of contents' => 'Tabla de contenido', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Ayuda con permisos del proyecto', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/fi_FI/translations.php b/sources/app/Locale/fi_FI/translations.php index d8c749a..71844cc 100644 --- a/sources/app/Locale/fi_FI/translations.php +++ b/sources/app/Locale/fi_FI/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Etä', 'Enabled' => 'Käytössä', 'Disabled' => 'Pois käytöstä', - 'Google account linked' => 'Google-tili liitetty', - 'Github account linked' => 'Github-tili liitetty', 'Username:' => 'Käyttäjänimi:', 'Name:' => 'Nimi:', 'Email:' => 'Sähköpostiosoite:', @@ -667,75 +665,26 @@ return array( // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', // 'No results match:' => '', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - // 'Hourly rates' => '', - // 'Hourly rate' => '', // 'Currency' => '', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - // 'Manage timetable' => '', - // 'Overtime timetable' => '', - // 'Time off timetable' => '', - // 'Timetable' => '', - // 'Work timetable' => '', - // 'Week timetable' => '', - // 'Day timetable' => '', - // 'From' => '', - // 'To' => '', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', // 'Files' => '', // 'Images' => '', // 'Private project' => '', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - // 'Budget' => '', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', // 'download' => '', - // 'Do you really want to remove this budget line?' => '', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', // 'Move the task to another column when assignee is cleared' => '', // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/fr_FR/translations.php b/sources/app/Locale/fr_FR/translations.php index 0c95c7e..ec32ecb 100644 --- a/sources/app/Locale/fr_FR/translations.php +++ b/sources/app/Locale/fr_FR/translations.php @@ -75,19 +75,19 @@ return array( 'Change columns' => 'Changer les colonnes', 'Add a new column' => 'Ajouter une nouvelle colonne', 'Title' => 'Titre', - 'Nobody assigned' => 'Personne assigné', + 'Nobody assigned' => 'Personne assignée', 'Assigned to %s' => 'Assigné à %s', 'Remove a column' => 'Supprimer une colonne', 'Remove a column from a board' => 'Supprimer une colonne d\'un tableau', 'Unable to remove this column.' => 'Impossible de supprimer cette colonne.', 'Do you really want to remove this column: "%s"?' => 'Voulez vraiment supprimer cette colonne : « %s » ?', - 'This action will REMOVE ALL TASKS associated to this column!' => 'Cette action va supprimer toutes les tâches associées à cette colonne !', + 'This action will REMOVE ALL TASKS associated to this column!' => 'Cette action va supprimer toutes les tâches associées à cette colonne !', 'Settings' => 'Préférences', 'Application settings' => 'Paramètres de l\'application', 'Language' => 'Langue', 'Webhook token:' => 'Jeton de securité pour les webhooks :', 'API token:' => 'Jeton de securité pour l\'API :', - 'Database size:' => 'Taille de la base de données :', + 'Database size:' => 'Taille de la base de données :', 'Download the database' => 'Télécharger la base de données', 'Optimize the database' => 'Optimiser la base de données', '(VACUUM command)' => '(Commande VACUUM)', @@ -96,15 +96,15 @@ return array( 'Edit a task' => 'Modifier une tâche', 'Column' => 'Colonne', 'Color' => 'Couleur', - 'Assignee' => 'Personne assignée', + 'Assignee' => 'Personne assigné', 'Create another task' => 'Créer une autre tâche', 'New task' => 'Nouvelle tâche', 'Open a task' => 'Ouvrir une tâche', - 'Do you really want to open this task: "%s"?' => 'Voulez-vous vraiment ouvrir cette tâche : « %s » ?', + 'Do you really want to open this task: "%s"?' => 'Voulez-vous vraiment ouvrir cette tâche : « %s » ?', 'Back to the board' => 'Retour au tableau', 'Created on %B %e, %Y at %k:%M %p' => 'Créé le %d/%m/%Y à %H:%M', 'There is nobody assigned' => 'Il n\'y a personne d\'assigné à cette tâche', - 'Column on the board:' => 'Colonne sur le tableau : ', + 'Column on the board:' => 'Colonne sur le tableau : ', 'Status is open' => 'État ouvert', 'Status is closed' => 'État fermé', 'Close this task' => 'Fermer cette tâche', @@ -142,7 +142,7 @@ return array( 'Unable to open this task.' => 'Impossible d\'ouvrir cette tâche.', 'Task opened successfully.' => 'Tâche ouverte avec succès.', 'Unable to close this task.' => 'Impossible de fermer cette tâche.', - 'Task closed successfully.' => 'Tâche fermé avec succès.', + 'Task closed successfully.' => 'Tâche fermée avec succès.', 'Unable to update your task.' => 'Impossible de modifier cette tâche.', 'Task updated successfully.' => 'Tâche mise à jour avec succès.', 'Unable to create your task.' => 'Impossible de créer cette tâche.', @@ -167,11 +167,11 @@ return array( '%d closed tasks' => '%d tâches terminées', 'No task for this project' => 'Aucune tâche pour ce projet', 'Public link' => 'Lien public', - 'There is no column in your project!' => 'Il n\'y a aucune colonne dans votre projet !', + 'There is no column in your project!' => 'Il n\'y a aucune colonne dans votre projet !', 'Change assignee' => 'Changer la personne assignée', 'Change assignee for the task "%s"' => 'Changer la personne assignée pour la tâche « %s »', 'Timezone' => 'Fuseau horaire', - 'Sorry, I didn\'t find this information in my database!' => 'Désolé, je n\'ai pas trouvé cette information dans ma base de données !', + 'Sorry, I didn\'t find this information in my database!' => 'Désolé, je n\'ai pas trouvé cette information dans ma base de données !', 'Page not found' => 'Page introuvable', 'Complexity' => 'Complexité', 'Task limit' => 'Tâches Max.', @@ -197,7 +197,7 @@ return array( '%B %e, %Y' => '%d %B %Y', '%b %e, %Y' => '%d/%m/%Y', 'Automatic actions' => 'Actions automatisées', - 'Your automatic action have been created successfully.' => 'Votre action automatisée a été ajouté avec succès.', + 'Your automatic action have been created successfully.' => 'Votre action automatisée a été ajoutée avec succès.', 'Unable to create your automatic action.' => 'Impossible de créer votre action automatisée.', 'Remove an action' => 'Supprimer une action', 'Unable to remove this action.' => 'Impossible de supprimer cette action', @@ -210,7 +210,7 @@ return array( 'Action parameters' => 'Paramètres de l\'action', 'Action' => 'Action', 'Event' => 'Événement', - 'When the selected event occurs execute the corresponding action.' => 'Lorsque l\'événement sélectionné se déclenche, executer l\'action correspondante.', + 'When the selected event occurs execute the corresponding action.' => 'Lorsque l\'événement sélectionné se déclenche, exécuter l\'action correspondante.', 'Next step' => 'Étape suivante', 'Define action parameters' => 'Définition des paramètres de l\'action', 'Save this action' => 'Sauvegarder cette action', @@ -237,10 +237,10 @@ return array( 'Comment removed successfully.' => 'Commentaire supprimé avec succès.', 'Unable to remove this comment.' => 'Impossible de supprimer ce commentaire.', 'Do you really want to remove this comment?' => 'Voulez-vous vraiment supprimer ce commentaire ?', - 'Only administrators or the creator of the comment can access to this page.' => 'Uniquement les administrateurs ou le créateur du commentaire peuvent accéder à cette page.', + 'Only administrators or the creator of the comment can access to this page.' => 'Seuls les administrateurs ou le créateur du commentaire peuvent accéder à cette page.', 'Current password for the user "%s"' => 'Mot de passe actuel pour l\'utilisateur « %s »', 'The current password is required' => 'Le mot de passe actuel est obligatoire', - 'Wrong password' => 'Mauvais mot de passe', + 'Wrong password' => 'Mot de passe invalide', 'Unknown' => 'Inconnu', 'Last logins' => 'Dernières connexions', 'Login date' => 'Date de connexion', @@ -263,10 +263,10 @@ return array( '%d comments' => '%d commentaires', '%d comment' => '%d commentaire', 'Email address invalid' => 'Adresse email invalide', - 'Your external account is not linked anymore to your profile.' => 'Votre compte externe n\'est plus relié à votre profile.', + 'Your external account is not linked anymore to your profile.' => 'Votre compte externe n\'est plus relié à votre profil.', 'Unable to unlink your external account.' => 'Impossible de supprimer votre compte externe.', - 'External authentication failed' => 'Authentification externe échouée', - 'Your external account is linked to your profile successfully.' => 'Votre compte externe est désormais lié à votre profile.', + 'External authentication failed' => 'L’authentification externe a échoué', + 'Your external account is linked to your profile successfully.' => 'Votre compte externe est désormais lié à votre profil.', 'Email' => 'Email', 'Link my Google Account' => 'Lier mon compte Google', 'Unlink my Google Account' => 'Ne plus utiliser mon compte Google', @@ -283,7 +283,7 @@ return array( 'Category:' => 'Catégorie :', 'Categories' => 'Catégories', 'Category not found.' => 'Catégorie introuvable', - 'Your category have been created successfully.' => 'Votre catégorie a été créé avec succès.', + 'Your category have been created successfully.' => 'Votre catégorie a été créée avec succès.', 'Unable to create your category.' => 'Impossible de créer votre catégorie.', 'Your category have been updated successfully.' => 'Votre catégorie a été mise à jour avec succès.', 'Unable to update your category.' => 'Impossible de mettre à jour votre catégorie.', @@ -311,13 +311,13 @@ return array( 'Summary' => 'Résumé', 'Time tracking' => 'Suivi du temps', 'Estimate:' => 'Estimation :', - 'Spent:' => 'Passé :', + 'Spent:' => 'Passé :', 'Do you really want to remove this sub-task?' => 'Voulez-vous vraiment supprimer cette sous-tâche ?', - 'Remaining:' => 'Restant :', + 'Remaining:' => 'Restant :', 'hours' => 'heures', 'spent' => 'passé', 'estimated' => 'estimé', - 'Sub-Tasks' => 'Sous-Tâches', + 'Sub-Tasks' => 'Sous-tâches', 'Add a sub-task' => 'Ajouter une sous-tâche', 'Original estimate' => 'Estimation originale', 'Create another sub-task' => 'Créer une autre sous-tâche', @@ -332,8 +332,8 @@ return array( 'Sub-task updated successfully.' => 'Sous-tâche mise à jour avec succès.', 'Unable to update your sub-task.' => 'Impossible de mettre à jour votre sous-tâche.', 'Unable to create your sub-task.' => 'Impossible de créer votre sous-tâche.', - 'Sub-task added successfully.' => 'Sous-tâche ajouté avec succès.', - 'Maximum size: ' => 'Taille maximum : ', + 'Sub-task added successfully.' => 'Sous-tâche ajoutée avec succès.', + 'Maximum size: ' => 'Taille maximum : ', 'Unable to upload the file.' => 'Impossible de transférer le fichier.', 'Display another project' => 'Afficher un autre projet', 'Login with my Github Account' => 'Se connecter avec mon compte Github', @@ -397,8 +397,6 @@ return array( 'Remote' => 'Distant', 'Enabled' => 'Activé', 'Disabled' => 'Désactivé', - 'Google account linked' => 'Compte Google attaché', - 'Github account linked' => 'Compte Github attaché', 'Username:' => 'Nom d\'utilisateur :', 'Name:' => 'Nom :', 'Email:' => 'Email :', @@ -447,10 +445,10 @@ return array( '%s moved the task #%d to the position %d in the column "%s"' => '%s a déplacé la tâche n°%d à la position n°%d dans la colonne « %s »', 'Activity' => 'Activité', 'Default values are "%s"' => 'Les valeurs par défaut sont « %s »', - 'Default columns for new projects (Comma-separated)' => 'Colonnes par défaut pour les nouveaux projets (séparé par des virgules)', - 'Task assignee change' => 'Modification de la personne assignée sur une tâche', - '%s change the assignee of the task #%d to %s' => '%s a changé la personne assignée sur la tâche n˚%d pour %s', - '%s changed the assignee of the task %s to %s' => '%s a changé la personne assignée sur la tâche %s pour %s', + 'Default columns for new projects (Comma-separated)' => 'Colonnes par défaut pour les nouveaux projets (séparation par des virgules)', + 'Task assignee change' => 'Modification de la personne assignée à une tâche', + '%s change the assignee of the task #%d to %s' => '%s a changé la personne assignée à la tâche n˚%d pour %s', + '%s changed the assignee of the task %s to %s' => '%s a changé la personne assignée à la tâche %s pour %s', 'New password for the user "%s"' => 'Nouveau mot de passe pour l\'utilisateur « %s »', 'Choose an event' => 'Choisir un événement', 'Github commit received' => 'Commit reçu via Github', @@ -466,7 +464,7 @@ return array( 'Reference: %s' => 'Référence : %s', 'Label' => 'Libellé', 'Database' => 'Base de données', - 'About' => 'A propos', + 'About' => 'À propos', 'Database driver:' => 'Type de base de données :', 'Board settings' => 'Paramètres du tableau', 'URL and token' => 'URL et jeton de sécurité', @@ -529,12 +527,12 @@ return array( 'Previous' => 'Précédent', 'The id must be an integer' => 'L\'id doit être un entier', 'The project id must be an integer' => 'L\'id du projet doit être un entier', - 'The status must be an integer' => 'Le status doit être un entier', + 'The status must be an integer' => 'Le statut doit être un entier', 'The subtask id is required' => 'L\'id de la sous-tâche est obligatoire', - 'The subtask id must be an integer' => 'L\'id de la sous-tâche doit être en entier', + 'The subtask id must be an integer' => 'L\'id de la sous-tâche doit être un entier', 'The task id is required' => 'L\'id de la tâche est obligatoire', - 'The task id must be an integer' => 'L\'id de la tâche doit être en entier', - 'The user id must be an integer' => 'L\'id de l\'utilisateur doit être en entier', + 'The task id must be an integer' => 'L\'id de la tâche doit être un entier', + 'The user id must be an integer' => 'L\'id de l\'utilisateur doit être un entier', 'This value is required' => 'Cette valeur est obligatoire', 'This value must be numeric' => 'Cette valeur doit être numérique', 'Unable to create this task.' => 'Impossible de créer cette tâche', @@ -552,7 +550,7 @@ return array( 'Add a new swimlane' => 'Ajouter une nouvelle swimlane', 'Change default swimlane' => 'Modifier la swimlane par défaut', 'Default swimlane' => 'Swimlane par défaut', - 'Do you really want to remove this swimlane: "%s"?' => 'Voulez-vous vraiment supprimer cette swimlane : « %s » ?', + 'Do you really want to remove this swimlane: "%s"?' => 'Voulez-vous vraiment supprimer cette swimlane : « %s » ?', 'Inactive swimlanes' => 'Swimlanes inactives', 'Set project manager' => 'Mettre chef de projet', 'Set project member' => 'Mettre membre du projet', @@ -570,7 +568,7 @@ return array( 'Unable to update this swimlane.' => 'Impossible de mettre à jour cette swimlane.', 'Your swimlane have been created successfully.' => 'Votre swimlane a été créée avec succès.', 'Example: "Bug, Feature Request, Improvement"' => 'Exemple: « Incident, Demande de fonctionnalité, Amélioration »', - 'Default categories for new projects (Comma-separated)' => 'Catégories par défaut pour les nouveaux projets (séparé par des virgules)', + 'Default categories for new projects (Comma-separated)' => 'Catégories par défaut pour les nouveaux projets (séparation par des virgules)', 'Gitlab commit received' => 'Commit reçu via Gitlab', 'Gitlab issue opened' => 'Ouverture d\'un ticket sur Gitlab', 'Gitlab issue closed' => 'Fermeture d\'un ticket sur Gitlab', @@ -604,25 +602,25 @@ return array( 'User dashboard' => 'Tableau de bord de l\'utilisateur', 'Allow only one subtask in progress at the same time for a user' => 'Autoriser une seule sous-tâche en progrès en même temps pour un utilisateur', 'Edit column "%s"' => 'Modifier la colonne « %s »', - 'Select the new status of the subtask: "%s"' => 'Selectionnez le nouveau statut de la sous-tâche : « %s »', + 'Select the new status of the subtask: "%s"' => 'Selectionnez le nouveau statut de la sous-tâche : « %s »', 'Subtask timesheet' => 'Feuille de temps des sous-tâches', 'There is nothing to show.' => 'Il n\'y a rien à montrer.', 'Time Tracking' => 'Feuille de temps', 'You already have one subtask in progress' => 'Vous avez déjà une sous-tâche en progrès', - 'Which parts of the project do you want to duplicate?' => 'Quelles parties du projet voulez-vous dupliquer ?', - 'Disallow login form' => 'Interdir le formulaire d\'authentification', + 'Which parts of the project do you want to duplicate?' => 'Quelles parties du projet voulez-vous dupliquer ?', + 'Disallow login form' => 'Interdire le formulaire d\'authentification', 'Bitbucket commit received' => 'Commit reçu via Bitbucket', 'Bitbucket webhooks' => 'Webhook Bitbucket', 'Help on Bitbucket webhooks' => 'Aide sur les webhooks Bitbucket', 'Start' => 'Début', 'End' => 'Fin', - 'Task age in days' => 'Age de la tâche en jours', + 'Task age in days' => 'Âge de la tâche en jours', 'Days in this column' => 'Jours dans cette colonne', '%dd' => '%dj', 'Add a link' => 'Ajouter un lien', 'Add a new link' => 'Ajouter un nouveau lien', - 'Do you really want to remove this link: "%s"?' => 'Voulez-vous vraiment supprimer ce lien : « %s » ?', - 'Do you really want to remove this link with task #%d?' => 'Voulez-vous vraiment supprimer ce lien avec la tâche n°%d ?', + 'Do you really want to remove this link: "%s"?' => 'Voulez-vous vraiment supprimer ce lien : « %s » ?', + 'Do you really want to remove this link with task #%d?' => 'Voulez-vous vraiment supprimer ce lien avec la tâche n°%d ?', 'Field required' => 'Champ obligatoire', 'Link added successfully.' => 'Lien créé avec succès.', 'Link updated successfully.' => 'Lien mis à jour avec succès.', @@ -658,7 +656,7 @@ return array( 'Expand tasks' => 'Déplier les tâches', 'Collapse tasks' => 'Replier les tâches', 'Expand/collapse tasks' => 'Plier/déplier les tâches', - 'Close dialog box' => 'Fermer une boite de dialogue', + 'Close dialog box' => 'Fermer une boîte de dialogue', 'Submit a form' => 'Enregistrer un formulaire', 'Board view' => 'Page du tableau', 'Keyboard shortcuts' => 'Raccourcis clavier', @@ -669,75 +667,26 @@ return array( 'Horizontal scrolling' => 'Défilement horizontal', 'Compact/wide view' => 'Basculer entre la vue compacte et étendue', 'No results match:' => 'Aucun résultat :', - 'Remove hourly rate' => 'Supprimer un taux horaire', - 'Do you really want to remove this hourly rate?' => 'Voulez-vous vraiment supprimer ce taux horaire ?', - 'Hourly rates' => 'Taux horaires', - 'Hourly rate' => 'Taux horaire', 'Currency' => 'Devise', - 'Effective date' => 'Date d\'effet', - 'Add new rate' => 'Ajouter un nouveau taux horaire', - 'Rate removed successfully.' => 'Taux horaire supprimé avec succès.', - 'Unable to remove this rate.' => 'Impossible de supprimer ce taux horaire.', - 'Unable to save the hourly rate.' => 'Impossible de sauvegarder ce taux horaire.', - 'Hourly rate created successfully.' => 'Taux horaire créé avec succès.', - 'Start time' => 'Date de début', - 'End time' => 'Date de fin', - 'Comment' => 'Commentaire', - 'All day' => 'Toute la journée', - 'Day' => 'Jour', - 'Manage timetable' => 'Gérer les horaires', - 'Overtime timetable' => 'Heures supplémentaires', - 'Time off timetable' => 'Heures d\'absences', - 'Timetable' => 'Horaires', - 'Work timetable' => 'Horaires travaillés', - 'Week timetable' => 'Horaires de la semaine', - 'Day timetable' => 'Horaire d\'une journée', - 'From' => 'Depuis', - 'To' => 'À', - 'Time slot created successfully.' => 'Créneau horaire créé avec succès.', - 'Unable to save this time slot.' => 'Impossible de sauvegarder ce créneau horaire.', - 'Time slot removed successfully.' => 'Créneau horaire supprimé avec succès.', - 'Unable to remove this time slot.' => 'Impossible de supprimer ce créneau horaire.', - 'Do you really want to remove this time slot?' => 'Voulez-vous vraiment supprimer ce créneau horaire ?', - 'Remove time slot' => 'Supprimer un créneau horaire', - 'Add new time slot' => 'Ajouter un créneau horaire', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Ces horaires sont utilisés lorsque la case « Toute la journée » est cochée pour les heures d\'absences ou supplémentaires programmées.', 'Files' => 'Fichiers', 'Images' => 'Images', 'Private project' => 'Projet privé', - 'Amount' => 'Montant', 'AUD - Australian Dollar' => 'AUD - Dollar australien', - 'Budget' => 'Budget', - 'Budget line' => 'Ligne budgétaire', - 'Budget line removed successfully.' => 'Ligne budgétaire supprimée avec succès.', - 'Budget lines' => 'Lignes budgétaire', 'CAD - Canadian Dollar' => 'CAD - Dollar canadien', 'CHF - Swiss Francs' => 'CHF - Franc suisse', - 'Cost' => 'Coût', - 'Cost breakdown' => 'Détail des coûts', 'Custom Stylesheet' => 'Feuille de style personalisée', 'download' => 'télécharger', - 'Do you really want to remove this budget line?' => 'Voulez-vous vraiment supprimer cette ligne budgétaire ?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Dépenses', 'GBP - British Pound' => 'GBP - Livre sterling', 'INR - Indian Rupee' => 'INR - Roupie indienne', 'JPY - Japanese Yen' => 'JPY - Yen', - 'New budget line' => 'Nouvelle ligne budgétaire', 'NZD - New Zealand Dollar' => 'NZD - Dollar néo-zélandais', - 'Remove a budget line' => 'Supprimer une ligne budgétaire', - 'Remove budget line' => 'Supprimer une ligne budgétaire', 'RSD - Serbian dinar' => 'RSD - Dinar serbe', - 'The budget line have been created successfully.' => 'La ligne de budgétaire a été créée avec succès.', - 'Unable to create the budget line.' => 'Impossible de créer cette ligne budgétaire.', - 'Unable to remove this budget line.' => 'Impossible de supprimer cette ligne budgétaire.', 'USD - US Dollar' => 'USD - Dollar américain', - 'Remaining' => 'Restant', 'Destination column' => 'Colonne de destination', 'Move the task to another column when assigned to a user' => 'Déplacer la tâche dans une autre colonne lorsque celle-ci est assignée à quelqu\'un', 'Move the task to another column when assignee is cleared' => 'Déplacer la tâche dans une autre colonne lorsque celle-ci n\'est plus assignée', 'Source column' => 'Colonne d\'origine', - 'Show subtask estimates (forecast of future work)' => 'Afficher l\'estimation des sous-tâches (prévision du travail à venir)', 'Transitions' => 'Transitions', 'Executer' => 'Exécutant', 'Time spent in the column' => 'Temps passé dans la colonne', @@ -748,7 +697,6 @@ return array( 'Rate' => 'Taux', 'Change reference currency' => 'Changer la monnaie de référence', 'Add a new currency rate' => 'Ajouter un nouveau taux pour une devise', - 'Currency rates are used to calculate project budget.' => 'Le cours des devises est utilisé pour calculer le budget des projets.', 'Reference currency' => 'Devise de référence', 'The currency rate have been added successfully.' => 'Le taux de change a été ajouté avec succès.', 'Unable to add this currency rate.' => 'Impossible d\'ajouter ce taux de change', @@ -769,8 +717,8 @@ return array( 'Code' => 'Code', 'Two factor authentication' => 'Authentification à deux-facteurs', 'Enable/disable two factor authentication' => 'Activer/désactiver l\'authentification à deux-facteurs', - 'This QR code contains the key URI: ' => 'Ce code QR contient l\'url de la clé : ', - 'Save the secret key in your TOTP software (by example Google Authenticator or FreeOTP).' => 'Sauvegardez cette clé secrete dans votre logiciel TOTP (par exemple Google Authenticator ou FreeOTP).', + 'This QR code contains the key URI: ' => 'Ce code QR contient l\'url de la clé : ', + 'Save the secret key in your TOTP software (by example Google Authenticator or FreeOTP).' => 'Sauvegardez cette clé secrète dans votre logiciel TOTP (par exemple Google Authenticator ou FreeOTP).', 'Check my code' => 'Vérifier mon code', 'Secret key: ' => 'Clé secrète : ', 'Test your device' => 'Testez votre appareil', @@ -796,9 +744,9 @@ return array( 'Sendgrid (incoming emails)' => 'Sendgrid (emails entrants)', 'Help on Sendgrid integration' => 'Aide sur l\'intégration avec Sendgrid', 'Disable two factor authentication' => 'Désactiver l\'authentification à deux facteurs', - 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Voulez-vous vraiment désactiver l\'authentification à deux facteurs pour cet utilisateur : « %s » ?', + 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Voulez-vous vraiment désactiver l\'authentification à deux facteurs pour cet utilisateur : « %s » ?', 'Edit link' => 'Modifier un lien', - 'Start to type task title...' => 'Entrez le titre de la tâche...', + 'Start to type task title...' => 'Entrez le titre de la tâche…', 'A task cannot be linked to itself' => 'Une tâche ne peut être liée à elle-même', 'The exact same link already exists' => 'Un lien identique existe déjà', 'Recurrent task is scheduled to be generated' => 'La tâche récurrente est programmée pour être créée', @@ -814,17 +762,17 @@ return array( 'Timeframe to calculate new due date' => 'Échelle de temps pour calculer la nouvelle date d\'échéance', 'Base date to calculate new due date' => 'Date à utiliser pour calculer la nouvelle date d\'échéance', 'Action date' => 'Date de l\'action', - 'Base date to calculate new due date: ' => 'Date utilisée pour calculer la nouvelle date d\'échéance : ', - 'This task has created this child task: ' => 'Cette tâche a créée la tâche enfant : ', + 'Base date to calculate new due date: ' => 'Date utilisée pour calculer la nouvelle date d\'échéance : ', + 'This task has created this child task: ' => 'Cette tâche a créée la tâche enfant : ', 'Day(s)' => 'Jour(s)', 'Existing due date' => 'Date d\'échéance existante', - 'Factor to calculate new due date: ' => 'Facteur pour calculer la nouvelle date d\'échéance : ', + 'Factor to calculate new due date: ' => 'Facteur pour calculer la nouvelle date d\'échéance : ', 'Month(s)' => 'Mois', 'Recurrence' => 'Récurrence', - 'This task has been created by: ' => 'Cette tâche a été créée par :', - 'Recurrent task has been generated:' => 'Une tâche récurrente a été générée :', - 'Timeframe to calculate new due date: ' => 'Échelle de temps pour calculer la nouvelle date d\'échéance : ', - 'Trigger to generate recurrent task: ' => 'Déclencheur pour générer la tâche récurrente : ', + 'This task has been created by: ' => 'Cette tâche a été créée par :', + 'Recurrent task has been generated:' => 'Une tâche récurrente a été générée :', + 'Timeframe to calculate new due date: ' => 'Échelle de temps pour calculer la nouvelle date d\'échéance : ', + 'Trigger to generate recurrent task: ' => 'Déclencheur pour générer la tâche récurrente : ', 'When task is closed' => 'Lorsque la tâche est fermée', 'When task is moved from first column' => 'Lorsque la tâche est déplacée en dehors de la première colonne', 'When task is moved to last column' => 'Lorsque la tâche est déplacée dans la dernière colonne', @@ -836,7 +784,7 @@ return array( 'Jabber nickname' => 'Pseudonyme Jabber', 'Multi-user chat room' => 'Salon de discussion multi-utilisateurs', 'Help on Jabber integration' => 'Aide sur l\'intégration avec Jabber', - 'The server address must use this format: "tcp://hostname:5222"' => 'L\'adresse du serveur doit utiliser le format suivant : « tcp://hostname:5222 »', + 'The server address must use this format: "tcp://hostname:5222"' => 'L\'adresse du serveur doit utiliser le format suivant : « tcp://hostname:5222 »', 'Calendar settings' => 'Paramètres du calendrier', 'Project calendar view' => 'Vue en mode projet du calendrier', 'Project settings' => 'Paramètres du projet', @@ -849,7 +797,7 @@ return array( 'iCal feed' => 'Abonnement iCal', 'Preferences' => 'Préférences', 'Security' => 'Sécurité', - 'Two factor authentication disabled' => 'Authentification à deux facteurs désactivé', + 'Two factor authentication disabled' => 'Authentification à deux facteurs désactivée', 'Two factor authentication enabled' => 'Authentification à deux facteurs activée', 'Unable to update this user.' => 'Impossible de mettre à jour cet utilisateur.', 'There is no user management for private projects.' => 'Il n\'y a pas de gestion d\'utilisateurs pour les projets privés.', @@ -862,8 +810,8 @@ return array( 'Commit made by @%s on Github' => 'Commit fait par @%s sur Github', 'By @%s on Github' => 'Par @%s sur Github', 'Commit made by @%s on Gitlab' => 'Commit fait par @%s sur Gitlab', - 'Add a comment log when moving the task between columns' => 'Ajouter un commentaire d\'information lorsque une tâche est déplacée dans une autre colonnes', - 'Move the task to another column when the category is changed' => 'Déplacer une tâche vers une autre colonne lorsque la catégorie a changée', + 'Add a comment log when moving the task between columns' => 'Ajouter un commentaire d\'information lorsque une tâche est déplacée dans une autre colonne', + 'Move the task to another column when the category is changed' => 'Déplacer une tâche vers une autre colonne lorsque la catégorie a changé', 'Send a task by email to someone' => 'Envoyer une tâche par email à quelqu\'un', 'Reopen a task' => 'Rouvrir une tâche', 'Bitbucket issue opened' => 'Ticket Bitbucket ouvert', @@ -880,16 +828,13 @@ return array( '%s moved the task #%d to the first swimlane' => '%s a déplacé la tâche n°%d dans la première swimlane', '%s moved the task #%d to the swimlane "%s"' => '%s a déplacé la tâche n°%d dans la swimlane « %s »', 'Swimlane' => 'Swimlane', - 'Budget overview' => 'Vue d\'ensemble du budget', - 'Type' => 'Type', - 'There is not enough data to show something.' => 'Il n\'y a pas assez de données pour montrer quelque chose.', 'Gravatar' => 'Gravatar', 'Hipchat' => 'Hipchat', 'Slack' => 'Slack', '%s moved the task %s to the first swimlane' => '%s a déplacé la tâche %s dans la première swimlane', - '%s moved the task %s to the swimlane "%s"' => '%s a déplacé la tâche %s dans la swimlane « %s »', - 'This report contains all subtasks information for the given date range.' => 'Ce rapport contient les informations de toutes les sous-tâches pour la période selectionnée.', - 'This report contains all tasks information for the given date range.' => 'Ce rapport contient les informations de toutes les tâches pour la période selectionnée.', + '%s moved the task %s to the swimlane "%s"' => '%s a déplacé la tâche %s dans la swimlane « %s »', + 'This report contains all subtasks information for the given date range.' => 'Ce rapport contient les informations de toutes les sous-tâches pour la période sélectionnée.', + 'This report contains all tasks information for the given date range.' => 'Ce rapport contient les informations de toutes les tâches pour la période sélectionnée.', 'Project activities for %s' => 'Activité des projets pour « %s »', 'view the board on Kanboard' => 'voir le tableau sur Kanboard', 'The task have been moved to the first swimlane' => 'La tâche a été déplacée dans la première swimlane', @@ -907,15 +852,15 @@ return array( 'Recurrence settings have been modified' => 'Les réglages de la récurrence ont été modifiés', 'Time spent changed: %sh' => 'Le temps passé a été changé : %sh', 'Time estimated changed: %sh' => 'Le temps estimé a été changé : %sh', - 'The field "%s" have been updated' => 'Le champ « %s » a été mis à jour', + 'The field "%s" have been updated' => 'Le champ « %s » a été mis à jour', 'The description have been modified' => 'La description a été modifiée', - 'Do you really want to close the task "%s" as well as all subtasks?' => 'Voulez-vous vraiment fermer la tâche « %s » ainsi que toutes ses sous-tâches ?', + 'Do you really want to close the task "%s" as well as all subtasks?' => 'Voulez-vous vraiment fermer la tâche « %s » ainsi que toutes ses sous-tâches ?', 'Swimlane: %s' => 'Swimlane : %s', 'I want to receive notifications for:' => 'Je veux reçevoir les notifications pour :', 'All tasks' => 'Toutes les Tâches', 'Only for tasks assigned to me' => 'Seulement les tâches qui me sont assignées', 'Only for tasks created by me' => 'Seulement les tâches que j\'ai créées', - 'Only for tasks created by me and assigned to me' => 'Seulement les tâches créées par moi-même et celles qui me sont asignées', + 'Only for tasks created by me and assigned to me' => 'Seulement les tâches créées par moi-même et celles qui me sont assignées', '%A' => '%A', '%b %e, %Y, %k:%M %p' => '%d/%m/%Y %H:%M', 'New due date: %B %e, %Y' => 'Nouvelle date d\'échéance : %d/%m/%Y', @@ -995,7 +940,7 @@ return array( 'Github Id' => 'Identifiant Github', 'Remote user' => 'Utilisateur distant', 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Les utilisateurs distants ne stockent pas leur mot de passe dans la base de données de Kanboard, exemples : comptes LDAP, Github ou Google.', - 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Si vous cochez la case « Interdir le formulaire d\'authentification », les identifiants entrés dans le formulaire d\'authentification seront ignorés.', + 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Si vous cochez la case « Interdire le formulaire d\'authentification », les identifiants entrés dans le formulaire d\'authentification seront ignorés.', 'By @%s on Gitlab' => 'Par @%s sur Gitlab', 'Gitlab issue comment created' => 'Commentaire créé sur un ticket Gitlab', 'New remote user' => 'Créer un utilisateur distant', @@ -1023,14 +968,14 @@ return array( 'Sort by position' => 'Trier par position', 'Sort by date' => 'Trier par date', 'Add task' => 'Ajouter une tâche', - 'Start date:' => 'Date de début :', - 'Due date:' => 'Date d\'échéance :', + 'Start date:' => 'Date de début :', + 'Due date:' => 'Date d\'échéance :', 'There is no start date or due date for this task.' => 'Il n\'y a pas de date de début ou de date de fin pour cette tâche.', 'Moving or resizing a task will change the start and due date of the task.' => 'Déplacer ou redimensionner une tâche va changer la date de début et la date de fin de la tâche.', - 'There is no task in your project.' => 'Il n\'y a aucun tâche dans votre projet.', + 'There is no task in your project.' => 'Il n\'y a aucune tâche dans votre projet.', 'Gantt chart' => 'Diagramme de Gantt', - 'People who are project managers' => 'Personnes qui sont gestionnaire de projet', - 'People who are project members' => 'Personnes qui sont membre de projet', + 'People who are project managers' => 'Personnes qui sont gestionnaires de projet', + 'People who are project members' => 'Personnes qui sont membres de projet', 'NOK - Norwegian Krone' => 'NOK - Couronne norvégienne', 'Show this column' => 'Montrer cette colonne', 'Hide this column' => 'Cacher cette colonne', @@ -1043,14 +988,14 @@ return array( 'Project managers' => 'Gestionnaires de projet', 'Project members' => 'Membres de projet', 'Gantt chart for all projects' => 'Diagramme de Gantt pour tous les projets', - 'Projects list' => 'List des projets', + 'Projects list' => 'Liste des projets', 'Gantt chart for this project' => 'Diagramme de Gantt pour ce projet', 'Project board' => 'Tableau du projet', - 'End date:' => 'Date de fin :', + 'End date:' => 'Date de fin :', 'There is no start date or end date for this project.' => 'Il n\'y a pas de date de début ou de date de fin pour ce projet.', 'Projects Gantt chart' => 'Diagramme de Gantt des projets', - 'Start date: %s' => 'Date de début : %s', - 'End date: %s' => 'Date de fin : %s', + 'Start date: %s' => 'Date de début : %s', + 'End date: %s' => 'Date de fin : %s', 'Link type' => 'Type de lien', 'Change task color when using a specific task link' => 'Changer la couleur de la tâche lorsqu\'un lien spécifique est utilisé', 'Task link creation or modification' => 'Création ou modification d\'un lien sur une tâche', @@ -1069,4 +1014,48 @@ return array( 'Table of contents' => 'Table des matières', 'Gantt' => 'Gantt', 'Help with project permissions' => 'Aide avec les permissions des projets', + 'Author' => 'Auteur', + 'Version' => 'Version', + 'Plugins' => 'Extensions', + 'There is no plugin loaded.' => 'Il n\'y a aucune extension chargée.', + 'Set maximum column height' => 'Définir la hauteur max. des colonnes', + 'Remove maximum column height' => 'Enlever la hauteur max. des colonnes', + 'My notifications' => 'Mes notifications', + 'Custom filters' => 'Filtres personalisés', + 'Your custom filter have been created successfully.' => 'Votre filter personalisé a été créé avec succès.', + 'Unable to create your custom filter.' => 'Impossible de créer votre filter personalisé.', + 'Custom filter removed successfully.' => 'Filtre personalisé supprimé avec succès.', + 'Unable to remove this custom filter.' => 'Impossible de supprimer ce filter personalisé.', + 'Edit custom filter' => 'Modification d\'un filtre personalisé', + 'Your custom filter have been updated successfully.' => 'Votre filtre personalisé a été mis à jour avec succès.', + 'Unable to update custom filter.' => 'Impossible de mettre à jour votre filtre personalisé.', + 'Web' => 'Web', + 'New attachment on task #%d: %s' => 'Nouveau fichier joint sur la tâche n°%d : %s', + 'New comment on task #%d' => 'Nouveau commentaire sur la tâche n°%d', + 'Comment updated on task #%d' => 'Commentaire mis à jour sur la tâche n°%d', + 'New subtask on task #%d' => 'Nouvelle sous-tâche sur la tâche n°%d', + 'Subtask updated on task #%d' => 'Sous-tâche mise à jour sur la tâche n°%d', + 'New task #%d: %s' => 'Nouvelle tâche n°%d : %s', + 'Task updated #%d' => 'Tâche n°%d mise à jour', + 'Task #%d closed' => 'Tâche n°%d fermée', + 'Task #%d opened' => 'Tâche n°%d ouverte', + 'Column changed for task #%d' => 'Changement de colonne pour la tâche n°%d', + 'New position for task #%d' => 'Nouvelle position pour la tâche n°%d', + 'Swimlane changed for task #%d' => 'Changement de swimlane pour la tâche n°%d', + 'Assignee changed on task #%d' => 'Changement de l\'assigné pour la tâche n°%d', + '%d overdue tasks' => '%d tâches en retard', + 'Task #%d is overdue' => 'La tâche n°%d est retard', + 'No new notifications.' => 'Aucune notification.', + 'Mark all as read' => 'Tout marquer comme lu', + 'Mark as read' => 'Marquer comme lu', + 'Total number of tasks in this column across all swimlanes' => 'Nombre total de tâches dans cette colonne pour toutes les swimlanes', + 'Collapse swimlane' => 'Replier la swimlane', + 'Expand swimlane' => 'Déplier la swimlane', + 'Add a new filter' => 'Ajouter un nouveau filtre', + 'Share with all project members' => 'Partager avec tous les membres du projet', + 'Shared' => 'Partagé', + 'Owner' => 'Propriétaire', + 'Unread notifications' => 'Notifications non lus', + 'My filters' => 'Mes filtres', + 'Notification methods:' => 'Méthodes de notifications :', ); diff --git a/sources/app/Locale/hu_HU/translations.php b/sources/app/Locale/hu_HU/translations.php index b346f1e..bef6557 100644 --- a/sources/app/Locale/hu_HU/translations.php +++ b/sources/app/Locale/hu_HU/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Távoli', 'Enabled' => 'Engedélyezve', 'Disabled' => 'Letiltva', - 'Google account linked' => 'Google fiók összekapcsolva', - 'Github account linked' => 'Github fiók összekapcsolva', 'Username:' => 'Felhasználónév:', 'Name:' => 'Név:', 'Email:' => 'E-mail:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Vízszintes görgetés', 'Compact/wide view' => 'Kompakt/széles nézet', 'No results match:' => 'Nincs találat:', - 'Remove hourly rate' => 'Órabér törlése', - 'Do you really want to remove this hourly rate?' => 'Valóban törölni kívánja az órabért?', - 'Hourly rates' => 'Órabérek', - 'Hourly rate' => 'Órabér', 'Currency' => 'Pénznem', - 'Effective date' => 'Hatálybalépés ideje', - 'Add new rate' => 'Új bér', - 'Rate removed successfully.' => 'Bér sikeresen törölve.', - 'Unable to remove this rate.' => 'Bér törlése sikertelen.', - 'Unable to save the hourly rate.' => 'Órabér mentése sikertelen.', - 'Hourly rate created successfully.' => 'Órabér sikeresen mentve.', - 'Start time' => 'Kezdés ideje', - 'End time' => 'Végzés ideje', - 'Comment' => 'Megjegyzés', - 'All day' => 'Egész nap', - 'Day' => 'Nap', - 'Manage timetable' => 'Időbeosztás kezelése', - 'Overtime timetable' => 'Túlóra időbeosztás', - 'Time off timetable' => 'Szabadság időbeosztás', - 'Timetable' => 'Időbeosztás', - 'Work timetable' => 'Munka időbeosztás', - 'Week timetable' => 'Heti időbeosztás', - 'Day timetable' => 'Napi időbeosztás', - 'From' => 'Feladó:', - 'To' => 'Címzett:', - 'Time slot created successfully.' => 'Időszelet sikeresen létrehozva.', - 'Unable to save this time slot.' => 'Időszelet mentése sikertelen.', - 'Time slot removed successfully.' => 'Időszelet sikeresen törölve.', - 'Unable to remove this time slot.' => 'Időszelet törlése sikertelen.', - 'Do you really want to remove this time slot?' => 'Biztos törli ezt az időszeletet?', - 'Remove time slot' => 'Időszelet törlése', - 'Add new time slot' => 'Új Időszelet', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Ez az időbeosztás van használatban ha az "egész nap" jelölőnégyzet be van jelölve a tervezett szabadságnál és túlóránál.', 'Files' => 'Fájlok', 'Images' => 'Képek', 'Private project' => 'Privát projekt', - 'Amount' => 'Összeg', 'AUD - Australian Dollar' => 'AUD - Ausztrál dollár', - 'Budget' => 'Költségvetés', - 'Budget line' => 'Költségvetési tétel', - 'Budget line removed successfully.' => 'Költségvetési tétel sikeresen törölve.', - 'Budget lines' => 'Költségvetési tételek', 'CAD - Canadian Dollar' => 'CAD - Kanadai dollár', 'CHF - Swiss Francs' => 'CHF - Svájci frank', - 'Cost' => 'Költség', - 'Cost breakdown' => 'Költség visszaszámlálás', 'Custom Stylesheet' => 'Egyéni sítluslap', 'download' => 'letöltés', - 'Do you really want to remove this budget line?' => 'Biztos törölni akarja ezt a költségvetési tételt?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Kiadások', 'GBP - British Pound' => 'GBP - Angol font', 'INR - Indian Rupee' => 'INR - Indiai rúpia', 'JPY - Japanese Yen' => 'JPY - Japán Yen', - 'New budget line' => 'Új költségvetési tétel', 'NZD - New Zealand Dollar' => 'NZD - Új-Zélandi dollár', - 'Remove a budget line' => 'Költségvetési tétel törlése', - 'Remove budget line' => 'Költségvetési tétel törlése', 'RSD - Serbian dinar' => 'RSD - Szerb dínár', - 'The budget line have been created successfully.' => 'Költségvetési tétel sikeresen létrehozva.', - 'Unable to create the budget line.' => 'Költségvetési tétel létrehozása sikertelen.', - 'Unable to remove this budget line.' => 'Költségvetési tétel törlése sikertelen.', 'USD - US Dollar' => 'USD - Amerikai ollár', - 'Remaining' => 'Maradék', 'Destination column' => 'Cél oszlop', 'Move the task to another column when assigned to a user' => 'Feladat másik oszlopba helyezése felhasználóhoz rendélés után', 'Move the task to another column when assignee is cleared' => 'Feladat másik oszlopba helyezése felhasználóhoz rendélés törlésekor', 'Source column' => 'Forrás oszlop', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/id_ID/translations.php b/sources/app/Locale/id_ID/translations.php new file mode 100644 index 0000000..03c96b8 --- /dev/null +++ b/sources/app/Locale/id_ID/translations.php @@ -0,0 +1,1059 @@ + ',', + 'number.thousands_separator' => ' ', + 'None' => 'Tidak satupun', + 'edit' => 'modifikasi', + 'Edit' => 'Modifikasi', + 'remove' => 'hapus', + 'Remove' => 'Hapus', + 'Update' => 'Perbaharui', + 'Yes' => 'Ya', + 'No' => 'Tidak', + 'cancel' => 'batal', + 'or' => 'atau', + 'Yellow' => 'Kuning', + 'Blue' => 'Biru', + 'Green' => 'Hijau', + 'Purple' => 'Ungu', + 'Red' => 'Merah', + 'Orange' => 'Jingga', + 'Grey' => 'Abu-abu', + 'Brown' => 'Coklat', + 'Deep Orange' => 'Oranye', + 'Dark Grey' => 'Abu-abu Gelap', + 'Pink' => 'Merah Muda', + 'Teal' => 'Teal', + 'Cyan' => 'Sian', + 'Lime' => 'Lime', + 'Light Green' => 'Hijau Muda', + 'Amber' => 'Amber', + 'Save' => 'Simpan', + 'Login' => 'Masuk', + 'Official website:' => 'Situs resmi :', + 'Unassigned' => 'Belum ditugaskan', + 'View this task' => 'Lihat tugas ini', + 'Remove user' => 'Hapus pengguna', + 'Do you really want to remove this user: "%s"?' => 'Anda yakin akan menghapus pengguna ini : « %s » ?', + 'New user' => 'Pengguna baru', + 'All users' => 'Semua pengguna', + 'Username' => 'Nama pengguna', + 'Password' => 'Kata sandi', + 'Administrator' => 'Administrator', + 'Sign in' => 'Masuk', + 'Users' => 'Pengguna', + 'No user' => 'Tidak ada pengguna', + 'Forbidden' => 'Terlarang', + 'Access Forbidden' => 'Akses Dilarang', + 'Edit user' => 'Rubah Pengguna', + 'Logout' => 'Keluar', + 'Bad username or password' => 'Nama pengguna atau kata sandri buruk', + 'Edit project' => 'Rubah proyek', + 'Name' => 'Nama', + 'Projects' => 'Proyek', + 'No project' => 'Tidak ada proyek', + 'Project' => 'Proyek', + 'Status' => 'Status', + 'Tasks' => 'Tugas', + 'Board' => 'Papan', + 'Actions' => 'Tindakan', + 'Inactive' => 'Non Aktif', + 'Active' => 'Aktif', + 'Add this column' => 'Tambahkan kolom ini', + '%d tasks on the board' => '%d tugas di papan', + '%d tasks in total' => '%d tugas di total', + 'Unable to update this board.' => 'Tidak dapat memperbaharui papan ini', + 'Edit board' => 'Rubah papan', + 'Disable' => 'Nonaktifkan', + 'Enable' => 'Aktifkan', + 'New project' => 'Proyek Baru', + 'Do you really want to remove this project: "%s"?' => 'Apakah anda yakin akan menghapus proyek ini : « %s » ?', + 'Remove project' => 'Hapus proyek', + 'Edit the board for "%s"' => 'Rubah papan untuk « %s »', + 'All projects' => 'Semua proyek', + 'Change columns' => 'Rubah kolom', + 'Add a new column' => 'Tambah kolom baru', + 'Title' => 'Judul', + 'Nobody assigned' => 'Tidak ada yang ditugaskan', + 'Assigned to %s' => 'Ditugaskan ke %s', + 'Remove a column' => 'Hapus kolom', + 'Remove a column from a board' => 'Hapus kolom dari papan', + 'Unable to remove this column.' => 'Tidak dapat menghapus kolom ini.', + 'Do you really want to remove this column: "%s"?' => 'Apakah anda yakin akan menghapus kolom ini : « %s » ?', + 'This action will REMOVE ALL TASKS associated to this column!' => 'tindakan ini akan MENGHAPUS SEMUA TUGAS yang terkait dengan kolom ini!', + 'Settings' => 'Pengaturan', + 'Application settings' => 'Pengaturan aplikasi', + 'Language' => 'Bahasa', + 'Webhook token:' => 'Token webhook :', + 'API token:' => 'Token API :', + 'Database size:' => 'Ukuran basis data :', + 'Download the database' => 'Unduh basis data', + 'Optimize the database' => 'Optimasi basis data', + '(VACUUM command)' => '(perintah VACUUM)', + '(Gzip compressed Sqlite file)' => '(File Sqlite yang terkompress Gzip)', + 'Close a task' => 'Tutup tugas', + 'Edit a task' => 'Edit tugas', + 'Column' => 'Kolom', + 'Color' => 'Warna', + 'Assignee' => 'Orang yang ditugaskan', + 'Create another task' => 'Buat tugas lain', + 'New task' => 'Tugas baru', + 'Open a task' => 'Buka tugas', + 'Do you really want to open this task: "%s"?' => 'Apakah anda yakin akan membuka tugas ini : « %s » ?', + 'Back to the board' => 'Kembali ke papan', + 'Created on %B %e, %Y at %k:%M %p' => 'Dibuat pada tanggal %d/%m/%Y à %H:%M', + 'There is nobody assigned' => 'Tidak ada orang yand ditugaskan', + 'Column on the board:' => 'Kolom di dalam papan : ', + 'Status is open' => 'Status terbuka', + 'Status is closed' => 'Status ditutup', + 'Close this task' => 'Tutup tugas ini', + 'Open this task' => 'Buka tugas ini', + 'There is no description.' => 'Tidak ada deskripsi.', + 'Add a new task' => 'Tambah tugas baru', + 'The username is required' => 'nama pengguna diperlukan', + 'The maximum length is %d characters' => 'Panjang maksimum adalah %d karakter', + 'The minimum length is %d characters' => 'Panjang minimum adalah %d karakter', + 'The password is required' => 'Kata sandi diperlukan', + 'This value must be an integer' => 'Nilai ini harus integer', + 'The username must be unique' => 'Nama pengguna harus unik', + 'The user id is required' => 'Id Pengguna diperlukan', + 'Passwords don\'t match' => 'Kata sandi tidak cocok', + 'The confirmation is required' => 'Konfirmasi diperlukan', + 'The project is required' => 'Proyek diperlukan', + 'The id is required' => 'Id diperlukan', + 'The project id is required' => 'Id proyek diperlukan', + 'The project name is required' => 'Nama proyek diperlukan', + 'This project must be unique' => 'Proyek ini harus unik', + 'The title is required' => 'Judul diperlukan', + 'Settings saved successfully.' => 'Pengaturan berhasil disimpan.', + 'Unable to save your settings.' => 'Tidak dapat menyimpan pengaturan anda.', + 'Database optimization done.' => 'Optimasi basis data selesai.', + 'Your project have been created successfully.' => 'Proyek anda berhasil dibuat.', + 'Unable to create your project.' => 'Tidak dapat membuat proyek anda.', + 'Project updated successfully.' => 'Proyek berhasil diperbaharui.', + 'Unable to update this project.' => 'Tidak dapat memperbaharui proyek ini.', + 'Unable to remove this project.' => 'Tidak dapat menghapus proyek ini.', + 'Project removed successfully.' => 'Proyek berhasil dihapus.', + 'Project activated successfully.' => 'Proyek berhasil diaktivasi.', + 'Unable to activate this project.' => 'Tidak dapat mengaktifkan proyek ini.', + 'Project disabled successfully.' => 'Proyek berhasil dinonaktifkan.', + 'Unable to disable this project.' => 'Tidak dapat menonaktifkan proyek ini.', + 'Unable to open this task.' => 'Tidak dapat membuka tugas ini.', + 'Task opened successfully.' => 'Tugas berhasil dibuka.', + 'Unable to close this task.' => 'Tidak dapat menutup tugas ini.', + 'Task closed successfully.' => 'Tugas berhasil ditutup.', + 'Unable to update your task.' => 'Tidak dapat memperbaharui tugas ini.', + 'Task updated successfully.' => 'Tugas berhasil diperbaharui.', + 'Unable to create your task.' => 'Tidak dapat membuat tugas anda.', + 'Task created successfully.' => 'Tugas berhasil dibuat.', + 'User created successfully.' => 'Pengguna berhasil dibuat.', + 'Unable to create your user.' => 'Tidak dapat membuat pengguna anda.', + 'User updated successfully.' => 'Pengguna berhasil diperbaharui.', + 'Unable to update your user.' => 'Tidak dapat memperbaharui pengguna anda.', + 'User removed successfully.' => 'pengguna berhasil dihapus.', + 'Unable to remove this user.' => 'Tidak dapat menghapus pengguna ini.', + 'Board updated successfully.' => 'Papan berhasil diperbaharui.', + 'Ready' => 'Siap', + 'Backlog' => 'Tertunda', + 'Work in progress' => 'Sedang dalam pengerjaan', + 'Done' => 'Selesai', + 'Application version:' => 'Versi aplikasi :', + 'Completed on %B %e, %Y at %k:%M %p' => 'Diselesaikan pada tanggal %d/%m/%Y à %H:%M', + '%B %e, %Y at %k:%M %p' => '%d/%m/%Y à %H:%M', + 'Date created' => 'Tanggal dibuat', + 'Date completed' => 'Tanggal diselesaikan', + 'Id' => 'Id.', + '%d closed tasks' => '%d tugas yang ditutup', + 'No task for this project' => 'Tidak ada tugas dalam proyek ini', + 'Public link' => 'Tautan publik', + 'There is no column in your project!' => 'Tidak ada kolom didalam proyek anda!', + 'Change assignee' => 'Mengubah orang yand ditugaskan', + 'Change assignee for the task "%s"' => 'Mengubah orang yang ditugaskan untuk tugas « %s »', + 'Timezone' => 'Zona waktu', + 'Sorry, I didn\'t find this information in my database!' => 'Maaf, saya tidak menemukan informasi ini dalam basis data saya !', + 'Page not found' => 'Halaman tidak ditemukan', + 'Complexity' => 'Kompleksitas', + 'Task limit' => 'Batas tugas.', + 'Task count' => 'Jumlah tugas', + 'Edit project access list' => 'Modifikasi hak akses proyek', + 'Allow this user' => 'Memperbolehkan pengguna ini', + 'Don\'t forget that administrators have access to everything.' => 'Ingat bahwa administrator memiliki akses ke semua.', + 'Revoke' => 'Mencabut', + 'List of authorized users' => 'Daftar pengguna yang berwenang', + 'User' => 'Pengguna', + 'Nobody have access to this project.' => 'Tidak ada yang berwenang untuk mengakses proyek.', + 'Comments' => 'Komentar', + 'Write your text in Markdown' => 'Menulis teks anda didalam Markdown', + 'Leave a comment' => 'Tinggalkan komentar', + 'Comment is required' => 'Komentar diperlukan', + 'Leave a description' => 'Tinggalkan deskripsi', + 'Comment added successfully.' => 'Komentar berhasil ditambahkan.', + 'Unable to create your comment.' => 'Tidak dapat menambahkan komentar anda.', + 'Edit this task' => 'Modifikasi tugas ini', + 'Due Date' => 'Batas Tanggal Terakhir', + 'Invalid date' => 'Tanggal tidak valid', + 'Must be done before %B %e, %Y' => 'Harus diselesaikan sebelum tanggal %d/%m/%Y', + '%B %e, %Y' => '%d %B %Y', + '%b %e, %Y' => '%d/%m/%Y', + 'Automatic actions' => 'Tindakan otomatis', + 'Your automatic action have been created successfully.' => 'Tindakan otomatis anda berhasil dibuat.', + 'Unable to create your automatic action.' => 'Tidak dapat membuat tindakan otomatis anda.', + 'Remove an action' => 'Hapus tindakan', + 'Unable to remove this action.' => 'Tidak dapat menghapus tindakan ini', + 'Action removed successfully.' => 'Tindakan berhasil dihapus.', + 'Automatic actions for the project "%s"' => 'Tindakan otomatis untuk proyek ini « %s »', + 'Defined actions' => 'Tindakan didefinisikan', + 'Add an action' => 'Tambah tindakan', + 'Event name' => 'Nama acara', + 'Action name' => 'Nama tindakan', + 'Action parameters' => 'Parameter tindakan', + 'Action' => 'Tindakan', + 'Event' => 'Acara', + 'When the selected event occurs execute the corresponding action.' => 'Ketika acara yang dipilih terjadi, melakukan tindakan yang sesuai.', + 'Next step' => 'Langkah selanjutnya', + 'Define action parameters' => 'Definisi parameter tindakan', + 'Save this action' => 'Simpan tindakan ini', + 'Do you really want to remove this action: "%s"?' => 'Apakah anda yakin akan menghapus tindakan ini « %s » ?', + 'Remove an automatic action' => 'Hapus tindakan otomatis', + 'Assign the task to a specific user' => 'Menetapkan tugas untuk pengguna tertentu', + 'Assign the task to the person who does the action' => 'Memberikan tugas untuk orang yang melakukan tindakan', + 'Duplicate the task to another project' => 'Duplikasi tugas ke proyek lain', + 'Move a task to another column' => 'Pindahkan tugas ke kolom lain', + 'Task modification' => 'Modifikasi tugas', + 'Task creation' => 'Membuat tugas', + 'Closing a task' => 'Menutup tugas', + 'Assign a color to a specific user' => 'Menetapkan warna untuk pengguna tertentu', + 'Column title' => 'Judul kolom', + 'Position' => 'Posisi', + 'Move Up' => 'Pindah ke atas', + 'Move Down' => 'Pindah ke bawah', + 'Duplicate to another project' => 'Duplikasi ke proyek lain', + 'Duplicate' => 'Duplikasi', + 'link' => 'tautan', + 'Comment updated successfully.' => 'Komentar berhasil diperbaharui.', + 'Unable to update your comment.' => 'Tidak dapat memperbaharui komentar anda.', + 'Remove a comment' => 'Hapus komentar', + 'Comment removed successfully.' => 'Komentar berhasil dihapus.', + 'Unable to remove this comment.' => 'Tidak dapat menghapus komentar ini.', + 'Do you really want to remove this comment?' => 'Apakah anda yakin akan menghapus komentar ini ?', + 'Only administrators or the creator of the comment can access to this page.' => 'Hanya administrator atau pembuat komentar yang dapat mengakses halaman ini.', + 'Current password for the user "%s"' => 'Kata sandi saat ini untuk pengguna « %s »', + 'The current password is required' => 'Kata sandi saat ini diperlukan', + 'Wrong password' => 'Kata sandi salah', + 'Unknown' => 'Tidak diketahui', + 'Last logins' => 'Masuk terakhir', + 'Login date' => 'Tanggal masuk', + 'Authentication method' => 'Metode otentifikasi', + 'IP address' => 'Alamat IP', + 'User agent' => 'Agen Pengguna', + 'Persistent connections' => 'Koneksi persisten', + 'No session.' => 'Tidak ada sesi.', + 'Expiration date' => 'Tanggal kadaluarsa', + 'Remember Me' => 'Ingat Saya', + 'Creation date' => 'Tanggal dibuat', + 'Everybody' => 'Semua orang', + 'Open' => 'Terbuka', + 'Closed' => 'Ditutup', + 'Search' => 'Cari', + 'Nothing found.' => 'Tidak ditemukan.', + 'Due date' => 'Batas tanggal terakhir', + 'Others formats accepted: %s and %s' => 'Format lain yang didukung : %s et %s', + 'Description' => 'Deskripsi', + '%d comments' => '%d komentar', + '%d comment' => '%d komentar', + 'Email address invalid' => 'Alamat email tidak valid', + 'Your external account is not linked anymore to your profile.' => 'Akun eksternal anda tidak lagi terhubung ke profil anda.', + 'Unable to unlink your external account.' => 'Tidak dapat memutuskan akun eksternal anda.', + 'External authentication failed' => 'Otentifikasi eksternal gagal', + 'Your external account is linked to your profile successfully.' => 'Akun eksternal anda berhasil dihubungkan ke profil anda.', + 'Email' => 'Email', + 'Link my Google Account' => 'Hubungkan akun Google saya', + 'Unlink my Google Account' => 'Putuskan akun Google saya', + 'Login with my Google Account' => 'Masuk menggunakan akun Google saya', + 'Project not found.' => 'Proyek tidak ditemukan.', + 'Task removed successfully.' => 'Tugas berhasil dihapus.', + 'Unable to remove this task.' => 'Tidak dapat menghapus tugas ini.', + 'Remove a task' => 'Hapus tugas', + 'Do you really want to remove this task: "%s"?' => 'Apakah anda yakin akan menghapus tugas ini « %s » ?', + 'Assign automatically a color based on a category' => 'Otomatis menetapkan warna berdasarkan kategori', + 'Assign automatically a category based on a color' => 'Otomatis menetapkan kategori berdasarkan warna', + 'Task creation or modification' => 'Tugas dibuat atau di mofifikasi', + 'Category' => 'Kategori', + 'Category:' => 'Kategori :', + 'Categories' => 'Kategori', + 'Category not found.' => 'Kategori tidak ditemukan', + 'Your category have been created successfully.' => 'Kategori anda berhasil dibuat.', + 'Unable to create your category.' => 'Tidak dapat membuat kategori anda.', + 'Your category have been updated successfully.' => 'Kategori anda berhasil diperbaharui.', + 'Unable to update your category.' => 'Tidak dapat memperbaharui kategori anda.', + 'Remove a category' => 'Hapus kategori', + 'Category removed successfully.' => 'Kategori berhasil dihapus.', + 'Unable to remove this category.' => 'Tidak dapat menghapus kategori ini.', + 'Category modification for the project "%s"' => 'Modifikasi kategori untuk proyek « %s »', + 'Category Name' => 'Nama Kategori', + 'Add a new category' => 'Tambah kategori baru', + 'Do you really want to remove this category: "%s"?' => 'Apakah anda yakin akan menghapus kategori ini « %s » ?', + 'All categories' => 'Semua kategori', + 'No category' => 'Tidak ada kategori', + 'The name is required' => 'Nama diperlukan', + 'Remove a file' => 'Hapus berkas', + 'Unable to remove this file.' => 'Tidak dapat menghapus berkas ini.', + 'File removed successfully.' => 'Berkas berhasil dihapus.', + 'Attach a document' => 'Lampirkan dokumen', + 'Do you really want to remove this file: "%s"?' => 'Apakah anda yakin akan menghapus berkas ini « %s » ?', + 'open' => 'buka', + 'Attachments' => 'Lampiran', + 'Edit the task' => 'Modifikasi tugas', + 'Edit the description' => 'Modifikasi deskripsi', + 'Add a comment' => 'Tambahkan komentar', + 'Edit a comment' => 'Modifikasi komentar', + 'Summary' => 'Ringkasan', + 'Time tracking' => 'Pelacakan waktu', + 'Estimate:' => 'Estimasi :', + 'Spent:' => 'Menghabiskan:', + 'Do you really want to remove this sub-task?' => 'Apakah anda yakin akan menghapus sub-tugas ini ?', + 'Remaining:' => 'Tersisa:', + 'hours' => 'jam', + 'spent' => 'menghabiskan', + 'estimated' => 'perkiraan', + 'Sub-Tasks' => 'Sub-tugas', + 'Add a sub-task' => 'Tambahkan sub-tugas', + 'Original estimate' => 'Perkiraan semula', + 'Create another sub-task' => 'Tambahkan sub-tugas lainnya', + 'Time spent' => 'Waktu yang dihabiskan', + 'Edit a sub-task' => 'Modifikasi sub-tugas', + 'Remove a sub-task' => 'Hapus sub-tugas', + 'The time must be a numeric value' => 'Waktu harus berisikan numerik', + 'Todo' => 'Yang harus dilakukan', + 'In progress' => 'Sedang proses', + 'Sub-task removed successfully.' => 'Sub-tugas berhasil dihapus.', + 'Unable to remove this sub-task.' => 'Tidak dapat menghapus sub-tugas.', + 'Sub-task updated successfully.' => 'Sub-tugas berhasil diperbaharui.', + 'Unable to update your sub-task.' => 'Tidak dapat memperbaharui sub-tugas anda.', + 'Unable to create your sub-task.' => 'Tidak dapat membuat sub-tugas anda.', + 'Sub-task added successfully.' => 'Sub-tugas berhasil dibuat.', + 'Maximum size: ' => 'Ukuran maksimum: ', + 'Unable to upload the file.' => 'Tidak dapat mengunggah berkas.', + 'Display another project' => 'Lihat proyek lain', + 'Login with my Github Account' => 'Masuk menggunakan akun Github saya', + 'Link my Github Account' => 'Hubungkan akun Github saya ', + 'Unlink my Github Account' => 'Putuskan akun Github saya', + 'Created by %s' => 'Dibuat oleh %s', + 'Last modified on %B %e, %Y at %k:%M %p' => 'Modifikasi terakhir pada tanggal %d/%m/%Y à %H:%M', + 'Tasks Export' => 'Ekspor Tugas', + 'Tasks exportation for "%s"' => 'Tugas di ekspor untuk « %s »', + 'Start Date' => 'Tanggal Mulai', + 'End Date' => 'Tanggal Berakhir', + 'Execute' => 'Eksekusi', + 'Task Id' => 'Id Tugas', + 'Creator' => 'Pembuat', + 'Modification date' => 'Tanggal modifikasi', + 'Completion date' => 'Tanggal penyelesaian', + 'Clone' => 'Klon', + 'Project cloned successfully.' => 'Kloning proyek berhasil.', + 'Unable to clone this project.' => 'Tidak dapat mengkloning proyek.', + 'Email notifications' => 'Pemberitahuan email', + 'Enable email notifications' => 'Aktifkan pemberitahuan dari email', + 'Task position:' => 'Posisi tugas :', + 'The task #%d have been opened.' => 'Tugas #%d telah dibuka.', + 'The task #%d have been closed.' => 'Tugas #%d telah ditutup.', + 'Sub-task updated' => 'Sub-tugas diperbaharui', + 'Title:' => 'Judul :', + 'Status:' => 'Status :', + 'Assignee:' => 'Ditugaskan ke :', + 'Time tracking:' => 'Pelacakan waktu :', + 'New sub-task' => 'Sub-tugas baru', + 'New attachment added "%s"' => 'Lampiran baru ditambahkan « %s »', + 'Comment updated' => 'Komentar diperbaharui', + 'New comment posted by %s' => 'Komentar baru ditambahkan oleh « %s »', + 'New attachment' => 'Lampirkan baru', + 'New comment' => 'Komentar baru', + 'New subtask' => 'Sub-tugas baru', + 'Subtask updated' => 'Sub-tugas diperbaharui', + 'Task updated' => 'Tugas diperbaharui', + 'Task closed' => 'Tugas ditutup', + 'Task opened' => 'Tugas dibuka', + 'I want to receive notifications only for those projects:' => 'Saya ingin menerima pemberitahuan hanya untuk proyek-proyek yang dipilih :', + 'view the task on Kanboard' => 'lihat tugas di Kanboard', + 'Public access' => 'Akses publik', + 'User management' => 'Manajemen pengguna', + 'Active tasks' => 'Tugas aktif', + 'Disable public access' => 'Nonaktifkan akses publik', + 'Enable public access' => 'Aktifkan akses publik', + 'Public access disabled' => 'Akses publik dinonaktifkan', + 'Do you really want to disable this project: "%s"?' => 'Apakah anda yakin akan menonaktifkan proyek ini : « %s » ?', + 'Do you really want to enable this project: "%s"?' => 'Apakah anda yakin akan mengaktifkan proyek ini : « %s » ?', + 'Project activation' => 'Aktivasi proyek', + 'Move the task to another project' => 'Pindahkan tugas ke proyek lain', + 'Move to another project' => 'Pindahkan ke proyek lain', + 'Do you really want to duplicate this task?' => 'Apakah anda yakin akan menduplikasi tugas ini ?', + 'Duplicate a task' => 'Duplikasi tugas', + 'External accounts' => 'Akun eksternal', + 'Account type' => 'Tipe akun', + 'Local' => 'Lokal', + 'Remote' => 'Jauh', + 'Enabled' => 'Aktif', + 'Disabled' => 'Nonaktif', + 'Username:' => 'Nama pengguna :', + 'Name:' => 'Nama :', + 'Email:' => 'Email :', + 'Notifications:' => 'Pemberitahuan :', + 'Notifications' => 'Pemberitahuan', + 'Group:' => 'Grup :', + 'Regular user' => 'Pengguna normal', + 'Account type:' => 'Tipe akun :', + 'Edit profile' => 'Modifikasi profil', + 'Change password' => 'Rubah kata sandri', + 'Password modification' => 'Modifikasi kata sandi', + 'External authentications' => 'Otentifikasi eksternal', + 'Google Account' => 'Akun Google', + 'Github Account' => 'Akun Github', + 'Never connected.' => 'Tidak pernah terhubung.', + 'No account linked.' => 'Tidak ada akun terhubung.', + 'Account linked.' => 'Akun terhubung.', + 'No external authentication enabled.' => 'Tidak ada otentifikasi eksternal yang aktif.', + 'Password modified successfully.' => 'Kata sandi berhasil dimodifikasi.', + 'Unable to change the password.' => 'Tidak dapat merubah kata sandir.', + 'Change category for the task "%s"' => 'Rubah kategori untuk tugas « %s »', + 'Change category' => 'Rubah kategori', + '%s updated the task %s' => '%s memperbaharui tugas %s', + '%s opened the task %s' => '%s membuka tugas %s', + '%s moved the task %s to the position #%d in the column "%s"' => '%s memindahkan tugas %s ke posisi n°%d dalam kolom « %s »', + '%s moved the task %s to the column "%s"' => '%s memindahkan tugas %s ke kolom « %s »', + '%s created the task %s' => '%s membuat tugas %s', + '%s closed the task %s' => '%s menutup tugas %s', + '%s created a subtask for the task %s' => '%s membuat subtugas untuk tugas %s', + '%s updated a subtask for the task %s' => '%s memperbaharui subtugas untuk tugas %s', + 'Assigned to %s with an estimate of %s/%sh' => 'Ditugaskan untuk %s dengan perkiraan %s/%sh', + 'Not assigned, estimate of %sh' => 'Tidak ada yang ditugaskan, perkiraan %sh', + '%s updated a comment on the task %s' => '%s memperbaharui komentar pada tugas %s', + '%s commented the task %s' => '%s memberikan komentar pada tugas %s', + '%s\'s activity' => 'Aktifitas dari %s', + 'RSS feed' => 'RSS feed', + '%s updated a comment on the task #%d' => '%s memperbaharui komentar pada tugas n°%d', + '%s commented on the task #%d' => '%s memberikan komentar pada tugas n°%d', + '%s updated a subtask for the task #%d' => '%s memperbaharui subtugas untuk tugas n°%d', + '%s created a subtask for the task #%d' => '%s membuat subtugas untuk tugas n°%d', + '%s updated the task #%d' => '%s memperbaharui tugas n°%d', + '%s created the task #%d' => '%s membuat tugas n°%d', + '%s closed the task #%d' => '%s menutup tugas n°%d', + '%s open the task #%d' => '%s membuka tugas n°%d', + '%s moved the task #%d to the column "%s"' => '%s memindahkan tugas n°%d ke kolom « %s »', + '%s moved the task #%d to the position %d in the column "%s"' => '%s memindahkan tugas n°%d ke posisi n°%d dalam kolom « %s »', + 'Activity' => 'Aktifitas', + 'Default values are "%s"' => 'Standar nilai adalah« %s »', + 'Default columns for new projects (Comma-separated)' => 'Kolom default untuk proyek baru (dipisahkan dengan koma)', + 'Task assignee change' => 'Mengubah orang ditugaskan untuk tugas', + '%s change the assignee of the task #%d to %s' => '%s rubah orang yang ditugaskan dari tugas n%d ke %s', + '%s changed the assignee of the task %s to %s' => '%s mengubah orang yang ditugaskan dari tugas %s ke %s', + 'New password for the user "%s"' => 'Kata sandi baru untuk pengguna « %s »', + 'Choose an event' => 'Pilih acara', + 'Github commit received' => 'Menerima komit dari Github', + 'Github issue opened' => 'Tiket Github dibuka', + 'Github issue closed' => 'Tiket Github ditutup', + 'Github issue reopened' => 'Tiket Github dibuka kembali', + 'Github issue assignee change' => 'Rubah penugasan tiket Github', + 'Github issue label change' => 'Perubahan label pada tiket Github', + 'Create a task from an external provider' => 'Buat tugas dari pemasok eksternal', + 'Change the assignee based on an external username' => 'Rubah penugasan berdasarkan nama pengguna eksternal', + 'Change the category based on an external label' => 'Rubah kategori berdasarkan label eksternal', + 'Reference' => 'Referensi', + 'Reference: %s' => 'Referensi : %s', + 'Label' => 'Label', + 'Database' => 'Basis data', + 'About' => 'Tentang', + 'Database driver:' => 'Driver basis data :', + 'Board settings' => 'Pengaturan papan', + 'URL and token' => 'URL dan token', + 'Webhook settings' => 'Pengaturan webhook', + 'URL for task creation:' => 'URL untuk pembuatan tugas :', + 'Reset token' => 'Mereset token', + 'API endpoint:' => 'API endpoint :', + 'Refresh interval for private board' => 'Interval pembaruan untuk papan pribadi', + 'Refresh interval for public board' => 'Interval pembaruan untuk papan publik', + 'Task highlight period' => 'Periode puncak tugas', + 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode (dalam detik) untuk mempertimbangkan tugas yang baru dimodifikasi (0 untuk menonaktifkan, standar 2 hari)', + 'Frequency in second (60 seconds by default)' => 'Frequensi dalam detik (standar 60 detik)', + 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frequensi dalam detik (0 untuk menonaktifkan fitur ini, standar 10 detik)', + 'Application URL' => 'URL Aplikasi', + 'Example: http://example.kanboard.net/ (used by email notifications)' => 'Contoh : http://exemple.kanboard.net/ (digunakan untuk pemberitahuan email)', + 'Token regenerated.' => 'Token diregenerasi.', + 'Date format' => 'Format tanggal', + 'ISO format is always accepted, example: "%s" and "%s"' => 'Format ISO selalu diterima, contoh : « %s » et « %s »', + 'New private project' => 'Proyek pribadi baru', + 'This project is private' => 'Proyek ini adalah pribadi', + 'Type here to create a new sub-task' => 'Ketik disini untuk membuat sub-tugas baru', + 'Add' => 'Tambah', + 'Estimated time: %s hours' => 'Perkiraan waktu: %s jam', + 'Time spent: %s hours' => 'Waktu dihabiskan : %s jam', + 'Started on %B %e, %Y' => 'Dimulai pada %d/%m/%Y', + 'Start date' => 'Tanggal mulai', + 'Time estimated' => 'Perkiraan waktu', + 'There is nothing assigned to you.' => 'Tidak ada yang diberikan kepada anda.', + 'My tasks' => 'Tugas saya', + 'Activity stream' => 'Arus aktifitas', + 'Dashboard' => 'Dasbor', + 'Confirmation' => 'Konfirmasi', + 'Allow everybody to access to this project' => 'Memungkinkan semua orang untuk mengakses proyek ini', + 'Everybody have access to this project.' => 'Semua orang mendapat akses untuk proyek ini.', + 'Webhooks' => 'Webhooks', + 'API' => 'API', + 'Github webhooks' => 'Webhook Github', + 'Help on Github webhooks' => 'Bantuan pada webhook Github', + 'Create a comment from an external provider' => 'Buat komentar dari pemasok eksternal', + 'Github issue comment created' => 'Komentar dibuat pada tiket Github', + 'Project management' => 'Manajemen proyek', + 'My projects' => 'Proyek saya', + 'Columns' => 'Kolom', + 'Task' => 'Tugas', + 'Your are not member of any project.' => 'Anda bukan anggota dari setiap proyek.', + 'Percentage' => 'Persentasi', + 'Number of tasks' => 'Jumlah dari tugas', + 'Task distribution' => 'Pembagian tugas', + 'Reportings' => 'Pelaporan', + 'Task repartition for "%s"' => 'Pembagian tugas untuk « %s »', + 'Analytics' => 'Analitis', + 'Subtask' => 'Subtugas', + 'My subtasks' => 'Subtugas saya', + 'User repartition' => 'Partisi ulang pengguna', + 'User repartition for "%s"' => 'Partisi ulang pengguna untuk « %s »', + 'Clone this project' => 'Gandakan proyek ini', + 'Column removed successfully.' => 'Kolom berhasil dihapus.', + 'Github Issue' => 'Tiket Github', + 'Not enough data to show the graph.' => 'Tidak cukup data untuk menampilkan grafik.', + 'Previous' => 'Sebelumnya', + 'The id must be an integer' => 'Id harus integer', + 'The project id must be an integer' => 'Id proyek harus integer', + 'The status must be an integer' => 'Status harus integer', + 'The subtask id is required' => 'Id subtugas diperlukan', + 'The subtask id must be an integer' => 'Id subtugas harus integer', + 'The task id is required' => 'Id tugas diperlukan', + 'The task id must be an integer' => 'Id tugas harus integer', + 'The user id must be an integer' => 'Id user harus integer', + 'This value is required' => 'Nilai ini diperlukan', + 'This value must be numeric' => 'Nilai ini harus angka', + 'Unable to create this task.' => 'Tidak dapat membuat tugas ini', + 'Cumulative flow diagram' => 'Diagram alir kumulatif', + 'Cumulative flow diagram for "%s"' => 'Diagram alir kumulatif untuk « %s »', + 'Daily project summary' => 'Ringkasan proyek harian', + 'Daily project summary export' => 'Ekspor ringkasan proyek harian', + 'Daily project summary export for "%s"' => 'Ekspor ringkasan proyek harian untuk « %s »', + 'Exports' => 'Ekspor', + 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.', + 'Nothing to preview...' => 'Tidak ada yang dapat dilihat...', + 'Preview' => 'Preview', + 'Write' => 'Tulis', + 'Active swimlanes' => 'Swimlanes aktif', + 'Add a new swimlane' => 'Tambah swimlane baru', + 'Change default swimlane' => 'Modifikasi standar swimlane', + 'Default swimlane' => 'Standar swimlane', + 'Do you really want to remove this swimlane: "%s"?' => 'Apakah anda yakin akan menghapus swimlane ini : « %s » ?', + 'Inactive swimlanes' => 'Swimlanes tidak aktif', + 'Set project manager' => 'Masukan manajer proyek', + 'Set project member' => 'Masukan anggota proyek ', + 'Remove a swimlane' => 'Supprimer une swimlane', + 'Rename' => 'Ganti nama', + 'Show default swimlane' => 'Perlihatkan standar swimlane', + 'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk proyek « %s »', + 'Swimlane not found.' => 'Swimlane tidak ditemukan.', + 'Swimlane removed successfully.' => 'Swimlane berhasil dihapus.', + 'Swimlanes' => 'Swimlanes', + 'Swimlane updated successfully.' => 'Swimlane berhasil diperbaharui.', + 'The default swimlane have been updated successfully.' => 'Standar swimlane berhasil diperbaharui.', + 'Unable to create your swimlane.' => 'Tidak dapat membuat swimlane anda.', + 'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.', + 'Unable to update this swimlane.' => 'Tidak dapat memperbaharui swimlane ini.', + 'Your swimlane have been created successfully.' => 'Swimlane anda berhasil dibuat.', + 'Example: "Bug, Feature Request, Improvement"' => 'Contoh: « Insiden, Permintaan Fitur, Perbaikan »', + 'Default categories for new projects (Comma-separated)' => 'Standar kategori untuk proyek baru (dipisahkan dengan koma)', + 'Gitlab commit received' => 'Menerima komit Gitlab', + 'Gitlab issue opened' => 'Tiket Gitlab dibuka', + 'Gitlab issue closed' => 'Tiket Gitlab ditutup', + 'Gitlab webhooks' => 'Webhook Gitlab', + 'Help on Gitlab webhooks' => 'Bantuan pada webhook Gitlab', + 'Integrations' => 'Integrasi', + 'Integration with third-party services' => 'Integrasi dengan layanan pihak ketiga', + 'Role for this project' => 'Peran untuk proyek ini', + 'Project manager' => 'Manajer proyek', + 'Project member' => 'Anggota proyek', + 'A project manager can change the settings of the project and have more privileges than a standard user.' => 'Seorang manajer proyek dapat mengubah pengaturan proyek dan memiliki lebih banyak keistimewaan dibandingkan dengan pengguna biasa.', + 'Gitlab Issue' => 'Tiket Gitlab', + 'Subtask Id' => 'Id Subtugas', + 'Subtasks' => 'Subtugas', + 'Subtasks Export' => 'Ekspor Subtugas', + 'Subtasks exportation for "%s"' => 'Ekspor subtugas untuk « %s »', + 'Task Title' => 'Judul Tugas', + 'Untitled' => 'Tanpa nama', + 'Application default' => 'Aplikasi standar', + 'Language:' => 'Bahasa :', + 'Timezone:' => 'Zona waktu :', + 'All columns' => 'Semua kolom', + 'Calendar' => 'Kalender', + 'Next' => 'Selanjutnya', + '#%d' => 'n˚%d', + 'All swimlanes' => 'Semua swimlane', + 'All colors' => 'Semua warna', + 'All status' => 'Semua status', + 'Moved to column %s' => 'Pindah ke kolom %s', + 'Change description' => 'Rubah deskripsi', + 'User dashboard' => 'Dasbor pengguna', + 'Allow only one subtask in progress at the same time for a user' => 'Izinkan hanya satu subtugas dalam proses secara bersamaan untuk satu pengguna', + 'Edit column "%s"' => 'Modifikasi kolom « %s »', + 'Select the new status of the subtask: "%s"' => 'Pilih status baru untuk subtugas : « %s »', + 'Subtask timesheet' => 'Subtugas absen', + 'There is nothing to show.' => 'Tidak ada yang dapat diperlihatkan.', + 'Time Tracking' => 'Pelacakan waktu', + 'You already have one subtask in progress' => 'Anda sudah ada satu subtugas dalam proses', + 'Which parts of the project do you want to duplicate?' => 'Bagian dalam proyek mana yang ingin anda duplikasi?', + 'Disallow login form' => 'Larang formulir masuk', + 'Bitbucket commit received' => 'Menerima komit Bitbucket', + 'Bitbucket webhooks' => 'Webhook Bitbucket', + 'Help on Bitbucket webhooks' => 'Bantuan pada webhook Bitbucket', + 'Start' => 'Mulai', + 'End' => 'Selesai', + 'Task age in days' => 'Usia tugas dalam hari', + 'Days in this column' => 'Hari dalam kolom ini', + '%dd' => '%dj', + 'Add a link' => 'Menambahkan tautan', + 'Add a new link' => 'Tambah tautan baru', + 'Do you really want to remove this link: "%s"?' => 'Apakah anda yakin akan menghapus tautan ini : « %s » ?', + 'Do you really want to remove this link with task #%d?' => 'Apakah anda yakin akan menghapus tautan ini dengan tugas n°%d ?', + 'Field required' => 'Field diperlukan', + 'Link added successfully.' => 'Tautan berhasil ditambahkan.', + 'Link updated successfully.' => 'Tautan berhasil diperbaharui.', + 'Link removed successfully.' => 'Tautan berhasil dihapus.', + 'Link labels' => 'Label tautan', + 'Link modification' => 'Modifikasi tautan', + 'Links' => 'Tautan', + 'Link settings' => 'Pengaturan tautan', + 'Opposite label' => 'Label berlawanan', + 'Remove a link' => 'Hapus tautan', + 'Task\'s links' => 'Tautan tugas', + 'The labels must be different' => 'Label harus berbeda', + 'There is no link.' => 'Tidak ada tautan.', + 'This label must be unique' => 'Label ini harus unik', + 'Unable to create your link.' => 'Tidak dapat membuat tautan anda.', + 'Unable to update your link.' => 'Tidak dapat memperbaharui tautan anda.', + 'Unable to remove this link.' => 'Tidak dapat menghapus tautan ini.', + 'relates to' => 'berhubungan dengan', + 'blocks' => 'blok', + 'is blocked by' => 'diblokir oleh', + 'duplicates' => 'duplikat', + 'is duplicated by' => 'diduplikasi oleh', + 'is a child of' => 'anak dari', + 'is a parent of' => 'orant tua dari', + 'targets milestone' => 'milestone target', + 'is a milestone of' => 'adalah milestone dari', + 'fixes' => 'perbaikan', + 'is fixed by' => 'diperbaiki oleh', + 'This task' => 'Tugas ini', + '<1h' => '<1h', + '%dh' => '%dh', + '%b %e' => '%e %b', + 'Expand tasks' => 'Perluas tugas', + 'Collapse tasks' => 'Lipat tugas', + 'Expand/collapse tasks' => 'Perluas/lipat tugas', + 'Close dialog box' => 'Tutup kotak dialog', + 'Submit a form' => 'Submit formulir', + 'Board view' => 'Table halaman', + 'Keyboard shortcuts' => 'pintas keyboard', + 'Open board switcher' => 'Buka table switcher', + 'Application' => 'Aplikasi', + 'since %B %e, %Y at %k:%M %p' => 'sejak %d/%m/%Y à %H:%M', + 'Compact view' => 'Tampilan kompak', + 'Horizontal scrolling' => 'Horisontal bergulir', + 'Compact/wide view' => 'Beralih antara tampilan kompak dan diperluas', + 'No results match:' => 'Tidak ada hasil :', + 'Currency' => 'Mata uang', + 'Files' => 'Arsip', + 'Images' => 'Gambar', + 'Private project' => 'Proyek pribadi', + 'AUD - Australian Dollar' => 'AUD - Dollar Australia', + 'CAD - Canadian Dollar' => 'CAD - Dollar Kanada', + 'CHF - Swiss Francs' => 'CHF - Swiss Prancis', + 'Custom Stylesheet' => 'Kustomisasi Stylesheet', + 'download' => 'unduh', + 'EUR - Euro' => 'EUR - Euro', + 'GBP - British Pound' => 'GBP - Poundsterling inggris', + 'INR - Indian Rupee' => 'INR - Rupe India', + 'JPY - Japanese Yen' => 'JPY - Yen Jepang', + 'NZD - New Zealand Dollar' => 'NZD - Dollar Selandia baru', + 'RSD - Serbian dinar' => 'RSD - Dinar Serbia', + 'USD - US Dollar' => 'USD - Dollar Amerika', + 'Destination column' => 'Kolom tujuan', + 'Move the task to another column when assigned to a user' => 'Pindahkan tugas ke kolom lain ketika ditugaskan ke pengguna', + 'Move the task to another column when assignee is cleared' => 'Pindahkan tugas ke kolom lain ketika orang yang ditugaskan dibersihkan', + 'Source column' => 'Sumber kolom', + 'Transitions' => 'Transisi', + 'Executer' => 'Eksekusi', + 'Time spent in the column' => 'Waktu yang dihabiskan dalam kolom', + 'Task transitions' => 'Transisi tugas', + 'Task transitions export' => 'Ekspor transisi tugas', + 'This report contains all column moves for each task with the date, the user and the time spent for each transition.' => 'Laporan ini berisi semua kolom yang pindah untuk setiap tugas dengan tanggal, pengguna dan waktu yang dihabiskan untuk setiap transisi.', + 'Currency rates' => 'Nilai tukar mata uang', + 'Rate' => 'Tarif', + 'Change reference currency' => 'Mengubah referensi mata uang', + 'Add a new currency rate' => 'Tambahkan nilai tukar mata uang baru', + 'Reference currency' => 'Referensi mata uang', + 'The currency rate have been added successfully.' => 'Nilai tukar mata uang berhasil ditambahkan.', + 'Unable to add this currency rate.' => 'Tidak dapat menambahkan nilai tukar mata uang', + 'Send notifications to a Slack channel' => 'Kirim pemberitahuan ke saluran Slack', + 'Webhook URL' => 'URL webhook', + 'Help on Slack integration' => 'Bantuan pada integrasi Slack', + '%s remove the assignee of the task %s' => '%s menghapus penugasan dari tugas %s', + 'Send notifications to Hipchat' => 'Kirim pemberitahuan ke Hipchat', + 'API URL' => 'API URL', + 'Room API ID or name' => 'Id kamar API atau nama ', + 'Room notification token' => 'Token notifikasi kamar', + 'Help on Hipchat integration' => 'Bantuan pada integrasi Hipchat', + 'Enable Gravatar images' => 'Mengaktifkan gambar Gravatar', + 'Information' => 'Informasi', + 'Check two factor authentication code' => 'Cek dua faktor kode otentifikasi', + 'The two factor authentication code is not valid.' => 'Kode dua faktor kode otentifikasi tidak valid.', + 'The two factor authentication code is valid.' => 'Kode dua faktor kode otentifikasi valid.', + 'Code' => 'Kode', + 'Two factor authentication' => 'Dua faktor otentifikasi', + 'Enable/disable two factor authentication' => 'Matikan/hidupkan dua faktor otentifikasi', + 'This QR code contains the key URI: ' => 'kode QR ini mengandung kunci URI : ', + 'Save the secret key in your TOTP software (by example Google Authenticator or FreeOTP).' => 'Menyimpan kunci rahasia ini dalam perangkat lunak TOTP anda(misalnya Googel Authenticator atau FreeOTP).', + 'Check my code' => 'Memeriksa kode saya', + 'Secret key: ' => 'Kunci rahasia : ', + 'Test your device' => 'Menguji perangkat anda', + 'Assign a color when the task is moved to a specific column' => 'Menetapkan warna ketika tugas tersebut dipindahkan ke kolom tertentu', + '%s via Kanboard' => '%s via Kanboard', + 'uploaded by: %s' => 'diunggah oleh %s', + 'uploaded on: %s' => 'diunggah pada %s', + 'size: %s' => 'ukuran : %s', + 'Burndown chart for "%s"' => 'Grafik Burndown untku « %s »', + 'Burndown chart' => 'Grafik Burndown', + 'This chart show the task complexity over the time (Work Remaining).' => 'Grafik ini menunjukkan kompleksitas tugas dari waktu ke waktu (Sisa Pekerjaan).', + 'Screenshot taken %s' => 'Screenshot diambil %s', + 'Add a screenshot' => 'Tambah screenshot', + 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Mengambil screenshot dan tekan CTRL + V atau ⌘ + V untuk paste di sini.', + 'Screenshot uploaded successfully.' => 'Screenshot berhasil diunggah.', + 'SEK - Swedish Krona' => 'SEK - Krona Swedia', + 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identifier proyek adalah kode alfanumerik opsional digunakan untuk mengidentifikasi proyek Anda.', + 'Identifier' => 'Identifier', + 'Postmark (incoming emails)' => 'Postmark (email masuk)', + 'Help on Postmark integration' => 'Bantuan pada integrasi Postmark', + 'Mailgun (incoming emails)' => 'Mailgun (email masuk)', + 'Help on Mailgun integration' => 'Bantuan pada integrasi Mailgun', + 'Sendgrid (incoming emails)' => 'Sendgrid (email masuk)', + 'Help on Sendgrid integration' => 'Bantuan pada integrasi Sendgrid', + 'Disable two factor authentication' => 'Matikan dua faktor otentifikasi', + 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Apakah anda yakin akan mematikan dua faktor otentifikasi untuk pengguna ini : « %s » ?', + 'Edit link' => 'Modifikasi tautan', + 'Start to type task title...' => 'Mulai mengetik judul tugas...', + 'A task cannot be linked to itself' => 'Sebuah tugas tidak dapat dikaitkan dengan dirinya sendiri', + 'The exact same link already exists' => 'Tautan yang sama persis sudah ada', + 'Recurrent task is scheduled to be generated' => 'Tugas berulang dijadwalkan akan dihasilkan', + 'Recurring information' => 'Informasi berulang', + 'Score' => 'Skor', + 'The identifier must be unique' => 'Identifier harus unik', + 'This linked task id doesn\'t exists' => 'Id tugas terkait tidak ada', + 'This value must be alphanumeric' => 'Nilai harus alfanumerik', + 'Edit recurrence' => 'Modifikasi pengulangan', + 'Generate recurrent task' => 'Menghasilkan tugas berulang', + 'Trigger to generate recurrent task' => 'Memicu untuk menghasilkan tugas berulang', + 'Factor to calculate new due date' => 'Faktor untuk menghitung tanggal jatuh tempo baru', + 'Timeframe to calculate new due date' => 'Jangka waktu untuk menghitung tanggal jatuh tempo baru', + 'Base date to calculate new due date' => 'Tanggal dasar untuk menghitung tanggal jatuh tempo baru', + 'Action date' => 'Tanggal aksi', + 'Base date to calculate new due date: ' => 'Tanggal dasar untuk menghitung tanggal jatuh tempo baru: ', + 'This task has created this child task: ' => 'Tugas ini telah menciptakan tugas anak ini: ', + 'Day(s)' => 'Hari', + 'Existing due date' => 'Batas waktu yang ada', + 'Factor to calculate new due date: ' => 'Faktor untuk menghitung tanggal jatuh tempo baru: ', + 'Month(s)' => 'Bulan', + 'Recurrence' => 'Pengulangan', + 'This task has been created by: ' => 'Tugas ini telah dibuat oleh:', + 'Recurrent task has been generated:' => 'Tugas berulang telah dihasilkan:', + 'Timeframe to calculate new due date: ' => 'Jangka waktu untuk menghitung tanggal jatuh tempo baru: ', + 'Trigger to generate recurrent task: ' => 'Pemicu untuk menghasilkan tugas berulang: ', + 'When task is closed' => 'Ketika tugas ditutup', + 'When task is moved from first column' => 'Ketika tugas dipindahkan dari kolom pertama', + 'When task is moved to last column' => 'Ketika tugas dipindahkan ke kolom terakhir', + 'Year(s)' => 'Tahun', + 'Jabber (XMPP)' => 'Jabber (XMPP)', + 'Send notifications to Jabber' => 'Kirim pemberitahuan ke Jabber', + 'XMPP server address' => 'alamat server XMPP', + 'Jabber domain' => 'Domain Jabber', + 'Jabber nickname' => 'Nickname Jabber', + 'Multi-user chat room' => 'Multi-pengguna kamar obrolan', + 'Help on Jabber integration' => 'Bantuan pada integrasi Jabber', + 'The server address must use this format: "tcp://hostname:5222"' => 'Alamat server harus menggunakan format ini : « tcp://hostname:5222 »', + 'Calendar settings' => 'Pengaturan kalender', + 'Project calendar view' => 'Tampilan kalender proyek', + 'Project settings' => 'Pengaturan proyek', + 'Show subtasks based on the time tracking' => 'Tampilkan subtugas berdasarkan pelacakan waktu', + 'Show tasks based on the creation date' => 'Tampilkan tugas berdasarkan tanggal pembuatan', + 'Show tasks based on the start date' => 'Tampilkan tugas berdasarkan tanggal mulai', + 'Subtasks time tracking' => 'Pelacakan waktu subtgas', + 'User calendar view' => 'Pengguna tampilan kalender', + 'Automatically update the start date' => 'Memperbarui tanggal mulai otomatis', + 'iCal feed' => 'iCal feed', + 'Preferences' => 'Preferensi', + 'Security' => 'Keamanan', + 'Two factor authentication disabled' => 'Otentifikasi dua faktor dimatikan', + 'Two factor authentication enabled' => 'Otentifikasi dua faktor dihidupkan', + 'Unable to update this user.' => 'Tidak dapat memperbarui pengguna ini.', + 'There is no user management for private projects.' => 'Tidak ada manajemen pengguna untuk proyek-proyek pribadi.', + 'User that will receive the email' => 'Pengguna yang akan menerima email', + 'Email subject' => 'Subjek Email', + 'Date' => 'Tanggal', + 'By @%s on Bitbucket' => 'Oleh @%s pada Bitbucket', + 'Bitbucket Issue' => 'Tiket Bitbucket', + 'Commit made by @%s on Bitbucket' => 'Komit dibuat oleh @%s pada Bitbucket', + 'Commit made by @%s on Github' => 'Komit dibuat oleh @%s pada Github', + 'By @%s on Github' => 'Oleh @%s pada Github', + 'Commit made by @%s on Gitlab' => 'Komit dibuat oleh @%s pada Gitlab', + 'Add a comment log when moving the task between columns' => 'Menambahkan log komentar ketika memindahkan tugas antara kolom', + 'Move the task to another column when the category is changed' => 'Pindahkan tugas ke kolom lain ketika kategori berubah', + 'Send a task by email to someone' => 'Kirim tugas melalui email ke seseorang', + 'Reopen a task' => 'Membuka kembali tugas', + 'Bitbucket issue opened' => 'Tiket Bitbucket dibuka', + 'Bitbucket issue closed' => 'Tiket Bitbucket ditutup', + 'Bitbucket issue reopened' => 'Tiket Bitbucket dibuka kembali', + 'Bitbucket issue assignee change' => 'Perubahan penugasan tiket Bitbucket', + 'Bitbucket issue comment created' => 'Komentar dibuat tiket Bitbucket', + 'Column change' => 'Kolom berubah', + 'Position change' => 'Posisi berubah', + 'Swimlane change' => 'Swimlane berubah', + 'Assignee change' => 'Penerima berubah', + '[%s] Overdue tasks' => '[%s] Tugas terlambat', + 'Notification' => 'Pemberitahuan', + '%s moved the task #%d to the first swimlane' => '%s memindahkan tugas n°%d ke swimlane pertama', + '%s moved the task #%d to the swimlane "%s"' => '%s memindahkan tugas n°%d ke swimlane « %s »', + 'Swimlane' => 'Swimlane', + 'Gravatar' => 'Gravatar', + 'Hipchat' => 'Hipchat', + 'Slack' => 'Slack', + '%s moved the task %s to the first swimlane' => '%s memindahkan tugas %s ke swimlane pertama', + '%s moved the task %s to the swimlane "%s"' => '%s memindahkan tugas %s ke swimlane « %s »', + 'This report contains all subtasks information for the given date range.' => 'Laporan ini berisi semua informasi subtugas untuk rentang tanggal tertentu.', + 'This report contains all tasks information for the given date range.' => 'Laporan ini berisi semua informasi tugas untuk rentang tanggal tertentu.', + 'Project activities for %s' => 'Aktifitas proyek untuk « %s »', + 'view the board on Kanboard' => 'lihat papan di Kanboard', + 'The task have been moved to the first swimlane' => 'Tugas telah dipindahkan ke swimlane pertama', + 'The task have been moved to another swimlane:' => 'Tugas telah dipindahkan ke swimlane lain:', + 'Overdue tasks for the project "%s"' => 'Tugas terlambat untuk proyek « %s »', + 'New title: %s' => 'Judul baru : %s', + 'The task is not assigned anymore' => 'Tugas tidak ditugaskan lagi', + 'New assignee: %s' => 'Penerima baru : %s', + 'There is no category now' => 'Tidak ada kategori untuk sekarang', + 'New category: %s' => 'Kategori baru : %s', + 'New color: %s' => 'Warna baru : %s', + 'New complexity: %d' => 'Kompleksitas baru : %d', + 'The due date have been removed' => 'Tanggal jatuh tempo telah dihapus', + 'There is no description anymore' => 'Tidak ada deskripsi lagi', + 'Recurrence settings have been modified' => 'Pengaturan pengulangan telah dimodifikasi', + 'Time spent changed: %sh' => 'Waktu yang dihabiskan berubah : %sh', + 'Time estimated changed: %sh' => 'Perkiraan waktu berubah : %sh', + 'The field "%s" have been updated' => 'Field « %s » telah diperbaharui', + 'The description have been modified' => 'Deskripsi telah dimodifikasi', + 'Do you really want to close the task "%s" as well as all subtasks?' => 'Apakah anda yakin akan menutup tugas « %s » beserta semua sub-tugasnya ?', + 'Swimlane: %s' => 'Swimlane : %s', + 'I want to receive notifications for:' => 'Saya ingin menerima pemberitahuan untuk :', + 'All tasks' => 'Semua tugas', + 'Only for tasks assigned to me' => 'Hanya untuk tugas yang ditugaskan ke saya', + 'Only for tasks created by me' => 'Hanya untuk tugas yang dibuat oleh saya', + 'Only for tasks created by me and assigned to me' => 'Hanya untuk tugas yang dibuat oleh saya dan ditugaskan ke saya', + '%A' => '%A', + '%b %e, %Y, %k:%M %p' => '%d/%m/%Y %H:%M', + 'New due date: %B %e, %Y' => 'Tanggal jatuh tempo baru : %d/%m/%Y', + 'Start date changed: %B %e, %Y' => 'Tanggal mulai berubah : %d/%m/%Y', + '%k:%M %p' => '%H:%M', + '%%Y-%%m-%%d' => '%%d/%%m/%%Y', + 'Total for all columns' => 'Total untuk semua kolom', + 'You need at least 2 days of data to show the chart.' => 'Anda memerlukan setidaknya 2 hari dari data yang menunjukkan grafik.', + '<15m' => '<15m', + '<30m' => '<30m', + 'Stop timer' => 'Hentikan timer', + 'Start timer' => 'Mulai timer', + 'Add project member' => 'Tambahkan anggota proyek', + 'Enable notifications' => 'Aktifkan pemberitahuan', + 'My activity stream' => 'Aliran kegiatan saya', + 'My calendar' => 'Kalender saya', + 'Search tasks' => 'Cari tugas', + 'Back to the calendar' => 'Kembali ke kalender', + 'Filters' => 'Filter', + 'Reset filters' => 'Reset ulang filter', + 'My tasks due tomorrow' => 'Tugas saya yang berakhir besok', + 'Tasks due today' => 'Tugas yang berakhir hari ini', + 'Tasks due tomorrow' => 'Tugas yang berakhir besok', + 'Tasks due yesterday' => 'Tugas yang berakhir kemarin', + 'Closed tasks' => 'Tugas yang ditutup', + 'Open tasks' => 'Buka Tugas', + 'Not assigned' => 'Tidak ditugaskan', + 'View advanced search syntax' => 'Lihat sintaks pencarian lanjutan', + 'Overview' => 'Ikhtisar', + '%b %e %Y' => '%b %e %Y', + 'Board/Calendar/List view' => 'Tampilan Papan/Kalender/Daftar', + 'Switch to the board view' => 'Beralih ke tampilan papan', + 'Switch to the calendar view' => 'Beralih ke tampilan kalender', + 'Switch to the list view' => 'Beralih ke tampilan daftar', + 'Go to the search/filter box' => 'Pergi ke kotak pencarian/filter', + 'There is no activity yet.' => 'Tidak ada aktifitas saat ini.', + 'No tasks found.' => 'Tidak ada tugas yang ditemukan.', + 'Keyboard shortcut: "%s"' => 'Keyboard shortcut : « %s »', + 'List' => 'Daftar', + 'Filter' => 'Filter', + 'Advanced search' => 'Pencarian lanjutan', + 'Example of query: ' => 'Contoh dari query : ', + 'Search by project: ' => 'Pencarian berdasarkan proyek : ', + 'Search by column: ' => 'Pencarian berdasarkan kolom : ', + 'Search by assignee: ' => 'Pencarian berdasarkan penerima : ', + 'Search by color: ' => 'Pencarian berdasarkan warna : ', + 'Search by category: ' => 'Pencarian berdasarkan kategori : ', + 'Search by description: ' => 'Pencarian berdasarkan deskripsi : ', + 'Search by due date: ' => 'Pencarian berdasarkan tanggal jatuh tempo : ', + 'Lead and Cycle time for "%s"' => 'Memimpin dan Siklus waktu untuk « %s »', + 'Average time spent into each column for "%s"' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom untuk « %s »', + 'Average time spent into each column' => 'Rata-rata waktu yang dihabiskan dalam setiap kolom', + 'Average time spent' => 'Rata-rata waktu yang dihabiskan', + 'This chart show the average time spent into each column for the last %d tasks.' => 'Grafik ini menunjukkan rata-rata waktu yang dihabiskan dalam setiap kolom untuk %d tugas.', + 'Average Lead and Cycle time' => 'Rata-rata Memimpin dan Siklus waktu', + 'Average lead time: ' => 'Rata-rata waktu pimpinan : ', + 'Average cycle time: ' => 'Rata-rata siklus waktu : ', + 'Cycle Time' => 'Siklus Waktu', + 'Lead Time' => 'Lead Time', + 'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Grafik ini menunjukkan memimpin rata-rata dan waktu siklus untuk %d tugas terakhir dari waktu ke waktu.', + 'Average time into each column' => 'Rata-rata waktu ke setiap kolom', + 'Lead and cycle time' => 'Lead dan siklus waktu', + 'Google Authentication' => 'Google Otentifikasi', + 'Help on Google authentication' => 'Bantuan pada otentifikasi Google', + 'Github Authentication' => 'Otentifikasi Github', + 'Help on Github authentication' => 'Bantuan pada otentifikasi Github', + 'Channel/Group/User (Optional)' => 'Kanal/Grup/Pengguna (pilihan)', + 'Lead time: ' => 'Lead time : ', + 'Cycle time: ' => 'Siklus waktu : ', + 'Time spent into each column' => 'Waktu yang dihabiskan di setiap kolom', + 'The lead time is the duration between the task creation and the completion.' => 'Lead time adalah durasi antara pembuatan tugas dan penyelesaian.', + 'The cycle time is the duration between the start date and the completion.' => 'Siklus waktu adalah durasi antara tanggal mulai dan tanggal penyelesaian.', + 'If the task is not closed the current time is used instead of the completion date.' => 'Jika tugas tidak ditutup waktu saat ini yang digunakan sebagai pengganti tanggal penyelesaian.', + 'Set automatically the start date' => 'Secara otomatis mengatur tanggal mulai', + 'Edit Authentication' => 'Modifikasi Otentifikasi', + 'Google Id' => 'Id Google', + 'Github Id' => 'Id Github', + 'Remote user' => 'Pengguna jauh', + 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Pengguna jauh tidak menyimpan kata sandi mereka dalam basis data Kanboard, contoh: akun LDAP, Google dan Github.', + 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Jika anda mencentang kotak "Larang formulir login", kredensial masuk ke formulis login akan diabaikan.', + 'By @%s on Gitlab' => 'Dengan @%s pada Gitlab', + 'Gitlab issue comment created' => 'Komentar dibuat pada tiket Gitlab', + 'New remote user' => 'Pengguna baru jauh', + 'New local user' => 'Pengguna baru lokal', + 'Default task color' => 'Standar warna tugas', + 'Hide sidebar' => 'Sembunyikan sidebar', + 'Expand sidebar' => 'Perluas sidebar', + 'This feature does not work with all browsers.' => 'Fitur ini tidak dapat digunakan di semua browsers', + 'There is no destination project available.' => 'Tidak ada destinasi proyek yang tersedia.', + 'Trigger automatically subtask time tracking' => 'Otomatis memicu pelacakan untuk subtugas', + 'Include closed tasks in the cumulative flow diagram' => 'Termasuk tugas yang ditutup pada diagram aliran kumulatif', + 'Current swimlane: %s' => 'Swimlane saat ini : %s', + 'Current column: %s' => 'Kolom saat ini : %s', + 'Current category: %s' => 'Kategori saat ini : %s', + 'no category' => 'tidak ada kategori', + 'Current assignee: %s' => 'Saat ini ditugaskan : %s', + 'not assigned' => 'Belum ditugaskan', + 'Author:' => 'Penulis :', + 'contributors' => 'kontributor', + 'License:' => 'Lisensi :', + 'License' => 'Lisensi', + 'Project Administrator' => 'Administrator proyek', + 'Enter the text below' => 'Masukkan teks di bawah', + 'Gantt chart for %s' => 'Grafik Gantt untuk %s', + 'Sort by position' => 'Urutkan berdasarkan posisi', + 'Sort by date' => 'Urutkan berdasarkan tanggal', + 'Add task' => 'Tambah tugas', + 'Start date:' => 'Tanggal mulai :', + 'Due date:' => 'Batas waktu :', + 'There is no start date or due date for this task.' => 'Tidak ada tanggal mulai dan batas waktu untuk tugas ini.', + 'Moving or resizing a task will change the start and due date of the task.' => 'Memindahkan atau mengubah ukuran tugas anda akan mengubah tanggal mulai dan batas waktu dari tugas ini.', + 'There is no task in your project.' => 'Tidak ada tugas didalam proyek anda.', + 'Gantt chart' => 'Grafik Gantt', + 'People who are project managers' => 'Orang-orang yang menjadi manajer proyek', + 'People who are project members' => 'Orang-orang yang menjadi anggota proyek', + 'NOK - Norwegian Krone' => 'NOK - Krone Norwegia', + 'Show this column' => 'Perlihatkan kolom ini', + 'Hide this column' => 'Sembunyikan kolom ini', + 'open file' => 'buka berkas', + 'End date' => 'Waktu berakhir', + 'Users overview' => 'Ikhtisar pengguna', + 'Managers' => 'Manajer', + 'Members' => 'Anggota', + 'Shared project' => 'Proyek bersama', + 'Project managers' => 'Manajer proyek', + 'Project members' => 'Anggota proyek', + 'Gantt chart for all projects' => 'Grafik Gantt untuk semua proyek', + 'Projects list' => 'Daftar proyek', + 'Gantt chart for this project' => 'Grafik Gantt untuk proyek ini', + 'Project board' => 'Papan proyek', + 'End date:' => 'Waktu berakhir :', + 'There is no start date or end date for this project.' => 'Tidak ada waktu mulai atau waktu berakhir untuk proyek ini', + 'Projects Gantt chart' => 'Proyek grafik Gantt', + 'Start date: %s' => 'Waktu mulai : %s', + 'End date: %s' => 'Waktu berakhir : %s', + 'Link type' => 'Tipe tautan', + 'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan tautan tugas yang spesifik', + 'Task link creation or modification' => 'Tautan pembuatan atau modifikasi tugas ', + 'Login with my Gitlab Account' => 'Masuk menggunakan akun Gitlab saya', + 'Milestone' => 'Milestone', + 'Gitlab Authentication' => 'Authentification Gitlab', + 'Help on Gitlab authentication' => 'Bantuan pada otentifikasi Gitlab', + 'Gitlab Id' => 'Id Gitlab', + 'Gitlab Account' => 'Akun Gitlab', + 'Link my Gitlab Account' => 'Hubungkan akun Gitlab saya', + 'Unlink my Gitlab Account' => 'Putuskan akun Gitlab saya', + 'Documentation: %s' => 'Dokumentasi : %s', + 'Switch to the Gantt chart view' => 'Beralih ke tampilan grafik Gantt', + 'Reset the search/filter box' => 'Atur ulang pencarian/kotak filter', + 'Documentation' => 'Dokumentasi', + 'Table of contents' => 'Daftar isi', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Bantuan dengan izin proyek', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', +); diff --git a/sources/app/Locale/it_IT/translations.php b/sources/app/Locale/it_IT/translations.php index 06e2c5c..a9f19d8 100644 --- a/sources/app/Locale/it_IT/translations.php +++ b/sources/app/Locale/it_IT/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Abilitato', 'Disabled' => 'Disabilitato', - 'Google account linked' => 'Account Google collegato', - 'Github account linked' => 'Account Github collegato', // 'Username:' => '', 'Name:' => 'Nome:', // 'Email:' => '', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Scrolling orizzontale', 'Compact/wide view' => 'Vista compatta/estesa', 'No results match:' => 'Nessun risultato trovato:', - 'Remove hourly rate' => 'Rimuovi tariffa oraria', - 'Do you really want to remove this hourly rate?' => 'Vuoi davvero rimuovere questa tariffa oraria?', - 'Hourly rates' => 'Tariffe orarie', - 'Hourly rate' => 'Tariffa oraria', 'Currency' => 'Valuta', - 'Effective date' => 'Data effettiva', - 'Add new rate' => 'Aggiungi una nuova tariffa', - 'Rate removed successfully.' => 'Tariffa rimossa con successo.', - 'Unable to remove this rate.' => 'Impossibile rimuovere questa tariffa.', - 'Unable to save the hourly rate.' => 'Impossibile salvare la tariffa oraria.', - 'Hourly rate created successfully.' => 'Tariffa oraria creata con successo.', - 'Start time' => 'Data di inizio', - 'End time' => 'Data di completamento', - 'Comment' => 'Commento', - 'All day' => 'Tutto il giorno', - 'Day' => 'Giorno', - 'Manage timetable' => 'Gestisci orario', - 'Overtime timetable' => 'Straordinari', - 'Time off timetable' => 'Fuori orario', - 'Timetable' => 'Orario', - 'Work timetable' => 'Orario di lavoro', - 'Week timetable' => 'Orario settimanale', - 'Day timetable' => 'Orario giornaliero', - 'From' => 'Da', - 'To' => 'A', - 'Time slot created successfully.' => 'Fascia oraria creata con successo.', - 'Unable to save this time slot.' => 'Impossibile creare questa fascia oraria.', - 'Time slot removed successfully.' => 'Fascia oraria rimossa con successo.', - 'Unable to remove this time slot.' => 'Impossibile rimuovere questa fascia oraria.', - 'Do you really want to remove this time slot?' => 'Vuoi davvero rimuovere questa fascia oraria?', - 'Remove time slot' => 'Rimuovi fascia oraria', - 'Add new time slot' => 'Aggiungi nuova fascia oraria', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Questo orario è utilizzato quando la casella "tutto il giorno" è selezionata per i fuori orari e per gli straordinari', // 'Files' => '', 'Images' => 'Immagini', 'Private project' => 'Progetto privato', - 'Amount' => 'Totale', 'AUD - Australian Dollar' => 'AUD - Dollari Australiani', - 'Budget' => 'Bilancio', - 'Budget line' => 'Limite di bilancio', - 'Budget line removed successfully.' => 'Limite al bilancio rimosso con successo.', - 'Budget lines' => 'Limiti al bilancio', 'CAD - Canadian Dollar' => 'CAD - Dollari Canadesi', 'CHF - Swiss Francs' => 'CHF - Franchi Svizzeri', - 'Cost' => 'Costi', - 'Cost breakdown' => 'Abbattimento dei costi', 'Custom Stylesheet' => 'CSS personalizzato', // 'download' => '', - 'Do you really want to remove this budget line?' => 'Vuoi davvero rimuovere questo limite al bilancio?', // 'EUR - Euro' => '', - 'Expenses' => 'Spese', 'GBP - British Pound' => 'GBP - Pound Inglesi', 'INR - Indian Rupee' => 'INR - Rupie Indiani', 'JPY - Japanese Yen' => 'JPY - Yen Giapponesi', - 'New budget line' => 'Nuovo limite al bilancio', 'NZD - New Zealand Dollar' => 'NZD - Dollari della Nuova Zelanda', - 'Remove a budget line' => 'Rimuovi un limite al bilancio', - 'Remove budget line' => 'Rimuovi limite di bilancio', 'RSD - Serbian dinar' => 'RSD - Dinar Serbi', - 'The budget line have been created successfully.' => 'Il limite al bilancio è stato creato correttamente', - 'Unable to create the budget line.' => 'Impossibile creare il limite al bilancio', - 'Unable to remove this budget line.' => 'Impossibile rimuovere questo limite al bilancio.', 'USD - US Dollar' => 'USD - Dollari Americani', - 'Remaining' => 'Restanti', 'Destination column' => 'Colonna destinazione', 'Move the task to another column when assigned to a user' => 'Sposta il compito in un\'altra colonna quando viene assegnato ad un utente', 'Move the task to another column when assignee is cleared' => 'Sposta il compito in un\'altra colonna quando l\'assegnatario cancellato', 'Source column' => 'Colonna sorgente', - // 'Show subtask estimates (forecast of future work)' => '', 'Transitions' => 'Transizioni', 'Executer' => 'Esecutore', 'Time spent in the column' => 'Tempo trascorso nella colonna', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Cambio', 'Change reference currency' => 'Cambia la valuta di riferimento', 'Add a new currency rate' => 'Aggiungi un nuovo tasso di cambio', - 'Currency rates are used to calculate project budget.' => 'I tassi di cambio sono utilizzati per calcolare i bilanci dei progetti', 'Reference currency' => 'Valuta di riferimento', 'The currency rate have been added successfully.' => 'Il tasso di cambio è stato aggiunto con successo.', 'Unable to add this currency rate.' => 'Impossibile aggiungere questo tasso di cambio.', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/ja_JP/translations.php b/sources/app/Locale/ja_JP/translations.php index cb8c550..001fd01 100644 --- a/sources/app/Locale/ja_JP/translations.php +++ b/sources/app/Locale/ja_JP/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'リモート', 'Enabled' => '有効', 'Disabled' => '無効', - 'Google account linked' => 'Google アカウントがリンク', - 'Github account linked' => 'Github のアカウントがリンク', 'Username:' => 'ユーザ名:', 'Name:' => '名前:', 'Email:' => 'Email:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => '縦スクロール', 'Compact/wide view' => 'コンパクト/ワイドビュー', 'No results match:' => '結果が一致しませんでした', - 'Remove hourly rate' => '毎時レートを削除', - 'Do you really want to remove this hourly rate?' => '毎時レートを削除しますか?', - 'Hourly rates' => '毎時レート', - 'Hourly rate' => '毎時レート', 'Currency' => '通貨', - 'Effective date' => '有効期限', - 'Add new rate' => '新しいレート', - 'Rate removed successfully.' => 'レートの削除に成功しました。', - 'Unable to remove this rate.' => 'レートを削除できませんでした。', - 'Unable to save the hourly rate.' => '時間毎のレートを保存できませんでした。', - 'Hourly rate created successfully.' => '時間毎のレートを作成しました。', - 'Start time' => '開始時間', - 'End time' => '終了時間', - 'Comment' => 'コメント', - 'All day' => '終日', - 'Day' => '日', - 'Manage timetable' => 'タイムテーブルの管理', - 'Overtime timetable' => '残業タイムテーブル', - 'Time off timetable' => '休暇タイムテーブル', - 'Timetable' => 'タイムテーブル', - 'Work timetable' => 'ワークタイムテーブル', - 'Week timetable' => '週次タイムテーブル', - 'Day timetable' => '日時タイムテーブル', - 'From' => 'ここから', - 'To' => 'ここまで', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - 'Remove time slot' => 'タイムスロットの削除', - 'Add new time slot' => 'タイムラインの追加', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'このタイムテーブルは、残業や休暇で全日がチェックされた場合に用いられます。', 'Files' => 'ファイル', 'Images' => '画像', 'Private project' => 'プライベートプロジェクト', - 'Amount' => '数量', 'AUD - Australian Dollar' => 'AUD - 豪ドル', - 'Budget' => '予算', - 'Budget line' => '予算ライン', - 'Budget line removed successfully.' => '予算ラインを削除しました.', - 'Budget lines' => '予算ライン', 'CAD - Canadian Dollar' => 'CAD - 加ドル', 'CHF - Swiss Francs' => 'CHF - スイスフラン', - 'Cost' => 'コスト', - 'Cost breakdown' => 'コストブレークダウン', 'Custom Stylesheet' => 'カスタムスタイルシート', 'download' => 'ダウンロード', - 'Do you really want to remove this budget line?' => 'この予算ラインを本当に削除しますか?', 'EUR - Euro' => 'EUR - ユーロ', - 'Expenses' => '支出', 'GBP - British Pound' => 'GBP - 独ポンド', 'INR - Indian Rupee' => 'INR - 伊ルピー', 'JPY - Japanese Yen' => 'JPY - 日本円', - 'New budget line' => '新しい予算ライン', 'NZD - New Zealand Dollar' => 'NZD - NZ ドル', - 'Remove a budget line' => '予算ラインの削除', - 'Remove budget line' => '予算ラインの削除', 'RSD - Serbian dinar' => 'RSD - セルビアデナール', - 'The budget line have been created successfully.' => '予算ラインを作成しました', - 'Unable to create the budget line.' => '予算ラインを作成できませんでした。', - 'Unable to remove this budget line.' => '予算ラインを削除できませんでした。', 'USD - US Dollar' => 'USD - 米ドル', - 'Remaining' => '残り', 'Destination column' => '移動先のカラム', 'Move the task to another column when assigned to a user' => 'ユーザの割り当てをしたらタスクを他のカラムに移動', 'Move the task to another column when assignee is cleared' => 'ユーザの割り当てがなくなったらタスクを他のカラムに移動', 'Source column' => '移動元のカラム', - // 'Show subtask estimates (forecast of future work)' => '', 'Transitions' => '履歴', 'Executer' => '実行者', 'Time spent in the column' => 'カラムでの時間消費', @@ -746,7 +695,6 @@ return array( 'Rate' => 'レート', 'Change reference currency' => '現在の基軸通貨', 'Add a new currency rate' => '新しい通貨レートを追加', - 'Currency rates are used to calculate project budget.' => '通貨レートはプロジェクト予算の算出に利用されます。', 'Reference currency' => '基軸通貨', // 'The currency rate have been added successfully.' => '', 'Unable to add this currency rate.' => 'この通貨レートを追加できません。', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/nb_NO/translations.php b/sources/app/Locale/nb_NO/translations.php index 155d49b..b1aaf48 100644 --- a/sources/app/Locale/nb_NO/translations.php +++ b/sources/app/Locale/nb_NO/translations.php @@ -1,8 +1,8 @@ '', - // 'number.thousands_separator' => '', + 'number.decimals_separator' => ',', + 'number.thousands_separator' => '.', 'None' => 'Ingen', 'edit' => 'rediger', 'Edit' => 'Rediger', @@ -79,7 +79,7 @@ return array( 'Assigned to %s' => 'Tildelt: %s', 'Remove a column' => 'Fjern en kolonne', 'Remove a column from a board' => 'Fjern en kolonne fra et board', - 'Unable to remove this column.' => 'Ikke mulig fjerne denne kolonnen', + 'Unable to remove this column.' => 'Ikke mulig ø fjerne denne kolonnen', 'Do you really want to remove this column: "%s"?' => 'Vil du fjerne denne kolonnen: "%s"?', 'This action will REMOVE ALL TASKS associated to this column!' => 'Denne handlingen vil SLETTE ALLE OPPGAVER tilknyttet denne kolonnen', 'Settings' => 'Innstillinger', @@ -100,7 +100,7 @@ return array( 'Create another task' => 'Opprett en annen oppgave', 'New task' => 'Ny oppgave', 'Open a task' => 'Åpne en oppgave', - 'Do you really want to open this task: "%s"?' => 'Vil du åpe denne oppgaven: "%s"?', + 'Do you really want to open this task: "%s"?' => 'Vil du åpne denne oppgaven: "%s"?', 'Back to the board' => 'Tilbake til prosjektsiden', 'Created on %B %e, %Y at %k:%M %p' => 'Opprettet %d.%m.%Y - %H:%M', 'There is nobody assigned' => 'Mangler tildeling', @@ -121,7 +121,7 @@ return array( 'Passwords don\'t match' => 'Passordene stemmer ikke overens', 'The confirmation is required' => 'Bekreftelse er nødvendig', 'The project is required' => 'Prosjektet er påkrevet', - 'The id is required' => 'Id\'en er påkrevd', + 'The id is required' => 'Id\'en er pøøkrevet', 'The project id is required' => 'Prosjektet-id er påkrevet', 'The project name is required' => 'Prosjektnavn er påkrevet', 'This project must be unique' => 'Prosjektnavnet skal være unikt', @@ -149,7 +149,7 @@ return array( 'Task created successfully.' => 'Oppgaven er opprettet.', 'User created successfully.' => 'Brukeren er opprettet.', 'Unable to create your user.' => 'Brukeren kunne ikke opprettes.', - 'User updated successfully.' => 'Brukeren er opdateret', + 'User updated successfully.' => 'Brukeren er oppdatert', 'Unable to update your user.' => 'Din bruker kunne ikke oppdateres.', 'User removed successfully.' => 'Brukeren er fjernet.', 'Unable to remove this user.' => 'Brukeren kunne ikke slettes.', @@ -175,10 +175,10 @@ return array( 'Page not found' => 'Siden er ikke funnet', 'Complexity' => 'Kompleksitet', 'Task limit' => 'Oppgave begrensning', - // 'Task count' => '', + 'Task count' => 'Antall oppgaver', 'Edit project access list' => 'Endre tillatelser for prosjektet', 'Allow this user' => 'Tillat denne brukeren', - 'Don\'t forget that administrators have access to everything.' => 'Hust at administratorer har tilgang til alt.', + 'Don\'t forget that administrators have access to everything.' => 'Husk at administratorer har tilgang til alt.', 'Revoke' => 'Fjern', 'List of authorized users' => 'Liste over autoriserte brukere', 'User' => 'Bruker', @@ -205,16 +205,16 @@ return array( 'Automatic actions for the project "%s"' => 'Automatiske handlinger for prosjektet "%s"', 'Defined actions' => 'Definerte handlinger', 'Add an action' => 'Legg til en handling', - 'Event name' => 'Begivenhet', + 'Event name' => 'Hendelsehet', 'Action name' => 'Handling', 'Action parameters' => 'Handlingsparametre', 'Action' => 'Handling', - 'Event' => 'Begivenhet', - 'When the selected event occurs execute the corresponding action.' => 'Når den valgtebegivenheten oppstår, utføre tilsvarende handlin.', + 'Event' => 'Hendelse', + 'When the selected event occurs execute the corresponding action.' => 'Når den valgte hendelsen oppstår, utfør tilsvarende handling.', 'Next step' => 'Neste', 'Define action parameters' => 'Definer handlingsparametre', 'Save this action' => 'Lagre handlingen', - 'Do you really want to remove this action: "%s"?' => 'Vil du virkelig slette denne handlingen: "%s"?', + 'Do you really want to remove this action: "%s"?' => 'Vil du slette denne handlingen: "%s"?', 'Remove an automatic action' => 'Fjern en automatisk handling', 'Assign the task to a specific user' => 'Tildel oppgaven til en bestemt bruker', 'Assign the task to the person who does the action' => 'Tildel oppgaven til den person, som utfører handlingen', @@ -236,13 +236,13 @@ return array( 'Remove a comment' => 'Fjern en kommentar', 'Comment removed successfully.' => 'Kommentaren ble fjernet.', 'Unable to remove this comment.' => 'Kommentaren kunne ikke fjernes.', - 'Do you really want to remove this comment?' => 'Vil du virkelig fjerne denne kommentaren?', + 'Do you really want to remove this comment?' => 'Vil du fjerne denne kommentaren?', 'Only administrators or the creator of the comment can access to this page.' => 'Kun administrator eller brukeren, som har oprettet kommentaren har adgang til denne siden.', 'Current password for the user "%s"' => 'Aktivt passord for brukeren "%s"', 'The current password is required' => 'Passord er påkrevet', 'Wrong password' => 'Feil passord', 'Unknown' => 'Ukjent', - 'Last logins' => 'Siste login', + 'Last logins' => 'Siste innlogging', 'Login date' => 'Login dato', 'Authentication method' => 'Godkjenningsmetode', 'IP address' => 'IP Adresse', @@ -275,7 +275,7 @@ return array( 'Task removed successfully.' => 'Oppgaven er fjernet.', 'Unable to remove this task.' => 'Oppgaven kunne ikke fjernes.', 'Remove a task' => 'Fjern en oppgave', - 'Do you really want to remove this task: "%s"?' => 'Vil du virkelig fjerne denne opgave: "%s"?', + 'Do you really want to remove this task: "%s"?' => 'Vil du fjerne denne oppgaven: "%s"?', 'Assign automatically a color based on a category' => 'Tildel automatisk en farge baseret for en kategori', 'Assign automatically a category based on a color' => 'Tildel automatisk en kategori basert på en farve', 'Task creation or modification' => 'Oppgaveopprettelse eller endring', @@ -293,7 +293,7 @@ return array( 'Category modification for the project "%s"' => 'Endring av kategori for prosjektet "%s"', 'Category Name' => 'Kategorinavn', 'Add a new category' => 'Legg til ny kategori', - 'Do you really want to remove this category: "%s"?' => 'Vil du virkelig fjerne kategorien: "%s"?', + 'Do you really want to remove this category: "%s"?' => 'Vil du fjerne kategorien: "%s"?', 'All categories' => 'Alle kategorier', 'No category' => 'Ingen kategori', 'The name is required' => 'Navnet er påkrevet', @@ -301,9 +301,9 @@ return array( 'Unable to remove this file.' => 'Filen kunne ikke fjernes.', 'File removed successfully.' => 'Filen er fjernet.', 'Attach a document' => 'Legg til et dokument', - 'Do you really want to remove this file: "%s"?' => 'Vil du virkelig fjerne filen: "%s"?', - 'open' => 'åpen', - 'Attachments' => 'Vedleggr', + 'Do you really want to remove this file: "%s"?' => 'Vil du fjerne filen: "%s"?', + 'open' => 'øpen', + 'Attachments' => 'Vedlegg', 'Edit the task' => 'Rediger oppgaven', 'Edit the description' => 'Rediger beskrivelsen', 'Add a comment' => 'Legg til en kommentar', @@ -312,7 +312,7 @@ return array( 'Time tracking' => 'Tidsregistrering', 'Estimate:' => 'Estimat:', 'Spent:' => 'Brukt:', - 'Do you really want to remove this sub-task?' => 'Vil du virkelig fjerne denne deloppgaven?', + 'Do you really want to remove this sub-task?' => 'Vil du fjerne denne deloppgaven?', 'Remaining:' => 'Gjenværende:', 'hours' => 'timer', 'spent' => 'brukt', @@ -354,7 +354,7 @@ return array( 'Project cloned successfully.' => 'Prosjektet er kopiert.', 'Unable to clone this project.' => 'Prosjektet kunne ikke kopieres', 'Email notifications' => 'Epostvarslinger', - 'Enable email notifications' => 'Aktiver eposvarslinger', + 'Enable email notifications' => 'Aktiver epostvarslinger', 'Task position:' => 'Oppgaveposisjon:', 'The task #%d have been opened.' => 'Oppgaven #%d er åpnet.', 'The task #%d have been closed.' => 'Oppgaven #%d er lukket.', @@ -382,12 +382,12 @@ return array( 'Disable public access' => 'Deaktiver offentlig tilgang', 'Enable public access' => 'Aktiver offentlig tilgang', 'Public access disabled' => 'Offentlig tilgang er deaktivert', - 'Do you really want to disable this project: "%s"?' => 'Vil du virkelig deaktivere prosjektet: "%s"?', - 'Do you really want to enable this project: "%s"?' => 'Vil du virkelig aktivere prosjektet: "%s"?', + 'Do you really want to disable this project: "%s"?' => 'Vil du deaktivere prosjektet: "%s"?', + 'Do you really want to enable this project: "%s"?' => 'Vil du aktivere prosjektet: "%s"?', 'Project activation' => 'Prosjekt aktivering', 'Move the task to another project' => 'Flytt oppgaven til et annet prosjekt', 'Move to another project' => 'Flytt til et annet prosjekt', - 'Do you really want to duplicate this task?' => 'Vil du virkelig kopiere denne oppgaven?', + 'Do you really want to duplicate this task?' => 'Vil du kopiere denne oppgaven?', 'Duplicate a task' => 'Kopier en oppgave', 'External accounts' => 'Eksterne kontoer', 'Account type' => 'Kontotype', @@ -395,8 +395,6 @@ return array( 'Remote' => 'Fjernstyrt', 'Enabled' => 'Aktiv', 'Disabled' => 'Deaktivert', - 'Google account linked' => 'Google-konto knyttet', - 'Github account linked' => 'GitHub-konto knyttet', 'Username:' => 'Brukernavn', 'Name:' => 'Navn:', 'Email:' => 'Epost:', @@ -411,7 +409,7 @@ return array( 'External authentications' => 'Ekstern godkjenning', 'Google Account' => 'Google-konto', 'Github Account' => 'GitHub-konto', - 'Never connected.' => 'Aldri knyttet.', + 'Never connected.' => 'Aldri innlogget.', 'No account linked.' => 'Ingen kontoer knyttet.', 'Account linked.' => 'Konto knyttet.', 'No external authentication enabled.' => 'Ingen eksterne godkjenninger aktiveret.', @@ -466,7 +464,7 @@ return array( 'Database' => 'Database', 'About' => 'Om', 'Database driver:' => 'Database driver:', - 'Board settings' => 'Innstillinger for ptosjektside', + 'Board settings' => 'Innstillinger for prosjektside', 'URL and token' => 'URL og token', 'Webhook settings' => 'Webhook innstillinger', 'URL for task creation:' => 'URL for oppgaveopprettelse:', @@ -475,9 +473,9 @@ return array( 'Refresh interval for private board' => 'Oppdateringsintervall for privat hovedside', 'Refresh interval for public board' => 'Oppdateringsintervall for offentlig hovedside', 'Task highlight period' => 'Fremhevingsperiode for oppgave', - 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode for å anta at en oppgave nylig ble endretg (0 for å deaktivere, 2 dager som standard)', + 'Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)' => 'Periode for ø anta at en oppgave nylig ble endretg (0 for å deaktivere, 2 dager som standard)', 'Frequency in second (60 seconds by default)' => 'Frekevens i sekunder (60 sekunder som standard)', - 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frekvens i sekunder (0 for å deaktivere denne funksjonen, 10 sekunder som standard)', + 'Frequency in second (0 to disable this feature, 10 seconds by default)' => 'Frekvens i sekunder (0 for øt deaktivere denne funksjonen, 10 sekunder som standard)', 'Application URL' => 'Applikasjons URL', 'Example: http://example.kanboard.net/ (used by email notifications)' => 'Eksempel: http://example.kanboard.net/ (bruges til email notifikationer)', 'Token regenerated.' => 'Token regenerert.', @@ -485,7 +483,7 @@ return array( 'ISO format is always accepted, example: "%s" and "%s"' => 'ISO format er alltid akseptert, eksempelvis: "%s" og "%s"', 'New private project' => 'Nytt privat prosjekt', 'This project is private' => 'Dette projektet er privat', - 'Type here to create a new sub-task' => 'Skriv her for å opprette en ny deloppgave', + 'Type here to create a new sub-task' => 'Skriv her for ø opprette en ny deloppgave', 'Add' => 'Legg til', 'Estimated time: %s hours' => 'Estimert tid: %s timer', 'Time spent: %s hours' => 'Tid brukt: %s timer', @@ -510,21 +508,21 @@ return array( 'Columns' => 'Kolonner', 'Task' => 'Oppgave', // 'Your are not member of any project.' => '', - // 'Percentage' => '', - // 'Number of tasks' => '', - // 'Task distribution' => '', - // 'Reportings' => '', + 'Percentage' => 'Prosent', + 'Number of tasks' => 'Antall oppgaver', + 'Task distribution' => 'Kolonnefordeling', + 'Reportings' => 'Rapportering', // 'Task repartition for "%s"' => '', 'Analytics' => 'Analyser', - // 'Subtask' => '', + 'Subtask' => 'Deloppgave', 'My subtasks' => 'Mine deloppgaver', - // 'User repartition' => '', + 'User repartition' => 'Brukerfordeling', // 'User repartition for "%s"' => '', 'Clone this project' => 'Kopier dette prosjektet', - // 'Column removed successfully.' => '', + 'Column removed successfully.' => 'Kolonne flyttet', // 'Github Issue' => '', // 'Not enough data to show the graph.' => '', - // 'Previous' => '', + 'Previous' => 'Forrige', // 'The id must be an integer' => '', // 'The project id must be an integer' => '', // 'The status must be an integer' => '', @@ -536,9 +534,9 @@ return array( // 'This value is required' => '', // 'This value must be numeric' => '', // 'Unable to create this task.' => '', - // 'Cumulative flow diagram' => '', + 'Cumulative flow diagram' => 'Kumulativt flytdiagram', // 'Cumulative flow diagram for "%s"' => '', - // 'Daily project summary' => '', + 'Daily project summary' => 'Daglig prosjektsammendrag', // 'Daily project summary export' => '', // 'Daily project summary export for "%s"' => '', 'Exports' => 'Eksporter', @@ -546,7 +544,7 @@ return array( 'Nothing to preview...' => 'Ingenting å forhåndsvise', 'Preview' => 'Forhåndsvisning', 'Write' => 'Skriv', - 'Active swimlanes' => 'Aktive svæmmebaner', + 'Active swimlanes' => 'Aktive svømmebaner', 'Add a new swimlane' => 'Legg til en ny svømmebane', 'Change default swimlane' => 'Endre standard svømmebane', 'Default swimlane' => 'Standard svømmebane', @@ -558,10 +556,10 @@ return array( 'Rename' => 'Endre navn', 'Show default swimlane' => 'Vis standard svømmebane', // 'Swimlane modification for the project "%s"' => '', - // 'Swimlane not found.' => '', - // 'Swimlane removed successfully.' => '', + 'Swimlane not found.' => 'Svømmebane ikke funnet', + 'Swimlane removed successfully.' => 'Svømmebane fjernet', 'Swimlanes' => 'Svømmebaner', - 'Swimlane updated successfully.' => 'Svæmmebane oppdatert', + 'Swimlane updated successfully.' => 'Svømmebane oppdatert', // 'The default swimlane have been updated successfully.' => '', // 'Unable to create your swimlane.' => '', // 'Unable to remove this swimlane.' => '', @@ -576,27 +574,27 @@ return array( // 'Help on Gitlab webhooks' => '', 'Integrations' => 'Integrasjoner', 'Integration with third-party services' => 'Integrasjoner med tredje-parts tjenester', - // 'Role for this project' => '', + 'Role for this project' => 'Rolle for dette prosjektet', 'Project manager' => 'Prosjektleder', 'Project member' => 'Prosjektmedlem', 'A project manager can change the settings of the project and have more privileges than a standard user.' => 'Prosjektlederen kan endre flere innstillinger for prosjektet enn den en vanlig bruker kan.', // 'Gitlab Issue' => '', - // 'Subtask Id' => '', - // 'Subtasks' => '', - // 'Subtasks Export' => '', + 'Subtask Id' => 'Deloppgave ID', + 'Subtasks' => 'Deloppgaver', + 'Subtasks Export' => 'Eksporter deloppgaver', // 'Subtasks exportation for "%s"' => '', - // 'Task Title' => '', + 'Task Title' => 'Oppgavetittel', // 'Untitled' => '', 'Application default' => 'Standardinstilling', 'Language:' => 'Språk', 'Timezone:' => 'Tidssone', - // 'All columns' => '', + 'All columns' => 'Alle kolonner', 'Calendar' => 'Kalender', - // 'Next' => '', + 'Next' => 'Neste', // '#%d' => '', - // 'All swimlanes' => '', - // 'All colors' => '', - // 'All status' => '', + 'All swimlanes' => 'Alle svømmebaner', + 'All colors' => 'Alle farger', + 'All status' => 'Alle statuser', // 'Moved to column %s' => '', 'Change description' => 'Endre beskrivelse', 'User dashboard' => 'Brukerens hovedside', @@ -612,8 +610,8 @@ return array( // 'Bitbucket commit received' => '', // 'Bitbucket webhooks' => '', // 'Help on Bitbucket webhooks' => '', - // 'Start' => '', - // 'End' => '', + 'Start' => 'Start', + 'End' => 'Slutt', 'Task age in days' => 'Dager siden oppgaven ble opprettet', 'Days in this column' => 'Dager siden oppgaven ble lagt i denne kolonnen', // '%dd' => '', @@ -621,7 +619,7 @@ return array( 'Add a new link' => 'Legg til en ny relasjon', // 'Do you really want to remove this link: "%s"?' => '', // 'Do you really want to remove this link with task #%d?' => '', - // 'Field required' => '', + 'Field required' => 'Feltet må fylles ut', 'Link added successfully.' => 'Ny relasjon er lagt til', 'Link updated successfully.' => 'Relasjon er oppdatert', 'Link removed successfully.' => 'Relasjon er fjernet', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Bla horisontalt', 'Compact/wide view' => 'Kompakt/bred visning', 'No results match:' => 'Ingen resultater', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - 'Hourly rates' => 'Timepriser', - 'Hourly rate' => 'Timepris', 'Currency' => 'Valuta', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - 'Manage timetable' => 'Tidstabell', - 'Overtime timetable' => 'Overtidstabell', - 'Time off timetable' => 'Fritidstabell', - 'Timetable' => 'Tidstabell', - 'Work timetable' => 'Arbeidstidstabell', - 'Week timetable' => 'Uketidstabell', - 'Day timetable' => 'Dagtidstabell', - 'From' => 'Fra', - 'To' => 'Til', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', 'Files' => 'Filer', 'Images' => 'Bilder', 'Private project' => 'Privat prosjekt', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - 'Budget' => 'Budsjett', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', - // 'download' => '', - // 'Do you really want to remove this budget line?' => '', + 'download' => 'last ned', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', - // 'Destination column' => '', + 'Destination column' => 'Ny kolonne', 'Move the task to another column when assigned to a user' => 'Flytt oppgaven til en annen kolonne når den er tildelt en bruker', 'Move the task to another column when assignee is cleared' => 'Flytt oppgaven til en annen kolonne når ppgavetildeling fjernes ', - // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', + 'Source column' => 'Opprinnelig kolonne', 'Transitions' => 'Statusendringer', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -782,7 +730,7 @@ return array( // 'This chart show the task complexity over the time (Work Remaining).' => '', // 'Screenshot taken %s' => '', 'Add a screenshot' => 'Legg til et skjermbilde', - 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Ta et skjermbilde og trykk CTRL+V for å lime det inn her.', + 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Ta et skjermbilde og trykk CTRL+V for å lime det inn her.', 'Screenshot uploaded successfully.' => 'Skjermbilde opplastet', // 'SEK - Swedish Krona' => '', 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Prosjektkoden er en alfanumerisk kode som kan brukes for å identifisere prosjektet', @@ -853,7 +801,7 @@ return array( // 'There is no user management for private projects.' => '', // 'User that will receive the email' => '', // 'Email subject' => '', - // 'Date' => '', + 'Date' => 'Dato', // 'By @%s on Bitbucket' => '', // 'Bitbucket Issue' => '', // 'Commit made by @%s on Bitbucket' => '', @@ -877,10 +825,7 @@ return array( 'Notification' => 'Varsel', // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', - // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', + 'Swimlane' => 'Svømmebane', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -908,19 +853,19 @@ return array( // 'The field "%s" have been updated' => '', // 'The description have been modified' => '', // 'Do you really want to close the task "%s" as well as all subtasks?' => '', - // 'Swimlane: %s' => '', - // 'I want to receive notifications for:' => '', + 'Swimlane: %s' => 'Svømmebane: %s', + 'I want to receive notifications for:' => 'Jeg vil motta varslinger om:', 'All tasks' => 'Alle oppgaver', - // 'Only for tasks assigned to me' => '', - // 'Only for tasks created by me' => '', - // 'Only for tasks created by me and assigned to me' => '', + 'Only for tasks assigned to me' => 'Kun oppgaver som er tildelt meg', + 'Only for tasks created by me' => 'Kun oppgaver som er opprettet av meg', + 'Only for tasks created by me and assigned to me' => 'Kun oppgaver som er opprettet av meg og tildelt meg', // '%A' => '', // '%b %e, %Y, %k:%M %p' => '', // 'New due date: %B %e, %Y' => '', // 'Start date changed: %B %e, %Y' => '', // '%k:%M %p' => '', // '%%Y-%%m-%%d' => '', - // 'Total for all columns' => '', + 'Total for all columns' => 'Totalt for alle kolonner', // 'You need at least 2 days of data to show the chart.' => '', // '<15m' => '', // '<30m' => '', @@ -928,41 +873,41 @@ return array( 'Start timer' => 'Start timer', 'Add project member' => 'Legg til prosjektmedlem', 'Enable notifications' => 'Aktiver varslinger', - // 'My activity stream' => '', - // 'My calendar' => '', - // 'Search tasks' => '', - // 'Back to the calendar' => '', - // 'Filters' => '', - // 'Reset filters' => '', - // 'My tasks due tomorrow' => '', - // 'Tasks due today' => '', - // 'Tasks due tomorrow' => '', - // 'Tasks due yesterday' => '', - // 'Closed tasks' => '', - // 'Open tasks' => '', - // 'Not assigned' => '', - // 'View advanced search syntax' => '', - // 'Overview' => '', + 'My activity stream' => 'Aktivitetslogg', + 'My calendar' => 'Min kalender', + 'Search tasks' => 'Søk oppgave', + 'Back to the calendar' => 'Tilbake til kalender', + 'Filters' => 'Filtere', + 'Reset filters' => 'Nullstill filter', + 'My tasks due tomorrow' => 'Mine oppgaver med frist i morgen', + 'Tasks due today' => 'Oppgaver med frist i dag', + 'Tasks due tomorrow' => 'Oppgaver med frist i morgen', + 'Tasks due yesterday' => 'Oppgaver med frist i går', + 'Closed tasks' => 'Fullførte oppgaver', + 'Open tasks' => 'Åpne oppgaver', + 'Not assigned' => 'Ikke tildelt', + 'View advanced search syntax' => 'Vis hjelp for avansert søk ', + 'Overview' => 'Oversikt', // '%b %e %Y' => '', - // 'Board/Calendar/List view' => '', - // 'Switch to the board view' => '', - // 'Switch to the calendar view' => '', - // 'Switch to the list view' => '', - // 'Go to the search/filter box' => '', - // 'There is no activity yet.' => '', - // 'No tasks found.' => '', - // 'Keyboard shortcut: "%s"' => '', - // 'List' => '', - // 'Filter' => '', - // 'Advanced search' => '', - // 'Example of query: ' => '', - // 'Search by project: ' => '', - // 'Search by column: ' => '', - // 'Search by assignee: ' => '', - // 'Search by color: ' => '', - // 'Search by category: ' => '', - // 'Search by description: ' => '', - // 'Search by due date: ' => '', + 'Board/Calendar/List view' => 'Oversikt/kalender/listevisning', + 'Switch to the board view' => 'Oversiktsvisning', + 'Switch to the calendar view' => 'Kalendevisning', + 'Switch to the list view' => 'Listevisning', + 'Go to the search/filter box' => 'Gå til søk/filter', + 'There is no activity yet.' => 'Ingen aktiviteter ennå.', + 'No tasks found.' => 'Ingen oppgaver funnet', + 'Keyboard shortcut: "%s"' => 'Hurtigtaster: "%s"', + 'List' => 'Liste', + 'Filter' => 'Filter', + 'Advanced search' => 'Avansert søk', + 'Example of query: ' => 'Eksempel på spørring', + 'Search by project: ' => 'Søk etter prosjekt', + 'Search by column: ' => 'Søk etter kolonne', + 'Search by assignee: ' => 'Søk etter tildelt', + 'Search by color: ' => 'Søk etter farge', + 'Search by category: ' => 'Søk etter kategori', + 'Search by description: ' => 'Søk etter beskrivelse', + 'Search by due date: ' => 'Søk etter frist', // 'Lead and Cycle time for "%s"' => '', // 'Average time spent into each column for "%s"' => '', // 'Average time spent into each column' => '', @@ -996,75 +941,119 @@ return array( // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', // 'By @%s on Gitlab' => '', // 'Gitlab issue comment created' => '', - // 'New remote user' => '', - // 'New local user' => '', - // 'Default task color' => '', - // 'Hide sidebar' => '', - // 'Expand sidebar' => '', + 'New remote user' => 'Ny eksternbruker', + 'New local user' => 'Ny internbruker', + 'Default task color' => 'Standard oppgavefarge', + 'Hide sidebar' => 'Skjul sidemeny', + 'Expand sidebar' => 'Vis sidemeny', // 'This feature does not work with all browsers.' => '', // 'There is no destination project available.' => '', // 'Trigger automatically subtask time tracking' => '', // 'Include closed tasks in the cumulative flow diagram' => '', - // 'Current swimlane: %s' => '', - // 'Current column: %s' => '', - // 'Current category: %s' => '', - // 'no category' => '', - // 'Current assignee: %s' => '', - // 'not assigned' => '', - // 'Author:' => '', - // 'contributors' => '', - // 'License:' => '', - // 'License' => '', - // 'Project Administrator' => '', - // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', + 'Current swimlane: %s' => 'Nåværende svømmebane: %s', + 'Current column: %s' => 'Nåværende kolonne: %s', + 'Current category: %s' => ': %s', + 'no category' => 'ingen kategori', + 'Current assignee: %s' => 'Tildelt til %s', + 'not assigned' => 'ikke tildelt', + 'Author:' => 'Opprettet av', + 'contributors' => 'bidragsytere', + 'License:' => 'Lisens:', + 'License' => 'Lisens', + 'Project Administrator' => 'Prosjektadministrator', + 'Enter the text below' => 'Legg inn teksten nedenfor', + 'Gantt chart for %s' => 'Gantt skjema for %s', // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', - // 'Start date:' => '', - // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', + 'Sort by date' => 'Sorter etter dato', + 'Add task' => 'Legg til oppgave', + 'Start date:' => 'Startdato:', + 'Due date:' => 'Frist:', + 'There is no start date or due date for this task.' => 'Det er ingen startdato eller frist for denne oppgaven', // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', - // 'People who are project managers' => '', - // 'People who are project members' => '', + 'There is no task in your project.' => 'Det er ingen oppgaver i dette prosjektet', + 'Gantt chart' => 'Gantt skjema', + 'People who are project managers' => 'Prosjektledere', + 'People who are project members' => 'Prosjektmedlemmer', // 'NOK - Norwegian Krone' => '', - // 'Show this column' => '', - // 'Hide this column' => '', - // 'open file' => '', - // 'End date' => '', - // 'Users overview' => '', - // 'Managers' => '', - // 'Members' => '', - // 'Shared project' => '', - // 'Project managers' => '', - // 'Project members' => '', + 'Show this column' => 'Vis denne kolonnen', + 'Hide this column' => 'Skjul denne kolonnen', + 'open file' => 'Åpne fil', + 'End date' => 'Sluttdato', + 'Users overview' => 'Brukeroversikt', + 'Managers' => 'Ledere', + 'Members' => 'Medlemmer', + 'Shared project' => 'Delt prosjekt', + 'Project managers' => 'Prosjektledere', + 'Project members' => 'Prosjektmedlemmer', // 'Gantt chart for all projects' => '', - // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', - // 'End date:' => '', + 'Projects list' => 'Prosjektliste', + 'Gantt chart for this project' => 'Gantt skjema for dette prosjektet', + 'Project board' => 'Prosjektsiden', + 'End date:' => 'Sluttdato:', // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', - // 'Start date: %s' => '', - // 'End date: %s' => '', - // 'Link type' => '', + 'Projects Gantt chart' => 'Gantt skjema for prosjekter', + 'Start date: %s' => 'Startdato: %s', + 'End date: %s' => 'Sluttdato: %s', + 'Link type' => 'Relasjonstype', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Login with my Gitlab Account' => '', - // 'Milestone' => '', + 'Milestone' => 'Milepæl', // 'Gitlab Authentication' => '', // 'Help on Gitlab authentication' => '', // 'Gitlab Id' => '', // 'Gitlab Account' => '', // 'Link my Gitlab Account' => '', // 'Unlink my Gitlab Account' => '', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Documentation: %s' => 'Dokumentasjon: %s', + 'Switch to the Gantt chart view' => 'Gantt skjema visning', + 'Reset the search/filter box' => 'Nullstill søk/filter', + 'Documentation' => 'Dokumentasjon', + 'Table of contents' => 'Innholdsfortegnelse', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Hjelp med prosjekttilganger', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/nl_NL/translations.php b/sources/app/Locale/nl_NL/translations.php index 23d6416..5ee15c2 100644 --- a/sources/app/Locale/nl_NL/translations.php +++ b/sources/app/Locale/nl_NL/translations.php @@ -313,7 +313,7 @@ return array( 'Estimate:' => 'Schatting :', 'Spent:' => 'Besteed :', 'Do you really want to remove this sub-task?' => 'Weet u zeker dat u deze subtaak wil verwijderen ?', - 'Remaining:' => 'Restant :', + 'Remaining:' => 'Resterend :', 'hours' => 'uren', 'spent' => 'besteed', 'estimated' => 'geschat', @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remote', 'Enabled' => 'Actief', 'Disabled' => 'Inactief', - 'Google account linked' => 'Gelinkt Google Account', - 'Github account linked' => 'Gelinkt Github Account', 'Username:' => 'Gebruikersnaam :', 'Name:' => 'Naam :', 'Email:' => 'Email :', @@ -667,75 +665,26 @@ return array( // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', // 'No results match:' => '', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - // 'Hourly rates' => '', - // 'Hourly rate' => '', // 'Currency' => '', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - // 'Manage timetable' => '', - // 'Overtime timetable' => '', - // 'Time off timetable' => '', - // 'Timetable' => '', - // 'Work timetable' => '', - // 'Week timetable' => '', - // 'Day timetable' => '', - // 'From' => '', - // 'To' => '', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', // 'Files' => '', // 'Images' => '', // 'Private project' => '', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - // 'Budget' => '', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', // 'download' => '', - // 'Do you really want to remove this budget line?' => '', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', // 'Move the task to another column when assignee is cleared' => '', // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/pl_PL/translations.php b/sources/app/Locale/pl_PL/translations.php index 9947cf3..f0d43ad 100644 --- a/sources/app/Locale/pl_PL/translations.php +++ b/sources/app/Locale/pl_PL/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Zdalne', 'Enabled' => 'Odblokowane', 'Disabled' => 'Zablokowane', - 'Google account linked' => 'Połączone konto Google', - 'Github account linked' => 'Połączone konto Github', 'Username:' => 'Nazwa Użytkownika:', 'Name:' => 'Imię i Nazwisko', 'Email:' => 'Email: ', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Przewijanie poziome', 'Compact/wide view' => 'Pełny/Kompaktowy widok', 'No results match:' => 'Brak wyników:', - 'Remove hourly rate' => 'Usuń stawkę godzinową', - 'Do you really want to remove this hourly rate?' => 'Czy na pewno chcesz usunąć stawkę godzinową?', - 'Hourly rates' => 'Stawki godzinowe', - 'Hourly rate' => 'Stawka godzinowa', 'Currency' => 'Waluta', - 'Effective date' => 'Data efektywna', - 'Add new rate' => 'Dodaj nową stawkę', - 'Rate removed successfully.' => 'Stawka usunięta.', - 'Unable to remove this rate.' => 'Nie można usunąć tej stawki.', - 'Unable to save the hourly rate.' => 'Nie można zapisać tej stawki godzinowej.', - 'Hourly rate created successfully.' => 'Stawka godzinowa utworzona pomyślnie.', - 'Start time' => 'Rozpoczęto', - 'End time' => 'Zakończono', - 'Comment' => 'Komentarz', - 'All day' => 'Cały dzień', - 'Day' => 'Dzień', - 'Manage timetable' => 'Zarządzaj rozkładami zajęć', - 'Overtime timetable' => 'Rozkład zajęć - nadgodziny', - 'Time off timetable' => 'Rozkład zajęć - czas wolny', - 'Timetable' => 'Rozkład zajęć', - 'Work timetable' => 'Rozkład zajęć - praca', - 'Week timetable' => 'Tygodniowy rozkład zajęć', - 'Day timetable' => 'Dzienny rozkład zajęć', - 'From' => 'Od', - 'To' => 'Do', - 'Time slot created successfully.' => 'Przydział czasowy utworzony.', - 'Unable to save this time slot.' => 'Nie można zapisać tego przydziału czasowego.', - 'Time slot removed successfully.' => 'Przydział czasowy usunięty.', - 'Unable to remove this time slot.' => 'Nie można usunąć tego przydziału czasowego.', - 'Do you really want to remove this time slot?' => 'Czy na pewno chcesz usunąć ten przedział czasowy?', - 'Remove time slot' => 'Usuń przedział czasowy', - 'Add new time slot' => 'Dodaj przedział czasowy', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Ten rozkład zajęć jest używany przypadku zaznaczenia "cały dzień" dla zaplanowanego czasu wolnego i nadgodzin', 'Files' => 'Pliki', 'Images' => 'Obrazy', 'Private project' => 'Projekt prywatny', - 'Amount' => 'Ilość', 'AUD - Australian Dollar' => 'AUD - Dolar australijski', - 'Budget' => 'Budżet', - 'Budget line' => 'Linia budżetowa', - 'Budget line removed successfully.' => 'Linia budżetowa usunięta.', - 'Budget lines' => 'Linie budżetowe', 'CAD - Canadian Dollar' => 'CAD - Dolar kanadyjski', 'CHF - Swiss Francs' => 'CHF - Frank szwajcarski', - 'Cost' => 'Koszt', - 'Cost breakdown' => 'Analiza kosztów', 'Custom Stylesheet' => 'Niestandardowy arkusz stylów', 'download' => 'pobierz', - 'Do you really want to remove this budget line?' => 'Czy chcesz usunąć tą linię budżetową?', // 'EUR - Euro' => '', - 'Expenses' => 'Wydatki', 'GBP - British Pound' => 'GBP - Funt brytyjski', 'INR - Indian Rupee' => 'INR - Rupia indyjska', 'JPY - Japanese Yen' => 'JPY - Jen japoński', - 'New budget line' => 'Nowa linia budżetowa', 'NZD - New Zealand Dollar' => 'NZD - Dolar nowozelandzki', - 'Remove a budget line' => 'Usuń linię budżetową', - 'Remove budget line' => 'Usuń linię budżetową', 'RSD - Serbian dinar' => 'RSD - Dinar serbski', - // 'The budget line have been created successfully.' => '', - 'Unable to create the budget line.' => 'Nie można utworzyć linii budżetowej', - 'Unable to remove this budget line.' => 'Nie można usunąć tej linii budżetowej', 'USD - US Dollar' => 'USD - Dolar amerykański', - 'Remaining' => 'Pozostało', 'Destination column' => 'Kolumna docelowa', 'Move the task to another column when assigned to a user' => 'Przenieś zadanie do innej kolumny gdy zostanie przypisane do osoby', 'Move the task to another column when assignee is cleared' => 'Przenieś zadanie do innej kolumny gdy osoba odpowiedzialna zostanie usunięta', 'Source column' => 'Kolumna źródłowa', - 'Show subtask estimates (forecast of future work)' => 'Pokaż planowane czasy wykonania pod-zadań', 'Transitions' => 'Przeniesienia', 'Executer' => 'Wykonał', 'Time spent in the column' => 'Czas spędzony w tej kolumnie', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Kurs', 'Change reference currency' => 'Zmień walutę referencyjną', 'Add a new currency rate' => 'Dodaj nowy kurs waluty', - 'Currency rates are used to calculate project budget.' => 'Kursy walut są używane do obliczeń budżetu projektu.', 'Reference currency' => 'Waluta referencyjna', 'The currency rate have been added successfully.' => 'Dodano kurs waluty', 'Unable to add this currency rate.' => 'Nie można dodać kursu waluty', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/pt_BR/translations.php b/sources/app/Locale/pt_BR/translations.php index 6aa2f4d..52cb14c 100644 --- a/sources/app/Locale/pt_BR/translations.php +++ b/sources/app/Locale/pt_BR/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Habilitado', 'Disabled' => 'Desabilitado', - 'Google account linked' => 'Conta do Google associada', - 'Github account linked' => 'Conta do Github associada', 'Username:' => 'Usuário:', 'Name:' => 'Nome:', 'Email:' => 'E-mail:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Rolagem horizontal', 'Compact/wide view' => 'Alternar entre a vista compacta e ampliada', 'No results match:' => 'Nenhum resultado:', - 'Remove hourly rate' => 'Retirar taxa horária', - 'Do you really want to remove this hourly rate?' => 'Você deseja realmente remover esta taxa horária?', - 'Hourly rates' => 'Taxas horárias', - 'Hourly rate' => 'Taxa horária', 'Currency' => 'Moeda', - 'Effective date' => 'Data efetiva', - 'Add new rate' => 'Adicionar nova taxa', - 'Rate removed successfully.' => 'Taxa removido com sucesso.', - 'Unable to remove this rate.' => 'Impossível de remover esta taxa.', - 'Unable to save the hourly rate.' => 'Impossível salvar a taxa horária.', - 'Hourly rate created successfully.' => 'Taxa horária criada com sucesso.', - 'Start time' => 'Horário de início', - 'End time' => 'Horário de término', - 'Comment' => 'comentário', - 'All day' => 'Dia inteiro', - 'Day' => 'Dia', - 'Manage timetable' => 'Gestão dos horários', - 'Overtime timetable' => 'Horas extras', - 'Time off timetable' => 'Horas de ausência', - 'Timetable' => 'Horários', - 'Work timetable' => 'Horas trabalhadas', - 'Week timetable' => 'Horário da semana', - 'Day timetable' => 'Horário de un dia', - 'From' => 'Desde', - 'To' => 'A', - 'Time slot created successfully.' => 'Intervalo de tempo criado com sucesso.', - 'Unable to save this time slot.' => 'Impossível de guardar este intervalo de tempo.', - 'Time slot removed successfully.' => 'Intervalo de tempo removido com sucesso.', - 'Unable to remove this time slot.' => 'Impossível de remover esse intervalo de tempo.', - 'Do you really want to remove this time slot?' => 'Você deseja realmente remover este intervalo de tempo?', - 'Remove time slot' => 'Remover um intervalo de tempo', - 'Add new time slot' => 'Adicionar um intervalo de tempo', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Esses horários são usados quando a caixa de seleção "Dia inteiro" está marcada para Horas de ausência ou Extras', 'Files' => 'Arquivos', 'Images' => 'Imagens', 'Private project' => 'Projeto privado', - 'Amount' => 'Quantia', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', - 'Budget' => 'Orçamento', - 'Budget line' => 'Rubrica orçamental', - 'Budget line removed successfully.' => 'Rubrica orçamental removida com sucesso', - 'Budget lines' => 'Rubricas orçamentais', 'CAD - Canadian Dollar' => 'CAD - Dólar canadense', 'CHF - Swiss Francs' => 'CHF - Francos Suíços', - 'Cost' => 'Custo', - 'Cost breakdown' => 'Repartição dos custos', 'Custom Stylesheet' => 'Folha de estilo personalizado', 'download' => 'baixar', - 'Do you really want to remove this budget line?' => 'Você deseja realmente remover esta rubrica orçamental?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Despesas', 'GBP - British Pound' => 'GBP - Libra Esterlina', 'INR - Indian Rupee' => 'INR - Rúpia indiana', 'JPY - Japanese Yen' => 'JPY - Iene japonês', - 'New budget line' => 'Nova rubrica orçamental', 'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês', - 'Remove a budget line' => 'Remover uma rubrica orçamental', - 'Remove budget line' => 'Remover uma rubrica orçamental', 'RSD - Serbian dinar' => 'RSD - Dinar sérvio', - 'The budget line have been created successfully.' => 'A rubrica orçamental foi criada com sucesso.', - 'Unable to create the budget line.' => 'Impossível de adicionar esta rubrica orçamental.', - 'Unable to remove this budget line.' => 'Impossível de remover esta rubrica orçamental.', 'USD - US Dollar' => 'USD - Dólar norte-americano', - 'Remaining' => 'Restante', 'Destination column' => 'Coluna de destino', 'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um usuário', 'Move the task to another column when assignee is cleared' => 'Mover a tarefa para uma outra coluna quando esta não está atribuída', 'Source column' => 'Coluna de origem', - 'Show subtask estimates (forecast of future work)' => 'Mostrar a estimativa das subtarefas (previsão para o trabalho futuro)', 'Transitions' => 'Transições', 'Executer' => 'Executor(a)', 'Time spent in the column' => 'Tempo gasto na coluna', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Taxa', 'Change reference currency' => 'Mudar a moeda de referência', 'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda', - 'Currency rates are used to calculate project budget.' => 'As taxas de câmbio são utilizadas para calcular o orçamento do projeto.', 'Reference currency' => 'Moeda de Referência', 'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.', 'Unable to add this currency rate.' => 'Impossível de adicionar essa taxa de câmbio.', @@ -878,9 +826,6 @@ return array( '%s moved the task #%d to the first swimlane' => '%s moveu a tarefa n° %d no primeiro swimlane', '%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa n° %d no swimlane "%s"', 'Swimlane' => 'Swimlane', - 'Budget overview' => 'Visão geral do orçamento', - 'Type' => 'Tipo', - 'There is not enough data to show something.' => 'Não há dados suficientes para mostrar alguma coisa.', 'Gravatar' => 'Gravatar', 'Hipchat' => 'Hipchat', 'Slack' => 'Slack', @@ -1060,11 +1005,55 @@ return array( 'Gitlab Account' => 'Conta Gitlab', 'Link my Gitlab Account' => 'Vincular minha conta Gitlab', 'Unlink my Gitlab Account' => 'Desvincular minha conta Gitlab', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Documentation: %s' => 'Documentação: %s', + 'Switch to the Gantt chart view' => 'Mudar para a vista gráfico de Gantt', + 'Reset the search/filter box' => 'Reiniciar o campo de pesquisa', + 'Documentation' => 'Documentação', + 'Table of contents' => 'Índice', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Ajuda com as permissões dos projetos', + 'Author' => 'Autor', + 'Version' => 'Versão', + 'Plugins' => 'Extensão', + 'There is no plugin loaded.' => 'Não há nenhuma extensão carga.', + 'Set maximum column height' => 'Definir a altura máxima das colunas', + 'Remove maximum column height' => 'Retirar a altura máxima das colunas', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/pt_PT/translations.php b/sources/app/Locale/pt_PT/translations.php index d19a31e..ac8961a 100644 --- a/sources/app/Locale/pt_PT/translations.php +++ b/sources/app/Locale/pt_PT/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Remoto', 'Enabled' => 'Activado', 'Disabled' => 'Desactivado', - 'Google account linked' => 'Conta do Google associada', - 'Github account linked' => 'Conta do Github associada', 'Username:' => 'Utilizador:', 'Name:' => 'Nome:', 'Email:' => 'E-mail:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Deslocamento horizontal', 'Compact/wide view' => 'Alternar entre a vista compacta e ampliada', 'No results match:' => 'Nenhum resultado:', - 'Remove hourly rate' => 'Retirar taxa horária', - 'Do you really want to remove this hourly rate?' => 'Tem a certeza que quer remover esta taxa horária?', - 'Hourly rates' => 'Taxas horárias', - 'Hourly rate' => 'Taxa horária', 'Currency' => 'Moeda', - 'Effective date' => 'Data efectiva', - 'Add new rate' => 'Adicionar nova taxa', - 'Rate removed successfully.' => 'Taxa removido com sucesso.', - 'Unable to remove this rate.' => 'Impossível de remover esta taxa.', - 'Unable to save the hourly rate.' => 'Impossível salvar a taxa horária.', - 'Hourly rate created successfully.' => 'Taxa horária criada com sucesso.', - 'Start time' => 'Horário de início', - 'End time' => 'Horário de término', - 'Comment' => 'comentário', - 'All day' => 'Dia inteiro', - 'Day' => 'Dia', - 'Manage timetable' => 'Gestão dos horários', - 'Overtime timetable' => 'Horas extras', - 'Time off timetable' => 'Horas de ausência', - 'Timetable' => 'Horários', - 'Work timetable' => 'Horas trabalhadas', - 'Week timetable' => 'Horário da semana', - 'Day timetable' => 'Horário de um dia', - 'From' => 'Desde', - 'To' => 'A', - 'Time slot created successfully.' => 'Intervalo de tempo criado com sucesso.', - 'Unable to save this time slot.' => 'Impossível guardar este intervalo de tempo.', - 'Time slot removed successfully.' => 'Intervalo de tempo removido com sucesso.', - 'Unable to remove this time slot.' => 'Impossível remover esse intervalo de tempo.', - 'Do you really want to remove this time slot?' => 'Tem a certeza que quer remover este intervalo de tempo?', - 'Remove time slot' => 'Remover um intervalo de tempo', - 'Add new time slot' => 'Adicionar um intervalo de tempo', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Esses horários são usados quando a caixa de seleção "Dia inteiro" está marcada para Horas de ausência ou Extras', 'Files' => 'Arquivos', 'Images' => 'Imagens', 'Private project' => 'Projecto privado', - 'Amount' => 'Quantia', 'AUD - Australian Dollar' => 'AUD - Dólar australiano', - 'Budget' => 'Orçamento', - 'Budget line' => 'Rubrica orçamental', - 'Budget line removed successfully.' => 'Rubrica orçamental removida com sucesso', - 'Budget lines' => 'Rubricas orçamentais', 'CAD - Canadian Dollar' => 'CAD - Dólar canadense', 'CHF - Swiss Francs' => 'CHF - Francos Suíços', - 'Cost' => 'Custo', - 'Cost breakdown' => 'Repartição dos custos', 'Custom Stylesheet' => 'Folha de estilos personalizada', 'download' => 'transferir', - 'Do you really want to remove this budget line?' => 'Tem a certeza que quer remover esta rubrica orçamental?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Despesas', 'GBP - British Pound' => 'GBP - Libra Esterlina', 'INR - Indian Rupee' => 'INR - Rúpia indiana', 'JPY - Japanese Yen' => 'JPY - Iene japonês', - 'New budget line' => 'Nova rubrica orçamental', 'NZD - New Zealand Dollar' => 'NZD - Dólar Neozelandês', - 'Remove a budget line' => 'Remover uma rubrica orçamental', - 'Remove budget line' => 'Remover uma rubrica orçamental', 'RSD - Serbian dinar' => 'RSD - Dinar sérvio', - 'The budget line have been created successfully.' => 'A rubrica orçamental foi criada com sucesso.', - 'Unable to create the budget line.' => 'Impossível adicionar esta rubrica orçamental.', - 'Unable to remove this budget line.' => 'Impossível remover esta rubrica orçamental.', 'USD - US Dollar' => 'USD - Dólar norte-americano', - 'Remaining' => 'Restante', 'Destination column' => 'Coluna de destino', 'Move the task to another column when assigned to a user' => 'Mover a tarefa para uma outra coluna quando esta está atribuída a um utilizador', 'Move the task to another column when assignee is cleared' => 'Mover a tarefa para uma outra coluna quando esta não está atribuída', 'Source column' => 'Coluna de origem', - 'Show subtask estimates (forecast of future work)' => 'Mostrar a estimativa das subtarefas (previsão para o trabalho futuro)', 'Transitions' => 'Transições', 'Executer' => 'Executor(a)', 'Time spent in the column' => 'Tempo gasto na coluna', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Taxa', 'Change reference currency' => 'Mudar a moeda de referência', 'Add a new currency rate' => 'Adicionar uma nova taxa para uma moeda', - 'Currency rates are used to calculate project budget.' => 'As taxas de câmbio são utilizadas para calcular o orçamento do projecto.', 'Reference currency' => 'Moeda de Referência', 'The currency rate have been added successfully.' => 'A taxa de câmbio foi adicionada com sucesso.', 'Unable to add this currency rate.' => 'Impossível adicionar essa taxa de câmbio.', @@ -878,9 +826,6 @@ return array( '%s moved the task #%d to the first swimlane' => '%s moveu a tarefa n° %d no primeiro swimlane', '%s moved the task #%d to the swimlane "%s"' => '%s moveu a tarefa n° %d no swimlane "%s"', 'Swimlane' => 'Swimlane', - 'Budget overview' => 'Visão geral do orçamento', - 'Type' => 'Tipo', - 'There is not enough data to show something.' => 'Não há dados suficientes para mostrar alguma coisa.', 'Gravatar' => 'Gravatar', 'Hipchat' => 'Hipchat', 'Slack' => 'Slack', @@ -1060,11 +1005,55 @@ return array( 'Gitlab Account' => 'Conta Gitlab', 'Link my Gitlab Account' => 'Connectar a minha Conta Gitlab', 'Unlink my Gitlab Account' => 'Desconectar a minha Conta Gitlab', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Documentation: %s' => 'Documentação: %s', + 'Switch to the Gantt chart view' => 'Mudar para vista de gráfico de Gantt', + 'Reset the search/filter box' => 'Repor caixa de procura/filtro', + 'Documentation' => 'Documentação', + 'Table of contents' => 'Tabela de conteúdos', + 'Gantt' => 'Gantt', + 'Help with project permissions' => 'Ajuda com permissões de projecto', + 'Author' => 'Autor', + 'Version' => 'Versão', + 'Plugins' => 'Extras', + 'There is no plugin loaded.' => 'Não existem extras carregados', + 'Set maximum column height' => 'Definir altura máxima da coluna', + 'Remove maximum column height' => 'Remover altura máxima da coluna', + 'My notifications' => 'As minhas notificações', + 'Custom filters' => 'Filtros personalizados', + 'Your custom filter have been created successfully.' => 'O seu filtro personalizado foi criado com sucesso.', + 'Unable to create your custom filter.' => 'Não foi possivel criar o seu filtro personalizado.', + 'Custom filter removed successfully.' => 'Filtro personalizado removido com sucesso.', + 'Unable to remove this custom filter.' => 'Não foi possivel remover este filtro personalizado.', + 'Edit custom filter' => 'Editar filtro personalizado', + 'Your custom filter have been updated successfully.' => 'O seu filtro personalizado foi actualizado com sucesso.', + 'Unable to update custom filter.' => 'Não foi possivel actualizar o filtro personalizado.', + 'Web' => 'Web', + 'New attachment on task #%d: %s' => 'Novo anexo na tarefa #%d: %s', + 'New comment on task #%d' => 'Novo comentário na tarefa #%d', + 'Comment updated on task #%d' => 'Comentário actualizado na tarefa #%d', + 'New subtask on task #%d' => 'Nova sub-tarefa na tarefa #%d', + 'Subtask updated on task #%d' => 'Sub-tarefa actualizada na tarefa #%d', + 'New task #%d: %s' => 'Nova tarefa #%d: %s', + 'Task updated #%d' => 'Tarefa actualizada #%d', + 'Task #%d closed' => 'Tarefa #%d fechada', + 'Task #%d opened' => 'Tarefa #%d aberta', + 'Column changed for task #%d' => 'Coluna alterada para tarefa #%d', + 'New position for task #%d' => 'Nova posição para tarefa #%d', + 'Swimlane changed for task #%d' => 'Swimlane alterado na tarefa #%d', + 'Assignee changed on task #%d' => 'Assignado alterado na tarefa #%d', + '%d overdue tasks' => '%d tarefas em atraso', + 'Task #%d is overdue' => 'Tarefa #%d está em atraso', + 'No new notifications.' => 'Sem novas notificações.', + 'Mark all as read' => 'Marcar tudo como lido', + 'Mark as read' => 'Marcar como lido', + 'Total number of tasks in this column across all swimlanes' => 'Número total de tarefas nesta coluna em todas as swimlanes', + 'Collapse swimlane' => 'Colapsar swimlane', + 'Expand swimlane' => 'Expandir swimlane', + 'Add a new filter' => 'Adicionar um novo filtro', + 'Share with all project members' => 'Partilhar com todos os membros do projecto', + 'Shared' => 'Partilhado', + 'Owner' => 'Dono', + 'Unread notifications' => 'Notificações por ler', + 'My filters' => 'Os meus filtros', + 'Notification methods:' => 'Metodos de notificação:', ); diff --git a/sources/app/Locale/ru_RU/translations.php b/sources/app/Locale/ru_RU/translations.php index feb1b68..4a64e06 100644 --- a/sources/app/Locale/ru_RU/translations.php +++ b/sources/app/Locale/ru_RU/translations.php @@ -20,15 +20,15 @@ return array( 'Red' => 'Красный', 'Orange' => 'Оранжевый', 'Grey' => 'Серый', - // 'Brown' => '', - // 'Deep Orange' => '', - // 'Dark Grey' => '', - // 'Pink' => '', - // 'Teal' => '', - // 'Cyan' => '', - // 'Lime' => '', - // 'Light Green' => '', - // 'Amber' => '', + 'Brown' => 'Коричневый', + 'Deep Orange' => 'Темно-оранжевый', + 'Dark Grey' => 'Темно-серый', + 'Pink' => 'Розовый', + 'Teal' => 'Бирюзовый', + 'Cyan' => 'Голубой', + 'Lime' => 'Лимонный', + 'Light Green' => 'Светло-зеленый', + 'Amber' => 'Янтарный', 'Save' => 'Сохранить', 'Login' => 'Вход', 'Official website:' => 'Официальный сайт:', @@ -61,27 +61,27 @@ return array( 'Inactive' => 'Неактивен', 'Active' => 'Активен', 'Add this column' => 'Добавить колонку', - '%d tasks on the board' => 'Задач на доске - %d', - '%d tasks in total' => 'Задач всего - %d', - 'Unable to update this board.' => 'Не удалось обновить доску.', - 'Edit board' => 'Изменить доски', - 'Disable' => 'Деактивировать', - 'Enable' => 'Активировать', + '%d tasks on the board' => '%d задач на доске', + '%d tasks in total' => 'всего %d задач', + 'Unable to update this board.' => 'Не удалось обновить эту доску.', + 'Edit board' => 'Изменить доску', + 'Disable' => 'Выключить', + 'Enable' => 'Включить', 'New project' => 'Новый проект', - 'Do you really want to remove this project: "%s"?' => 'Вы точно хотите удалить проект: « %s » ?', + 'Do you really want to remove this project: "%s"?' => 'Вы точно хотите удалить проект: "%s"?', 'Remove project' => 'Удалить проект', - 'Edit the board for "%s"' => 'Изменить доску для « %s »', + 'Edit the board for "%s"' => 'Изменить доску для "%s"', 'All projects' => 'Все проекты', 'Change columns' => 'Изменить колонки', 'Add a new column' => 'Добавить новую колонку', 'Title' => 'Название', 'Nobody assigned' => 'Никто не назначен', - 'Assigned to %s' => 'Исполнитель: %s', + 'Assigned to %s' => 'Назначено %s', 'Remove a column' => 'Удалить колонку', 'Remove a column from a board' => 'Удалить колонку с доски', - 'Unable to remove this column.' => 'Не удалось удалить колонку.', - 'Do you really want to remove this column: "%s"?' => 'Вы точно хотите удалить эту колонку: « %s » ?', - 'This action will REMOVE ALL TASKS associated to this column!' => 'Вы УДАЛИТЕ ВСЕ ЗАДАЧИ находящиеся в этой колонке !', + 'Unable to remove this column.' => 'Не удалось удалить эту колонку.', + 'Do you really want to remove this column: "%s"?' => 'Вы точно хотите удалить эту колонку: "%s" ?', + 'This action will REMOVE ALL TASKS associated to this column!' => 'Вы УДАЛИТЕ ВСЕ ЗАДАЧИ находящиеся в этой колонке!', 'Settings' => 'Настройки', 'Application settings' => 'Настройки приложения', 'Language' => 'Язык', @@ -100,32 +100,32 @@ return array( 'Create another task' => 'Создать другую задачу', 'New task' => 'Новая задача', 'Open a task' => 'Открыть задачу', - 'Do you really want to open this task: "%s"?' => 'Вы уверены что хотите открыть задачу: « %s » ?', + 'Do you really want to open this task: "%s"?' => 'Вы уверены что хотите открыть задачу: "%s" ?', 'Back to the board' => 'Вернуться на доску', - 'Created on %B %e, %Y at %k:%M %p' => 'Создано %d/%m/%Y в %H:%M', + 'Created on %B %e, %Y at %k:%M %p' => 'Создано %B /%e /%Y в %k:%M %p', 'There is nobody assigned' => 'Никто не назначен', - 'Column on the board:' => 'Колонка на доске : ', + 'Column on the board:' => 'Колонка на доске: ', 'Status is open' => 'Статус - открыт', 'Status is closed' => 'Статус - закрыт', - 'Close this task' => 'Закрыть эту задачу', - 'Open this task' => 'Открыть эту задачу', + 'Close this task' => 'Закрыть задачу', + 'Open this task' => 'Открыть задачу', 'There is no description.' => 'Нет описания.', 'Add a new task' => 'Добавить новую задачу', - 'The username is required' => 'Требуется имя пользователя', + 'The username is required' => 'Необходимо имя пользователя', 'The maximum length is %d characters' => 'Максимальная длина - %d знаков', 'The minimum length is %d characters' => 'Минимальная длина - %d знаков', - 'The password is required' => 'Требуется пароль', - 'This value must be an integer' => 'Это значение должно быть целым', - 'The username must be unique' => 'Требуется уникальное имя пользователя', - 'The user id is required' => 'Требуется ID пользователя', + 'The password is required' => 'Необходим пароль', + 'This value must be an integer' => 'Это значение должно быть целым числом', + 'The username must be unique' => 'Имя пользователя должно быть уникально', + 'The user id is required' => 'Необходим ID пользователя', 'Passwords don\'t match' => 'Пароли не совпадают', - 'The confirmation is required' => 'Требуется подтверждение', - 'The project is required' => 'Требуется проект', - 'The id is required' => 'Требуется ID', - 'The project id is required' => 'Требуется ID проекта', - 'The project name is required' => 'Требуется имя проекта', + 'The confirmation is required' => 'Необходимо подтверждение', + 'The project is required' => 'Необъодимо указать проект', + 'The id is required' => 'Необходим ID', + 'The project id is required' => 'Необходим ID проекта', + 'The project name is required' => 'Необходимо имя проекта', 'This project must be unique' => 'Проект должен быть уникальным', - 'The title is required' => 'Требуется заголовок', + 'The title is required' => 'Необходим заголовок', 'Settings saved successfully.' => 'Параметры успешно сохранены.', 'Unable to save your settings.' => 'Невозможно сохранить параметры.', 'Database optimization done.' => 'База данных оптимизирована.', @@ -157,7 +157,7 @@ return array( 'Ready' => 'Готовые', 'Backlog' => 'Ожидающие', 'Work in progress' => 'В процессе', - 'Done' => 'Выполнена', + 'Done' => 'Выполнено', 'Application version:' => 'Версия приложения:', 'Completed on %B %e, %Y at %k:%M %p' => 'Завершен %d/%m/%Y в %H:%M', '%B %e, %Y at %k:%M %p' => '%d/%m/%Y в %H:%M', @@ -193,9 +193,9 @@ return array( 'Edit this task' => 'Изменить задачу', 'Due Date' => 'Сделать до', 'Invalid date' => 'Неверная дата', - 'Must be done before %B %e, %Y' => 'Должно быть сделано до %d/%m/%Y', - '%B %e, %Y' => '%d/%m/%Y', - // '%b %e, %Y' => '', + 'Must be done before %B %e, %Y' => 'Должно быть сделано до %B %e %Y', + '%B %e, %Y' => '%B, %e, %Y', + '%b %e, %Y' => '%b %e, %Y', 'Automatic actions' => 'Автоматические действия', 'Your automatic action have been created successfully.' => 'Автоматика успешно настроена.', 'Unable to create your automatic action.' => 'Не удалось создать автоматизированное действие.', @@ -263,10 +263,10 @@ return array( '%d comments' => '%d комментариев', '%d comment' => '%d комментарий', 'Email address invalid' => 'Некорректный e-mail адрес', - // 'Your external account is not linked anymore to your profile.' => '', - // 'Unable to unlink your external account.' => '', - // 'External authentication failed' => '', - // 'Your external account is linked to your profile successfully.' => '', + 'Your external account is not linked anymore to your profile.' => 'Ваш внешний аккаунт больше не связан с Вашим профилем.', + 'Unable to unlink your external account.' => 'Не удалось отвязать Ваш внешний аккаунт.', + 'External authentication failed' => 'Внешняя авторизация не удалась', + 'Your external account is linked to your profile successfully.' => 'Ваш внешний аккаунт успешно подключен к профилю.', 'Email' => 'E-mail', 'Link my Google Account' => 'Привязать мой профиль к Google', 'Unlink my Google Account' => 'Отвязать мой профиль от Google', @@ -310,7 +310,7 @@ return array( 'Edit a comment' => 'Изменить комментарий', 'Summary' => 'Сводка', 'Time tracking' => 'Отслеживание времени', - 'Estimate:' => 'Приблизительно:', + 'Estimate:' => 'Запланировано:', 'Spent:' => 'Затрачено:', 'Do you really want to remove this sub-task?' => 'Вы точно хотите удалить подзадачу?', 'Remaining:' => 'Осталось:', @@ -319,7 +319,7 @@ return array( 'estimated' => 'расчетное', 'Sub-Tasks' => 'Подзадачи', 'Add a sub-task' => 'Добавить подзадачу', - 'Original estimate' => 'Первичная оценка', + 'Original estimate' => 'Запланировано', 'Create another sub-task' => 'Создать другую подзадачу', 'Time spent' => 'Времени затрачено', 'Edit a sub-task' => 'Изменить подзадачу', @@ -395,8 +395,6 @@ return array( 'Remote' => 'Удаленный', 'Enabled' => 'Включен', 'Disabled' => 'Выключены', - 'Google account linked' => 'Профиль Google связан', - 'Github account linked' => 'Профиль Github связан', 'Username:' => 'Имя пользователя:', 'Name:' => 'Имя:', 'Email:' => 'E-mail:', @@ -487,11 +485,11 @@ return array( 'This project is private' => 'Это проект с ограниченным доступом', 'Type here to create a new sub-task' => 'Печатайте сюда чтобы создать подзадачу', 'Add' => 'Добавить', - 'Estimated time: %s hours' => 'Планируемое время: %s часов', + 'Estimated time: %s hours' => 'Запланировано: %s часов', 'Time spent: %s hours' => 'Потрачено времени: %s часов', 'Started on %B %e, %Y' => 'Начато %B %e, %Y', 'Start date' => 'Дата начала', - 'Time estimated' => 'Планируемое время', + 'Time estimated' => 'Запланировано', 'There is nothing assigned to you.' => 'Вам ничего не назначено', 'My tasks' => 'Мои задачи', 'Activity stream' => 'Текущая активность', @@ -522,7 +520,7 @@ return array( 'User repartition for "%s"' => 'Перераспределение пользователей для "%s"', 'Clone this project' => 'Клонировать проект', 'Column removed successfully.' => 'Колонка успешно удалена.', - // 'Github Issue' => '', + 'Github Issue' => 'Вопрос на Github', 'Not enough data to show the graph.' => 'Недостаточно данных, чтобы показать график.', 'Previous' => 'Предыдущий', 'The id must be an integer' => 'Этот id должен быть целочисленным', @@ -593,7 +591,7 @@ return array( 'All columns' => 'Все колонки', 'Calendar' => 'Календарь', 'Next' => 'Следующий', - // '#%d' => '', + '#%d' => '#%d', 'All swimlanes' => 'Все дорожки', 'All colors' => 'Все цвета', 'All status' => 'Все статусы', @@ -608,7 +606,7 @@ return array( 'Time Tracking' => 'Учет времени', 'You already have one subtask in progress' => 'У вас уже есть одна задача в разработке', 'Which parts of the project do you want to duplicate?' => 'Какие части проекта должны быть дублированы?', - // 'Disallow login form' => '', + 'Disallow login form' => 'Запретить форму входа', // 'Bitbucket commit received' => '', 'Bitbucket webhooks' => 'BitBucket webhooks', 'Help on Bitbucket webhooks' => 'Помощь по BitBucket webhooks', @@ -616,7 +614,7 @@ return array( 'End' => 'Конец', 'Task age in days' => 'Возраст задачи в днях', 'Days in this column' => 'Дней в этой колонке', - // '%dd' => '', + '%dd' => '%dd', 'Add a link' => 'Добавить ссылку на другие задачи', 'Add a new link' => 'Добавление новой ссылки', 'Do you really want to remove this link: "%s"?' => 'Вы уверены что хотите удалить ссылку: "%s"?', @@ -638,21 +636,21 @@ return array( 'Unable to create your link.' => 'Не удается создать эту ссылку.', 'Unable to update your link.' => 'Не удается обновить эту ссылку.', 'Unable to remove this link.' => 'Не удается удалить эту ссылку.', - 'relates to' => 'связана с', - 'blocks' => 'блокирует', - 'is blocked by' => 'заблокирована в', - 'duplicates' => 'дублирует', - 'is duplicated by' => 'дублирована в', - 'is a child of' => 'наследник', - 'is a parent of' => 'родитель', - 'targets milestone' => 'часть этапа', - 'is a milestone of' => 'является частью этапа', - 'fixes' => 'исправляет', - 'is fixed by' => 'исправлено в', + 'relates to' => 'относится к', + 'blocks' => 'блокирована', + 'is blocked by' => 'блокирует', + 'duplicates' => 'дублирована', + 'is duplicated by' => 'дублирует', + 'is a child of' => 'является продолжением', + 'is a parent of' => 'является началом для', + 'targets milestone' => 'часть вехи', + 'is a milestone of' => 'является вехой для', + 'fixes' => 'исправлено', + 'is fixed by' => 'исправляет', 'This task' => 'Эта задача', '<1h' => '<1ч', - // '%dh' => '', - // '%b %e' => '', + '%dh' => '%dh', + '%b %e' => '%b %e', 'Expand tasks' => 'Развернуть задачи', 'Collapse tasks' => 'Свернуть задачи', 'Expand/collapse tasks' => 'Развернуть/свернуть задачи', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Широкий вид', 'Compact/wide view' => 'Компактный/широкий вид', 'No results match:' => 'Отсутствуют результаты:', - 'Remove hourly rate' => 'Удалить почасовую ставку', - 'Do you really want to remove this hourly rate?' => 'Вы действительно хотите удалить эту почасовую ставку?', - 'Hourly rates' => 'Почасовые ставки', - 'Hourly rate' => 'Почасовая ставка', 'Currency' => 'Валюта', - 'Effective date' => 'Дата вступления в силу', - 'Add new rate' => 'Добавить новый показатель', - 'Rate removed successfully.' => 'Показатель успешно удален.', - 'Unable to remove this rate.' => 'Не удается удалить этот показатель.', - 'Unable to save the hourly rate.' => 'Не удается сохранить почасовую ставку.', - 'Hourly rate created successfully.' => 'Почасовая ставка успешно создана.', - 'Start time' => 'Время начала', - 'End time' => 'Время завершения', - 'Comment' => 'Комментарий', - 'All day' => 'Весь день', - 'Day' => 'День', - 'Manage timetable' => 'Управление графиками', - 'Overtime timetable' => 'График сверхурочных', - 'Time off timetable' => 'Время в графике', - 'Timetable' => 'График', - 'Work timetable' => 'Work timetable', - 'Week timetable' => 'График на неделю', - 'Day timetable' => 'График на день', - 'From' => 'От кого', - 'To' => 'Кому', - 'Time slot created successfully.' => 'Временной интервал успешно создан.', - 'Unable to save this time slot.' => 'Невозможно сохранить этот временной интервал.', - 'Time slot removed successfully.' => 'Временной интервал успешно удален.', - 'Unable to remove this time slot.' => 'Не удается удалить этот временной интервал.', - 'Do you really want to remove this time slot?' => 'Вы действительно хотите удалить этот период времени?', - 'Remove time slot' => 'Удалить новый интервал времени', - 'Add new time slot' => 'Добавить новый интервал времени', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', 'Files' => 'Файлы', 'Images' => 'Изображения', 'Private project' => 'Приватный проект', - 'Amount' => 'Количество', 'AUD - Australian Dollar' => 'AUD - Австралийский доллар', - 'Budget' => 'Бюджет', - 'Budget line' => 'Статья бюджета', - 'Budget line removed successfully.' => 'Бюджетная статья успешно удалена.', - 'Budget lines' => 'Статьи бюджета', 'CAD - Canadian Dollar' => 'CAD - Канадский доллар', 'CHF - Swiss Francs' => 'CHF - Швейцарский Франк', - 'Cost' => 'Стоимость', - 'Cost breakdown' => 'Детализация затрат', 'Custom Stylesheet' => 'Пользовательский стиль', 'download' => 'загрузить', - 'Do you really want to remove this budget line?' => 'Вы действительно хотите удалить эту статью бюджета?', 'EUR - Euro' => 'EUR - Евро', - 'Expenses' => 'Расходы', 'GBP - British Pound' => 'GBP - Британский фунт', 'INR - Indian Rupee' => 'INR - Индийский рупий', 'JPY - Japanese Yen' => 'JPY - Японскай йена', - 'New budget line' => 'Новая статья бюджета', 'NZD - New Zealand Dollar' => 'NZD - Новозеландский доллар', - 'Remove a budget line' => 'Удалить строку в бюджете', - 'Remove budget line' => 'Удалить статью бюджета', 'RSD - Serbian dinar' => 'RSD - Сербский динар', - 'The budget line have been created successfully.' => 'Статья бюджета успешно создана.', - 'Unable to create the budget line.' => 'Не удается создать эту статью бюджета.', - 'Unable to remove this budget line.' => 'Не удается удалить эту статью бюджета.', 'USD - US Dollar' => 'USD - доллар США', - 'Remaining' => 'Прочее', 'Destination column' => 'Колонка назначения', 'Move the task to another column when assigned to a user' => 'Переместить задачу в другую колонку, когда она назначена пользователю', 'Move the task to another column when assignee is cleared' => 'Переместить задачу в другую колонку, когда назначение снято ', 'Source column' => 'Исходная колонка', - 'Show subtask estimates (forecast of future work)' => 'Показать оценку подзадач (прогноз будущей работы)', 'Transitions' => 'Перемещения', 'Executer' => 'Исполнитель', 'Time spent in the column' => 'Время проведенное в колонке', @@ -745,8 +694,7 @@ return array( 'Currency rates' => 'Курсы валют', 'Rate' => 'Курс', 'Change reference currency' => 'Изменить справочник валют', - 'Add a new currency rate' => 'Add a new currency rate', - 'Currency rates are used to calculate project budget.' => 'Курсы валют используются для расчета бюджета проекта.', + 'Add a new currency rate' => 'Добавить новый валютный курс', 'Reference currency' => 'Справочник валют', 'The currency rate have been added successfully.' => 'Курс валюты был успешно добавлен.', 'Unable to add this currency rate.' => 'Невозможно добавить этот курс валюты.', @@ -774,8 +722,8 @@ return array( 'Test your device' => 'Проверьте свое устройство', 'Assign a color when the task is moved to a specific column' => 'Назначить цвет, когда задача перемещается в определенную колонку', '%s via Kanboard' => '%s через Канборд', - // 'uploaded by: %s' => '', - // 'uploaded on: %s' => '', + 'uploaded by: %s' => 'загружено: %s', + 'uploaded on: %s' => 'загружено в: %s', 'size: %s' => 'размер: %s', 'Burndown chart for "%s"' => 'Диаграмма сгорания для « %s »', 'Burndown chart' => 'Диаграмма сгорания', @@ -805,7 +753,7 @@ return array( 'The identifier must be unique' => 'Идентификатор должен быть уникальным', 'This linked task id doesn\'t exists' => 'Этот ID звязанной задачи не существует', 'This value must be alphanumeric' => 'Это значение должно быть буквенно-цифровым', - 'Edit recurrence' => 'Завершить повторение', + 'Edit recurrence' => 'Редактировать повторы', 'Generate recurrent task' => 'Создать повторяющуюся задачу', 'Trigger to generate recurrent task' => 'Триггер для генерации периодической задачи', 'Factor to calculate new due date' => 'Коэффициент для рассчета новой даты', @@ -850,10 +798,10 @@ return array( 'Two factor authentication disabled' => 'Двухфакторная аутентификация отключена', 'Two factor authentication enabled' => 'Включена двухфакторная аутентификация', 'Unable to update this user.' => 'Не удается обновить этого пользователя.', - 'There is no user management for private projects.' => 'Там нет управления пользователя для частных проектов', - // 'User that will receive the email' => '', - // 'Email subject' => '', - // 'Date' => '', + 'There is no user management for private projects.' => 'Для приватных проектов управление пользователями не предусмотрено.', + 'User that will receive the email' => 'Пользователь, который будет получать e-mail', + 'Email subject' => 'Тема e-mail', + 'Date' => 'Дата', // 'By @%s on Bitbucket' => '', // 'Bitbucket Issue' => '', // 'Commit made by @%s on Bitbucket' => '', @@ -869,202 +817,243 @@ return array( // 'Bitbucket issue reopened' => '', // 'Bitbucket issue assignee change' => '', // 'Bitbucket issue comment created' => '', - // 'Column change' => '', - // 'Position change' => '', - // 'Swimlane change' => '', + 'Column change' => 'Изменение колонки', + 'Position change' => 'Позиция изменена', + 'Swimlane change' => 'Дорожка изменена', // 'Assignee change' => '', - // '[%s] Overdue tasks' => '', - // 'Notification' => '', - // '%s moved the task #%d to the first swimlane' => '', - // '%s moved the task #%d to the swimlane "%s"' => '', - // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', - // 'Gravatar' => '', - // 'Hipchat' => '', - // 'Slack' => '', + '[%s] Overdue tasks' => '[%s] просроченные задачи', + 'Notification' => 'Уведомления', + '%s moved the task #%d to the first swimlane' => '%s задач перемещено #%d в первой дорожке', + '%s moved the task #%d to the swimlane "%s"' => '%s задач перемещено #%d в дорожке "%s"', + 'Swimlane' => 'Дорожки', + 'Gravatar' => 'Граватар', + 'Hipchat' => 'Hipchat', + 'Slack' => 'Slack', // '%s moved the task %s to the first swimlane' => '', // '%s moved the task %s to the swimlane "%s"' => '', - // 'This report contains all subtasks information for the given date range.' => '', - // 'This report contains all tasks information for the given date range.' => '', - // 'Project activities for %s' => '', + 'This report contains all subtasks information for the given date range.' => 'Этот отчет содержит всю информацию подзадач в заданном диапазоне дат.', + 'This report contains all tasks information for the given date range.' => 'Этот отчет содержит всю информацию для задачи в заданном диапазоне дат.', + 'Project activities for %s' => 'Активность проекта для %s', // 'view the board on Kanboard' => '', - // 'The task have been moved to the first swimlane' => '', - // 'The task have been moved to another swimlane:' => '', - // 'Overdue tasks for the project "%s"' => '', - // 'New title: %s' => '', - // 'The task is not assigned anymore' => '', + 'The task have been moved to the first swimlane' => 'Эта задача была перемещена в первую дорожку', + 'The task have been moved to another swimlane:' => 'Эта задача была перемещена в другую дорожку:', + 'Overdue tasks for the project "%s"' => 'Просроченные задачи для проекта "%s"', + 'New title: %s' => 'Новый заголовок: %s', + 'The task is not assigned anymore' => 'Задача больше не назначена', // 'New assignee: %s' => '', - // 'There is no category now' => '', - // 'New category: %s' => '', - // 'New color: %s' => '', - // 'New complexity: %d' => '', - // 'The due date have been removed' => '', - // 'There is no description anymore' => '', - // 'Recurrence settings have been modified' => '', - // 'Time spent changed: %sh' => '', - // 'Time estimated changed: %sh' => '', - // 'The field "%s" have been updated' => '', - // 'The description have been modified' => '', - // 'Do you really want to close the task "%s" as well as all subtasks?' => '', - // 'Swimlane: %s' => '', - // 'I want to receive notifications for:' => '', - // 'All tasks' => '', - // 'Only for tasks assigned to me' => '', - // 'Only for tasks created by me' => '', - // 'Only for tasks created by me and assigned to me' => '', - // '%A' => '', - // '%b %e, %Y, %k:%M %p' => '', - // 'New due date: %B %e, %Y' => '', - // 'Start date changed: %B %e, %Y' => '', - // '%k:%M %p' => '', - // '%%Y-%%m-%%d' => '', - // 'Total for all columns' => '', - // 'You need at least 2 days of data to show the chart.' => '', - // '<15m' => '', - // '<30m' => '', - // 'Stop timer' => '', - // 'Start timer' => '', - // 'Add project member' => '', - // 'Enable notifications' => '', - // 'My activity stream' => '', - // 'My calendar' => '', - // 'Search tasks' => '', - // 'Back to the calendar' => '', - // 'Filters' => '', - // 'Reset filters' => '', - // 'My tasks due tomorrow' => '', - // 'Tasks due today' => '', - // 'Tasks due tomorrow' => '', - // 'Tasks due yesterday' => '', - // 'Closed tasks' => '', - // 'Open tasks' => '', - // 'Not assigned' => '', - // 'View advanced search syntax' => '', - // 'Overview' => '', - // '%b %e %Y' => '', - // 'Board/Calendar/List view' => '', - // 'Switch to the board view' => '', - // 'Switch to the calendar view' => '', - // 'Switch to the list view' => '', - // 'Go to the search/filter box' => '', - // 'There is no activity yet.' => '', - // 'No tasks found.' => '', - // 'Keyboard shortcut: "%s"' => '', - // 'List' => '', - // 'Filter' => '', - // 'Advanced search' => '', - // 'Example of query: ' => '', - // 'Search by project: ' => '', - // 'Search by column: ' => '', - // 'Search by assignee: ' => '', - // 'Search by color: ' => '', - // 'Search by category: ' => '', - // 'Search by description: ' => '', - // 'Search by due date: ' => '', - // 'Lead and Cycle time for "%s"' => '', - // 'Average time spent into each column for "%s"' => '', - // 'Average time spent into each column' => '', - // 'Average time spent' => '', - // 'This chart show the average time spent into each column for the last %d tasks.' => '', - // 'Average Lead and Cycle time' => '', - // 'Average lead time: ' => '', - // 'Average cycle time: ' => '', - // 'Cycle Time' => '', - // 'Lead Time' => '', - // 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '', - // 'Average time into each column' => '', - // 'Lead and cycle time' => '', - // 'Google Authentication' => '', - // 'Help on Google authentication' => '', - // 'Github Authentication' => '', - // 'Help on Github authentication' => '', - // 'Channel/Group/User (Optional)' => '', - // 'Lead time: ' => '', - // 'Cycle time: ' => '', - // 'Time spent into each column' => '', - // 'The lead time is the duration between the task creation and the completion.' => '', - // 'The cycle time is the duration between the start date and the completion.' => '', + 'There is no category now' => 'В настоящее время здесь нет категорий', + 'New category: %s' => 'Новая категория: %s', + 'New color: %s' => 'Новый цвет: %s', + 'New complexity: %d' => 'Новая сложность: %d', + 'The due date have been removed' => 'Дата завершения была удалена', + 'There is no description anymore' => 'Здесь больше нет описания', + 'Recurrence settings have been modified' => 'Настройки повтора были изменены', + 'Time spent changed: %sh' => 'Изменение количества затраченного времени: %sh', + 'Time estimated changed: %sh' => 'Ожидаемый срок изменен: %sh', + 'The field "%s" have been updated' => 'Поле "%s" ,было изменено', + 'The description have been modified' => 'Описание было изменено', + 'Do you really want to close the task "%s" as well as all subtasks?' => 'Вы действительно хотите закрыть задачу "%s", а также все подзадачи?', + 'Swimlane: %s' => 'Дорожка: %s', + 'I want to receive notifications for:' => 'Я хочу получать уведомления для:', + 'All tasks' => 'Все задачи', + 'Only for tasks assigned to me' => 'Только для задач, назначенных на меня', + 'Only for tasks created by me' => 'Только для задач, созданных мной', + 'Only for tasks created by me and assigned to me' => 'Только для задач, созданных мной и назначенных мной', + '%A' => '%A', + '%b %e, %Y, %k:%M %p' => '%b %e, %Y, %k:%M %p', + 'New due date: %B %e, %Y' => 'Новая дата завершения: %B %e, %Y', + 'Start date changed: %B %e, %Y' => 'Изменить дату начала: %B %e, %Y', + '%k:%M %p' => '%k:%M %p', + '%%Y-%%m-%%d' => '%%Y-%%m-%%d', + 'Total for all columns' => 'Суммарно для всех колонок', + 'You need at least 2 days of data to show the chart.' => 'Для отображения диаграммы нужно по крайней мере 2 дня.', + '<15m' => '<15м', + '<30m' => '<30м', + 'Stop timer' => 'Остановить таймер', + 'Start timer' => 'Запустить таймер', + 'Add project member' => 'Добавить номер проекта', + 'Enable notifications' => 'Отключить уведомления', + 'My activity stream' => 'Лента моей активности', + 'My calendar' => 'Мой календарь', + 'Search tasks' => 'Поиск задачи', + 'Back to the calendar' => 'Вернуться в календарь', + 'Filters' => 'Фильтры', + 'Reset filters' => 'Сбросить фильтры', + 'My tasks due tomorrow' => 'Мои задачи на завтра', + 'Tasks due today' => 'Задачи, завершающиеся сегодня', + 'Tasks due tomorrow' => 'Задачи, завершающиеся завтра', + 'Tasks due yesterday' => 'Задачи, завершившиеся вчера', + 'Closed tasks' => 'Закрытые задачи', + 'Open tasks' => 'Открытые задачи', + 'Not assigned' => 'Не назначенные', + 'View advanced search syntax' => 'Просмотр расширенного синтаксиса поиска', + 'Overview' => 'Обзор', + '%b %e %Y' => '%b %e %Y', + 'Board/Calendar/List view' => 'Просмотр Доска/Календарь/Список', + 'Switch to the board view' => 'Переключиться в режим доски', + 'Switch to the calendar view' => 'Переключиться в режим календаря', + 'Switch to the list view' => 'Переключиться в режим списка', + 'Go to the search/filter box' => 'Перейти в поиск/фильтр', + 'There is no activity yet.' => 'Активности еще не было', + 'No tasks found.' => 'Задач не найдено.', + 'Keyboard shortcut: "%s"' => 'Сочетание клавиш: "%s"', + 'List' => 'Список', + 'Filter' => 'Фильтр', + 'Advanced search' => 'Расширенный поиск', + 'Example of query: ' => 'Пример запроса: ', + 'Search by project: ' => 'Поиск по проекту: ', + 'Search by column: ' => 'Поиск по колонкам: ', + 'Search by assignee: ' => 'Поису по назначенному: ', + 'Search by color: ' => 'Поиск по цвету: ', + 'Search by category: ' => 'Поиск по категориям: ', + 'Search by description: ' => 'Поиск по описанию: ', + 'Search by due date: ' => 'Поиск по дате завершения: ', + 'Lead and Cycle time for "%s"' => 'Затраченное время и время цикла для "%s"', + 'Average time spent into each column for "%s"' => 'Затрачено времени в среднем в каждой колонке для "%s"', + 'Average time spent into each column' => 'Затрачено времени в среднем в каждой колонке', + 'Average time spent' => 'Затрачено времени в среднем', + 'This chart show the average time spent into each column for the last %d tasks.' => 'Эта диаграмма показывает среднее время, проведенное задачами в каждой колонке за последний %d.', + 'Average Lead and Cycle time' => 'Среднее время выполнения и цикла', + 'Average lead time: ' => 'Среднее время выполнения', + 'Average cycle time: ' => 'Среднее время цикла', + 'Cycle Time' => 'Время цикла', + 'Lead Time' => 'Время выполнения', + 'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Эта диаграма показывает среднее время выполнения и цикла задачь в последние %d.', + 'Average time into each column' => 'Среднее время в каждом столбце', + 'Lead and cycle time' => 'Время выполнения и цикла', + 'Google Authentication' => 'Авторизация Google', + 'Help on Google authentication' => 'Помощь в авторизации Google', + 'Github Authentication' => 'Авторизация Github', + 'Help on Github authentication' => 'Помощь в авторизации Github', + 'Channel/Group/User (Optional)' => 'Канал/Группа/Пользователь (опционально)', + 'Lead time: ' => 'Время выполнения:', + 'Cycle time: ' => 'Время цикла:', + 'Time spent into each column' => 'Время, проведенное в каждой колонке', + 'The lead time is the duration between the task creation and the completion.' => 'Время выполнения - период между созданием задачи и завершения.', + 'The cycle time is the duration between the start date and the completion.' => 'Время цикла - период времени между датой начала и завершения.', // 'If the task is not closed the current time is used instead of the completion date.' => '', - // 'Set automatically the start date' => '', - // 'Edit Authentication' => '', - // 'Google Id' => '', - // 'Github Id' => '', - // 'Remote user' => '', - // 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '', - // 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => '', - // 'By @%s on Gitlab' => '', - // 'Gitlab issue comment created' => '', - // 'New remote user' => '', - // 'New local user' => '', - // 'Default task color' => '', - // 'Hide sidebar' => '', - // 'Expand sidebar' => '', - // 'This feature does not work with all browsers.' => '', - // 'There is no destination project available.' => '', - // 'Trigger automatically subtask time tracking' => '', - // 'Include closed tasks in the cumulative flow diagram' => '', - // 'Current swimlane: %s' => '', - // 'Current column: %s' => '', - // 'Current category: %s' => '', - // 'no category' => '', - // 'Current assignee: %s' => '', - // 'not assigned' => '', - // 'Author:' => '', - // 'contributors' => '', - // 'License:' => '', - // 'License' => '', - // 'Project Administrator' => '', - // 'Enter the text below' => '', - // 'Gantt chart for %s' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', - // 'Start date:' => '', - // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', - // 'People who are project managers' => '', - // 'People who are project members' => '', - // 'NOK - Norwegian Krone' => '', - // 'Show this column' => '', - // 'Hide this column' => '', - // 'open file' => '', - // 'End date' => '', - // 'Users overview' => '', - // 'Managers' => '', - // 'Members' => '', - // 'Shared project' => '', - // 'Project managers' => '', - // 'Project members' => '', - // 'Gantt chart for all projects' => '', - // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', - // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', - // 'Start date: %s' => '', - // 'End date: %s' => '', - // 'Link type' => '', - // 'Change task color when using a specific task link' => '', - // 'Task link creation or modification' => '', - // 'Login with my Gitlab Account' => '', - // 'Milestone' => '', - // 'Gitlab Authentication' => '', - // 'Help on Gitlab authentication' => '', - // 'Gitlab Id' => '', - // 'Gitlab Account' => '', - // 'Link my Gitlab Account' => '', - // 'Unlink my Gitlab Account' => '', - // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', - // 'Reset the search/filter box' => '', - // 'Documentation' => '', - // 'Table of contents' => '', - // 'Gantt' => '', - // 'Help with project permissions' => '', + 'Set automatically the start date' => 'Установить автоматическую дату начала', + 'Edit Authentication' => 'Редактировать авторизацию', + 'Google Id' => 'Google I', + 'Github Id' => 'Github Id', + 'Remote user' => 'Удаленный пользователь', + 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Учетные данные для входа через LDAP, Google и Github не будут сохранены в Kanboard.', + 'If you check the box "Disallow login form", credentials entered in the login form will be ignored.' => 'Если вы установите флажок "Запретить форму входа", учетные данные, введенные в форму входа будет игнорироваться.', + 'By @%s on Gitlab' => 'От @%s на Gitlab', + 'Gitlab issue comment created' => 'Был создан комментарий к задаче на Gitlab', + 'New remote user' => 'Новый удаленный пользователь', + 'New local user' => 'Новый локальный пользователь', + 'Default task color' => 'Стандартные цвета задач', + 'Hide sidebar' => 'Свернуть сайдбар', + 'Expand sidebar' => 'Показать сайдбар', + 'This feature does not work with all browsers.' => 'Эта функция доступна не во всех браузерах.', + 'There is no destination project available.' => 'Нет доступного для назначения проекта.', + 'Trigger automatically subtask time tracking' => 'Триггер автоматического отслеживания времени подзадач', + 'Include closed tasks in the cumulative flow diagram' => 'Включить в диаграмму закрытые задачи', + 'Current swimlane: %s' => 'Текущая дорожка: %s', + 'Current column: %s' => 'Текущая колонка: %s', + 'Current category: %s' => 'Текущая категория: %s', + 'no category' => 'без категории', + 'Current assignee: %s' => 'Current assignee: %s', + 'not assigned' => 'не назначен', + 'Author:' => 'Автор:', + 'contributors' => 'соавторы', + 'License:' => 'Лицензия:', + 'License' => 'Лицензия', + 'Project Administrator' => 'Администратор проекта', + 'Enter the text below' => 'Введите текст ниже', + 'Gantt chart for %s' => 'Диаграмма Гантта для %s', + 'Sort by position' => 'Сортировать по позиции', + 'Sort by date' => 'Сортировать по дате', + 'Add task' => 'Добавить задачу', + 'Start date:' => 'Дата начала:', + 'Due date:' => 'Дата завершения:', + 'There is no start date or due date for this task.' => 'Для этой задачи нет даты начала или завершения.', + 'Moving or resizing a task will change the start and due date of the task.' => 'Изменение или перемещение задачи повлечет изменение даты начала завершения задачи.', + 'There is no task in your project.' => 'В Вашем проекте задач нет.', + 'Gantt chart' => 'Диаграмма Гантта', + 'People who are project managers' => 'Люди, которые менеджеры проекта', + 'People who are project members' => 'Люди, которые участники проекта', + 'NOK - Norwegian Krone' => 'НК - Норвежская крона', + 'Show this column' => 'Показать эту колонку', + 'Hide this column' => 'Спрятать эту колонку', + 'open file' => 'открыть файл', + 'End date' => 'Дата завершения', + 'Users overview' => 'Обзор пользователей', + 'Managers' => 'Менеджеры', + 'Members' => 'Участники', + 'Shared project' => 'Общие/публичные проекты', + 'Project managers' => 'Менеджер проекта', + 'Project members' => 'Участники проекта', + 'Gantt chart for all projects' => 'Диаграмма Гантта для всех проектов', + 'Projects list' => 'Список проектов', + 'Gantt chart for this project' => 'Диаграмма Гантта для этого проекта', + 'Project board' => 'Доска проекта', + 'End date:' => 'Дата завершения:', + 'There is no start date or end date for this project.' => 'В проекте не указаны дата начала или завершения.', + 'Projects Gantt chart' => 'Диаграмма Гантта проектов', + 'Start date: %s' => 'Дата начала: %s', + 'End date: %s' => 'Дата завершения: %s', + 'Link type' => 'Тип ссылки', + 'Change task color when using a specific task link' => 'Изменение цвета задач при использовании ссылки на определенные задачи', + 'Task link creation or modification' => 'Ссылка на создание или модификацию задачи', + 'Login with my Gitlab Account' => 'Авторизоваться через аккаунт Gitlab', + 'Milestone' => 'Веха', + 'Gitlab Authentication' => 'Авторизация через Gitlab', + 'Help on Gitlab authentication' => 'Помощь а авторизации через Gitlab', + 'Gitlab Id' => 'Gitlab Id', + 'Gitlab Account' => 'Аккаунт Gitlab', + 'Link my Gitlab Account' => 'Привязать аккаунт Gitlab', + 'Unlink my Gitlab Account' => 'Отвязать аккаунт Gitlab', + 'Documentation: %s' => 'Документация: %s', + 'Switch to the Gantt chart view' => 'Переключиться в режим диаграммы Гантта', + 'Reset the search/filter box' => 'Сбросить поиск/фильтр', + 'Documentation' => 'Документация', + 'Table of contents' => 'Сожержание', + 'Gantt' => 'Гантт', + 'Help with project permissions' => 'Помощь с правами доступа по проекту', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/sr_Latn_RS/translations.php b/sources/app/Locale/sr_Latn_RS/translations.php index 0bc5c24..0f80aa1 100644 --- a/sources/app/Locale/sr_Latn_RS/translations.php +++ b/sources/app/Locale/sr_Latn_RS/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Udaljno', 'Enabled' => 'Omogući', 'Disabled' => 'Onemogući', - 'Google account linked' => 'Połączone konto Google', - 'Github account linked' => 'Połączone konto Github', 'Username:' => 'Korisničko ime:', 'Name:' => 'Ime i Prezime', 'Email:' => 'Email: ', @@ -667,75 +665,26 @@ return array( // 'Horizontal scrolling' => '', // 'Compact/wide view' => '', // 'No results match:' => '', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - // 'Hourly rates' => '', - // 'Hourly rate' => '', // 'Currency' => '', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - // 'Manage timetable' => '', - // 'Overtime timetable' => '', - // 'Time off timetable' => '', - // 'Timetable' => '', - // 'Work timetable' => '', - // 'Week timetable' => '', - // 'Day timetable' => '', - // 'From' => '', - // 'To' => '', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', // 'Files' => '', // 'Images' => '', // 'Private project' => '', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - // 'Budget' => '', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', // 'download' => '', - // 'Do you really want to remove this budget line?' => '', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', // 'Move the task to another column when assignee is cleared' => '', // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/sv_SE/translations.php b/sources/app/Locale/sv_SE/translations.php index 9c76972..f1994f8 100644 --- a/sources/app/Locale/sv_SE/translations.php +++ b/sources/app/Locale/sv_SE/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Fjärr', 'Enabled' => 'Aktiverad', 'Disabled' => 'Inaktiverad', - 'Google account linked' => 'Googlekonto länkat', - 'Github account linked' => 'Githubkonto länkat', 'Username:' => 'Användarnam:', 'Name:' => 'Namn:', 'Email:' => 'E-post:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Horisontell scroll', 'Compact/wide view' => 'Kompakt/bred vy', 'No results match:' => 'Inga matchande resultat', - 'Remove hourly rate' => 'Ta bort timtaxa', - 'Do you really want to remove this hourly rate?' => 'Vill du verkligen ta bort denna timtaxa?', - 'Hourly rates' => 'Timtaxor', - 'Hourly rate' => 'Timtaxa', 'Currency' => 'Valuta', - 'Effective date' => 'Giltighetsdatum', - 'Add new rate' => 'Lägg till ny taxa', - 'Rate removed successfully.' => 'Taxan togs bort.', - 'Unable to remove this rate.' => 'Kunde inte ta bort taxan.', - 'Unable to save the hourly rate.' => 'Kunde inte spara timtaxan.', - 'Hourly rate created successfully.' => 'Timtaxan skapades.', - 'Start time' => 'Starttid', - 'End time' => 'Sluttid', - 'Comment' => 'Kommentar', - 'All day' => 'Hela dagen', - 'Day' => 'Dag', - 'Manage timetable' => 'Hantera timplan', - 'Overtime timetable' => 'Övertidstimplan', - 'Time off timetable' => 'Ledighetstimplan', - 'Timetable' => 'Timplan', - 'Work timetable' => 'Arbetstimplan', - 'Week timetable' => 'Veckotidplan', - 'Day timetable' => 'Dagstimplan', - 'From' => 'Från', - 'To' => 'Till', - 'Time slot created successfully.' => 'Tidslucka skapad.', - 'Unable to save this time slot.' => 'Kunde inte spara tidsluckan.', - 'Time slot removed successfully.' => 'Tidsluckan tog bort.', - 'Unable to remove this time slot.' => 'Kunde inte ta bort tidsluckan.', - 'Do you really want to remove this time slot?' => 'Vill du verkligen ta bort tidsluckan?', - 'Remove time slot' => 'Ta bort tidslucka', - 'Add new time slot' => 'Lägg till ny tidslucka', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => 'Denna tidslucka används när kryssrutan "hela dagen" är kryssad vid schemalagd ledighet eller övertid.', 'Files' => 'Filer', 'Images' => 'Bilder', 'Private project' => 'Privat projekt', - 'Amount' => 'Belopp', 'AUD - Australian Dollar' => 'AUD - Australiska dollar', - 'Budget' => 'Budget', - 'Budget line' => 'Budgetlinje', - 'Budget line removed successfully.' => 'Budgetlinjen togs bort.', - 'Budget lines' => 'Budgetlinjer', 'CAD - Canadian Dollar' => 'CAD - Kanadensiska dollar', 'CHF - Swiss Francs' => 'CHF - Schweiziska Franc', - 'Cost' => 'Kostnad', - 'Cost breakdown' => 'Kostnadssammanställning', 'Custom Stylesheet' => 'Anpassad stilmall', 'download' => 'ladda ned', - 'Do you really want to remove this budget line?' => 'Vill du verkligen ta bort budgetlinjen?', 'EUR - Euro' => 'EUR - Euro', - 'Expenses' => 'Utgifter', 'GBP - British Pound' => 'GBP - Brittiska Pund', 'INR - Indian Rupee' => 'INR - Indiska Rupier', 'JPY - Japanese Yen' => 'JPY - Japanska Yen', - 'New budget line' => 'Ny budgetlinje', 'NZD - New Zealand Dollar' => 'NZD - Nya Zeeländska Dollar', - 'Remove a budget line' => 'Ta bort en budgetlinje', - 'Remove budget line' => 'Ta bort budgetlinje', 'RSD - Serbian dinar' => 'RSD - Serbiska Dinarer', - 'The budget line have been created successfully.' => 'Budgetlinjen har skapats.', - 'Unable to create the budget line.' => 'Kunde inte skapa budgetlinjen.', - 'Unable to remove this budget line.' => 'Kunde inte ta bort budgetlinjen.', 'USD - US Dollar' => 'USD - Amerikanska Dollar', - 'Remaining' => 'Återstående', 'Destination column' => 'Målkolumn', 'Move the task to another column when assigned to a user' => 'Flytta uppgiften till en annan kolumn när den tilldelats en användare', 'Move the task to another column when assignee is cleared' => 'Flytta uppgiften till en annan kolumn när tilldelningen tas bort.', 'Source column' => 'Källkolumn', - 'Show subtask estimates (forecast of future work)' => 'Visa uppskattningar för deluppgifter (prognos för framtida arbete)', 'Transitions' => 'Övergångar', 'Executer' => 'Verkställare', 'Time spent in the column' => 'Tid i kolumnen.', @@ -746,7 +695,6 @@ return array( 'Rate' => 'Kurs', 'Change reference currency' => 'Ändra referenskurs', 'Add a new currency rate' => 'Lägg till ny valutakurs', - 'Currency rates are used to calculate project budget.' => 'Valutakurser används för att beräkna projektbudget.', 'Reference currency' => 'Referensvaluta', 'The currency rate have been added successfully.' => 'Valutakursen har lagts till.', 'Unable to add this currency rate.' => 'Kunde inte lägga till valutakursen.', @@ -878,9 +826,6 @@ return array( '%s moved the task #%d to the first swimlane' => '%s flyttade uppgiften #%d till första swimlane', '%s moved the task #%d to the swimlane "%s"' => '%s flyttade uppgiften #%d till swimlane "%s"', 'Swimlane' => 'Swimlane', - 'Budget overview' => 'Budgetöversikt', - 'Type' => 'Typ', - 'There is not enough data to show something.' => 'Det finns inte tillräckligt mycket data för att visa något.', 'Gravatar' => 'Gravatar', 'Hipchat' => 'Hipchat', 'Slack' => 'Slack', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/th_TH/translations.php b/sources/app/Locale/th_TH/translations.php index a5ed247..931bd87 100644 --- a/sources/app/Locale/th_TH/translations.php +++ b/sources/app/Locale/th_TH/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'รีโมท', 'Enabled' => 'เปิดการใช้', 'Disabled' => 'ปิดการใช้', - 'Google account linked' => 'เชื่อมกับกูเกิลแอคเคาท์', - 'Github account linked' => 'เชื่อมกับกิทฮับแอคเคาท์', 'Username:' => 'ชื่อผู้ใช้:', 'Name:' => 'ชื่อ:', 'Email:' => 'อีเมล:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'เลื่อนตามแนวนอน', 'Compact/wide view' => 'พอดี/กว้าง มุมมอง', 'No results match:' => 'ไม่มีผลลัพท์ที่ตรง', - 'Remove hourly rate' => 'ลบอัตรารายชั่วโมง', - 'Do you really want to remove this hourly rate?' => 'คุณต้องการลบอัตรารายชั่วโมง?', - 'Hourly rates' => 'อัตรารายชั่วโมง', - 'Hourly rate' => 'อัตรารายชั่วโมง', 'Currency' => 'สกุลเงิน', - 'Effective date' => 'วันที่จ่าย', - 'Add new rate' => 'เพิ่มอัตราใหม่', - 'Rate removed successfully.' => 'ลบอัตราเรียบร้อยแล้ว', - 'Unable to remove this rate.' => 'ไม่สามารถลบอัตรานี้ได้', - 'Unable to save the hourly rate.' => 'ไม่สามารถบันทึกอัตรารายชั่วโมง', - 'Hourly rate created successfully.' => 'อัตรารายชั่วโมงสร้างเรียบร้อยแล้ว', - 'Start time' => 'เวลาเริ่มต้น', - 'End time' => 'เวลาจบ', - 'Comment' => 'ความคิดเห็น', - 'All day' => 'ทั้งวัน', - 'Day' => 'วัน', - 'Manage timetable' => 'จัดการตารางเวลา', - 'Overtime timetable' => 'ตารางเวลาโอที', - 'Time off timetable' => 'ตารางเวลาวันหยุด', - 'Timetable' => 'ตารางเวลา', - 'Work timetable' => 'ตารางเวลางาน', - 'Week timetable' => 'ตารางเวลาสัปดาห์', - 'Day timetable' => 'ตารางเวลาวัน', - 'From' => 'จาก', - 'To' => 'ถึง', - 'Time slot created successfully.' => 'สร้างช่วงเวลาเรียบร้อยแล้ว', - 'Unable to save this time slot.' => 'ไม่สามารถบันทึกช่วงเวลานี้', - 'Time slot removed successfully.' => 'ลบช่วงเวลาเรียบร้อยแล้ว', - 'Unable to remove this time slot.' => 'ไม่สามารถลบช่วงเวลาได้', - 'Do you really want to remove this time slot?' => 'คุณต้องการลบช่วงเวลานี้?', - 'Remove time slot' => 'ลบช่วงเวลา', - 'Add new time slot' => 'เพิ่มช่วงเวลาใหม่', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', 'Files' => 'ไฟล์', 'Images' => 'รูปภาพ', 'Private project' => 'โปรเจคส่วนตัว', - 'Amount' => 'จำนวนเงิน', // 'AUD - Australian Dollar' => '', - 'Budget' => 'งบประมาณ', - 'Budget line' => 'วงเงินงบประมาณ', - 'Budget line removed successfully.' => 'ลบวงเงินประมาณเรียบร้อยแล้ว', - 'Budget lines' => 'วงเงินงบประมาณ', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - 'Cost' => 'มูลค่า', - 'Cost breakdown' => 'รายละเอียดค่าใช้จ่าย', // 'Custom Stylesheet' => '', 'download' => 'ดาวน์โหลด', - 'Do you really want to remove this budget line?' => 'คุณต้องการลบวงเงินงบประมาณนี้?', // 'EUR - Euro' => '', - 'Expenses' => 'รายจ่าย', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - 'New budget line' => 'วงเงินงบประมาณใหม่', // 'NZD - New Zealand Dollar' => '', - 'Remove a budget line' => 'ลบวงเงินประมาณ', - 'Remove budget line' => 'ลบวงเงินประมาณ', // 'RSD - Serbian dinar' => '', - 'The budget line have been created successfully.' => 'สร้างวงเงินงบประมาณเรียบร้อยแล้ว', - 'Unable to create the budget line.' => 'ไม่สามารถสร้างวงเงินงบประมาณได้', - 'Unable to remove this budget line.' => 'ไม่สามารถลบวงเงินงบประมาณนี้', // 'USD - US Dollar' => '', - 'Remaining' => 'เหลืออยู่', 'Destination column' => 'คอลัมน์เป้าหมาย', 'Move the task to another column when assigned to a user' => 'ย้ายงานไปคอลัมน์อื่นเมื่อกำหนดบุคคลรับผิดชอบ', 'Move the task to another column when assignee is cleared' => 'ย้ายงานไปคอลัมน์อื่นเมื่อไม่กำหนดบุคคลรับผิดชอบ', 'Source column' => 'คอลัมน์ต้นทาง', - // 'Show subtask estimates (forecast of future work)' => '', 'Transitions' => 'การเปลี่ยนคอลัมน์', 'Executer' => 'ผู้ประมวลผล', 'Time spent in the column' => 'เวลาที่ใช้ในคอลัมน์', @@ -746,7 +695,6 @@ return array( 'Rate' => 'อัตรา', // 'Change reference currency' => '', 'Add a new currency rate' => 'เพิ่มอัตราแลกเปลี่ยนเงินตราใหม่', - 'Currency rates are used to calculate project budget.' => 'อัตราแลกเปลี่ยนเงินตราถูกใช้ในการคำนวณงบประมาณของโปรเจค', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/tr_TR/translations.php b/sources/app/Locale/tr_TR/translations.php index 9eb5c41..53f8fb9 100644 --- a/sources/app/Locale/tr_TR/translations.php +++ b/sources/app/Locale/tr_TR/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => 'Uzak', 'Enabled' => 'Etkinleştirildi', 'Disabled' => 'Devre dışı bırakıldı', - 'Google account linked' => 'Google hesabıyla bağlı', - 'Github account linked' => 'Github hesabıyla bağlı', 'Username:' => 'Kullanıcı adı', 'Name:' => 'Ad', 'Email:' => 'E-Posta', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => 'Geniş görünüm', 'Compact/wide view' => 'Ekrana sığdır / Geniş görünüm', // 'No results match:' => '', - // 'Remove hourly rate' => '', - // 'Do you really want to remove this hourly rate?' => '', - // 'Hourly rates' => '', - // 'Hourly rate' => '', // 'Currency' => '', - // 'Effective date' => '', - // 'Add new rate' => '', - // 'Rate removed successfully.' => '', - // 'Unable to remove this rate.' => '', - // 'Unable to save the hourly rate.' => '', - // 'Hourly rate created successfully.' => '', - // 'Start time' => '', - // 'End time' => '', - // 'Comment' => '', - // 'All day' => '', - // 'Day' => '', - // 'Manage timetable' => '', - // 'Overtime timetable' => '', - // 'Time off timetable' => '', - // 'Timetable' => '', - // 'Work timetable' => '', - // 'Week timetable' => '', - // 'Day timetable' => '', - // 'From' => '', - // 'To' => '', - // 'Time slot created successfully.' => '', - // 'Unable to save this time slot.' => '', - // 'Time slot removed successfully.' => '', - // 'Unable to remove this time slot.' => '', - // 'Do you really want to remove this time slot?' => '', - // 'Remove time slot' => '', - // 'Add new time slot' => '', - // 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '', // 'Files' => '', // 'Images' => '', // 'Private project' => '', - // 'Amount' => '', // 'AUD - Australian Dollar' => '', - // 'Budget' => '', - // 'Budget line' => '', - // 'Budget line removed successfully.' => '', - // 'Budget lines' => '', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - // 'Cost' => '', - // 'Cost breakdown' => '', // 'Custom Stylesheet' => '', // 'download' => '', - // 'Do you really want to remove this budget line?' => '', // 'EUR - Euro' => '', - // 'Expenses' => '', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - // 'New budget line' => '', // 'NZD - New Zealand Dollar' => '', - // 'Remove a budget line' => '', - // 'Remove budget line' => '', // 'RSD - Serbian dinar' => '', - // 'The budget line have been created successfully.' => '', - // 'Unable to create the budget line.' => '', - // 'Unable to remove this budget line.' => '', // 'USD - US Dollar' => '', - // 'Remaining' => '', // 'Destination column' => '', // 'Move the task to another column when assigned to a user' => '', // 'Move the task to another column when assignee is cleared' => '', // 'Source column' => '', - // 'Show subtask estimates (forecast of future work)' => '', // 'Transitions' => '', // 'Executer' => '', // 'Time spent in the column' => '', @@ -746,7 +695,6 @@ return array( // 'Rate' => '', // 'Change reference currency' => '', // 'Add a new currency rate' => '', - // 'Currency rates are used to calculate project budget.' => '', // 'Reference currency' => '', // 'The currency rate have been added successfully.' => '', // 'Unable to add this currency rate.' => '', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - // 'Budget overview' => '', - // 'Type' => '', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Locale/zh_CN/translations.php b/sources/app/Locale/zh_CN/translations.php index 910bc0b..5863934 100644 --- a/sources/app/Locale/zh_CN/translations.php +++ b/sources/app/Locale/zh_CN/translations.php @@ -395,8 +395,6 @@ return array( 'Remote' => '远程', 'Enabled' => '启用', 'Disabled' => '停用', - 'Google account linked' => '已经链接谷歌账号', - 'Github account linked' => '已经链接Github账号', 'Username:' => '用户名:', 'Name:' => '姓名:', 'Email:' => '电子邮件:', @@ -667,75 +665,26 @@ return array( 'Horizontal scrolling' => '水平滚动', 'Compact/wide view' => '紧凑/宽视图', 'No results match:' => '无匹配结果:', - 'Remove hourly rate' => '删除小时工资', - 'Do you really want to remove this hourly rate?' => '确定要删除此计时工资吗?', - 'Hourly rates' => '小时工资', - 'Hourly rate' => '小时工资', 'Currency' => '货币', - 'Effective date' => '开始时间', - 'Add new rate' => '添加小时工资', - 'Rate removed successfully.' => '成功删除工资。', - 'Unable to remove this rate.' => '无法删除此小时工资。', - 'Unable to save the hourly rate.' => '无法删除小时工资。', - 'Hourly rate created successfully.' => '成功创建小时工资。', - 'Start time' => '开始时间', - 'End time' => '结束时1间', - 'Comment' => '注释', - 'All day' => '全天', - 'Day' => '日期', - 'Manage timetable' => '管理时间表', - // 'Overtime timetable' => '', - 'Time off timetable' => '加班时间表', - 'Timetable' => '时间表', - 'Work timetable' => '工作时间表', - 'Week timetable' => '周时间表', - 'Day timetable' => '日时间表', - 'From' => '从', - 'To' => '到', - 'Time slot created successfully.' => '成功创建时间段。', - 'Unable to save this time slot.' => '无法保存此时间段。', - 'Time slot removed successfully.' => '成功删除时间段。', - 'Unable to remove this time slot.' => '无法删除此时间段。', - 'Do you really want to remove this time slot?' => '确认要删除此时间段吗?', - 'Remove time slot' => '删除时间段', - 'Add new time slot' => '添加新时间段', - 'This timetable is used when the checkbox "all day" is checked for scheduled time off and overtime.' => '如果在放假和加班计划中选择全天,则会使用这里配置的时间段。', 'Files' => '文件', 'Images' => '图片', 'Private project' => '私人项目', - 'Amount' => '数量', // 'AUD - Australian Dollar' => '', - 'Budget' => '预算', - 'Budget line' => '预算线', - 'Budget line removed successfully.' => '成功删除预算线', - 'Budget lines' => '预算线', // 'CAD - Canadian Dollar' => '', // 'CHF - Swiss Francs' => '', - 'Cost' => '成本', - 'Cost breakdown' => '成本分解', 'Custom Stylesheet' => '自定义样式表', 'download' => '下载', - 'Do you really want to remove this budget line?' => '确定要删除此预算线吗?', // 'EUR - Euro' => '', - 'Expenses' => '花费', // 'GBP - British Pound' => '', // 'INR - Indian Rupee' => '', // 'JPY - Japanese Yen' => '', - 'New budget line' => '新预算线', // 'NZD - New Zealand Dollar' => '', - 'Remove a budget line' => '删除预算线', - 'Remove budget line' => '删除预算线', // 'RSD - Serbian dinar' => '', - 'The budget line have been created successfully.' => '成功创建预算线。', - 'Unable to create the budget line.' => '无法创建预算线。', - 'Unable to remove this budget line.' => '无法删除此预算线。', // 'USD - US Dollar' => '', - 'Remaining' => '剩余', 'Destination column' => '目标栏目', 'Move the task to another column when assigned to a user' => '指定负责人时移动到其它栏目', 'Move the task to another column when assignee is cleared' => '移除负责人时移动到其它栏目', 'Source column' => '原栏目', - // 'Show subtask estimates (forecast of future work)' => '', 'Transitions' => '变更', 'Executer' => '执行者', 'Time spent in the column' => '栏目中的时间消耗', @@ -746,7 +695,6 @@ return array( 'Rate' => '汇率', 'Change reference currency' => '修改参考货币', 'Add a new currency rate' => '添加新汇率', - 'Currency rates are used to calculate project budget.' => '汇率会用来计算项目预算。', 'Reference currency' => '参考货币', 'The currency rate have been added successfully.' => '成功添加汇率。', 'Unable to add this currency rate.' => '无法添加此汇率', @@ -878,9 +826,6 @@ return array( // '%s moved the task #%d to the first swimlane' => '', // '%s moved the task #%d to the swimlane "%s"' => '', // 'Swimlane' => '', - 'Budget overview' => '预算概览', - 'Type' => '类型', - // 'There is not enough data to show something.' => '', // 'Gravatar' => '', // 'Hipchat' => '', // 'Slack' => '', @@ -1067,4 +1012,48 @@ return array( // 'Table of contents' => '', // 'Gantt' => '', // 'Help with project permissions' => '', + // 'Author' => '', + // 'Version' => '', + // 'Plugins' => '', + // 'There is no plugin loaded.' => '', + // 'Set maximum column height' => '', + // 'Remove maximum column height' => '', + // 'My notifications' => '', + // 'Custom filters' => '', + // 'Your custom filter have been created successfully.' => '', + // 'Unable to create your custom filter.' => '', + // 'Custom filter removed successfully.' => '', + // 'Unable to remove this custom filter.' => '', + // 'Edit custom filter' => '', + // 'Your custom filter have been updated successfully.' => '', + // 'Unable to update custom filter.' => '', + // 'Web' => '', + // 'New attachment on task #%d: %s' => '', + // 'New comment on task #%d' => '', + // 'Comment updated on task #%d' => '', + // 'New subtask on task #%d' => '', + // 'Subtask updated on task #%d' => '', + // 'New task #%d: %s' => '', + // 'Task updated #%d' => '', + // 'Task #%d closed' => '', + // 'Task #%d opened' => '', + // 'Column changed for task #%d' => '', + // 'New position for task #%d' => '', + // 'Swimlane changed for task #%d' => '', + // 'Assignee changed on task #%d' => '', + // '%d overdue tasks' => '', + // 'Task #%d is overdue' => '', + // 'No new notifications.' => '', + // 'Mark all as read' => '', + // 'Mark as read' => '', + // 'Total number of tasks in this column across all swimlanes' => '', + // 'Collapse swimlane' => '', + // 'Expand swimlane' => '', + // 'Add a new filter' => '', + // 'Share with all project members' => '', + // 'Shared' => '', + // 'Owner' => '', + // 'Unread notifications' => '', + // 'My filters' => '', + // 'Notification methods:' => '', ); diff --git a/sources/app/Model/Acl.php b/sources/app/Model/Acl.php index 8c28cb1..675ca36 100644 --- a/sources/app/Model/Acl.php +++ b/sources/app/Model/Acl.php @@ -47,6 +47,7 @@ class Acl extends Base 'taskstatus' => '*', 'tasklink' => '*', 'timer' => '*', + 'customfilter' => '*', 'calendar' => array('show', 'project'), ); @@ -64,7 +65,6 @@ class Acl extends Base 'export' => '*', 'project' => array('edit', 'update', 'share', 'integration', 'users', 'alloweverybody', 'allow', 'setowner', 'revoke', 'duplicate', 'disable', 'enable'), 'swimlane' => '*', - 'budget' => '*', 'gantt' => array('project', 'savetaskdate', 'task', 'savetask'), ); @@ -94,6 +94,18 @@ class Acl extends Base 'twofactor' => array('disable'), ); + /** + * Extend ACL rules + * + * @access public + * @param string $acl_name + * @param aray $rules + */ + public function extend($acl_name, array $rules) + { + $this->$acl_name = array_merge($this->$acl_name, $rules); + } + /** * Return true if the specified controller/action match the given acl * diff --git a/sources/app/Model/Action.php b/sources/app/Model/Action.php index 87058cc..57bd5b0 100644 --- a/sources/app/Model/Action.php +++ b/sources/app/Model/Action.php @@ -30,6 +30,28 @@ class Action extends Base */ const TABLE_PARAMS = 'action_has_params'; + /** + * Extended actions + * + * @access private + * @var array + */ + private $actions = array(); + + /** + * Extend the list of default actions + * + * @access public + * @param string $className + * @param string $description + * @return Action + */ + public function extendActions($className, $description) + { + $this->actions[$className] = $description; + return $this; + } + /** * Return the name and description of available actions * @@ -62,6 +84,8 @@ class Action extends Base 'TaskAssignColorLink' => t('Change task color when using a specific task link'), ); + $values = array_merge($values, $this->actions); + asort($values); return $values; @@ -296,7 +320,7 @@ class Action extends Base */ public function load($name, $project_id, $event) { - $className = '\Action\\'.$name; + $className = $name{0} !== '\\' ? '\Action\\'.$name : $name; return new $className($this->container, $project_id, $event); } diff --git a/sources/app/Model/Base.php b/sources/app/Model/Base.php index 973462c..902ab26 100644 --- a/sources/app/Model/Base.php +++ b/sources/app/Model/Base.php @@ -12,26 +12,6 @@ use Pimple\Container; */ abstract class Base extends \Core\Base { - /** - * Database instance - * - * @access protected - * @var \PicoDb\Database - */ - protected $db; - - /** - * Constructor - * - * @access public - * @param \Pimple\Container $container - */ - public function __construct(Container $container) - { - $this->container = $container; - $this->db = $this->container['db']; - } - /** * Save a record in the database * @@ -62,14 +42,30 @@ abstract class Base extends \Core\Base public function removeFields(array &$values, array $keys) { foreach ($keys as $key) { - if (isset($values[$key])) { + if (array_key_exists($key, $values)) { unset($values[$key]); } } } /** - * Force some fields to be at 0 if empty + * Remove keys from an array if empty + * + * @access public + * @param array $values Input array + * @param string[] $keys List of keys to remove + */ + public function removeEmptyFields(array &$values, array $keys) + { + foreach ($keys as $key) { + if (array_key_exists($key, $values) && empty($values[$key])) { + unset($values[$key]); + } + } + } + + /** + * Force fields to be at 0 if empty * * @access public * @param array $values Input array @@ -100,6 +96,22 @@ abstract class Base extends \Core\Base } } + /** + * Force some fields to be null if empty + * + * @access public + * @param array $values Input array + * @param string[] $keys List of keys + */ + public function convertNullFields(array &$values, array $keys) + { + foreach ($keys as $key) { + if (array_key_exists($key, $values) && empty($values[$key])) { + $values[$key] = null; + } + } + } + /** * Build SQL condition for a given time range * @@ -124,26 +136,6 @@ abstract class Base extends \Core\Base return $start_column.' IS NOT NULL AND '.$start_column.' > 0 AND ('.implode(' OR ', $conditions).')'; } - /** - * Get common properties for task calendar events - * - * @access protected - * @param array $task - * @return array - */ - protected function getTaskCalendarProperties(array &$task) - { - return array( - 'timezoneParam' => $this->config->getCurrentTimezone(), - 'id' => $task['id'], - 'title' => t('#%d', $task['id']).' '.$task['title'], - 'backgroundColor' => $this->color->getBackgroundColor($task['color_id']), - 'borderColor' => $this->color->getBorderColor($task['color_id']), - 'textColor' => 'black', - 'url' => $this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), - ); - } - /** * Group a collection of records by a column * diff --git a/sources/app/Model/Board.php b/sources/app/Model/Board.php index b1032e9..7217542 100644 --- a/sources/app/Model/Board.php +++ b/sources/app/Model/Board.php @@ -252,16 +252,24 @@ class Board extends Base $swimlanes[$i]['columns'] = $columns; $swimlanes[$i]['nb_columns'] = $nb_columns; $swimlanes[$i]['nb_tasks'] = 0; + $swimlanes[$i]['nb_swimlanes'] = $ilen; for ($j = 0; $j < $nb_columns; $j++) { $column_id = $columns[$j]['id']; $swimlane_id = $swimlanes[$i]['id']; + if (! isset($swimlanes[0]['columns'][$j]['nb_column_tasks'])) { + $swimlanes[0]['columns'][$j]['nb_column_tasks'] = 0; + $swimlanes[0]['columns'][$j]['total_score'] = 0; + } + $swimlanes[$i]['columns'][$j]['tasks'] = $callback === null ? $this->taskFinder->getTasksByColumnAndSwimlane($project_id, $column_id, $swimlane_id) : $callback($project_id, $column_id, $swimlane_id); $swimlanes[$i]['columns'][$j]['nb_tasks'] = count($swimlanes[$i]['columns'][$j]['tasks']); $swimlanes[$i]['columns'][$j]['score'] = $this->getColumnSum($swimlanes[$i]['columns'][$j]['tasks'], 'score'); $swimlanes[$i]['nb_tasks'] += $swimlanes[$i]['columns'][$j]['nb_tasks']; + $swimlanes[0]['columns'][$j]['nb_column_tasks'] += $swimlanes[$i]['columns'][$j]['nb_tasks']; + $swimlanes[0]['columns'][$j]['total_score'] += $swimlanes[$i]['columns'][$j]['score']; } } @@ -394,6 +402,18 @@ class Board extends Base return (int) $this->db->table(self::TABLE)->eq('project_id', $project_id)->eq('title', $title)->findOneColumn('id'); } + /** + * Get a column title by the id + * + * @access public + * @param integer $column_id + * @return integer + */ + public function getColumnTitleById($column_id) + { + return $this->db->table(self::TABLE)->eq('id', $column_id)->findOneColumn('title'); + } + /** * Get the position of the last column for a given project * diff --git a/sources/app/Model/Budget.php b/sources/app/Model/Budget.php deleted file mode 100644 index 76c42ca..0000000 --- a/sources/app/Model/Budget.php +++ /dev/null @@ -1,214 +0,0 @@ -db->table(self::TABLE)->eq('project_id', $project_id)->desc('date')->findAll(); - } - - /** - * Get the current total of the budget - * - * @access public - * @param integer $project_id - * @return float - */ - public function getTotal($project_id) - { - $result = $this->db->table(self::TABLE)->columns('SUM(amount) as total')->eq('project_id', $project_id)->findOne(); - return isset($result['total']) ? (float) $result['total'] : 0; - } - - /** - * Get breakdown by tasks/subtasks/users - * - * @access public - * @param integer $project_id - * @return \PicoDb\Table - */ - public function getSubtaskBreakdown($project_id) - { - return $this->db - ->table(SubtaskTimeTracking::TABLE) - ->columns( - SubtaskTimeTracking::TABLE.'.id', - SubtaskTimeTracking::TABLE.'.user_id', - SubtaskTimeTracking::TABLE.'.subtask_id', - SubtaskTimeTracking::TABLE.'.start', - SubtaskTimeTracking::TABLE.'.time_spent', - Subtask::TABLE.'.task_id', - Subtask::TABLE.'.title AS subtask_title', - Task::TABLE.'.title AS task_title', - Task::TABLE.'.project_id', - User::TABLE.'.username', - User::TABLE.'.name' - ) - ->join(Subtask::TABLE, 'id', 'subtask_id') - ->join(Task::TABLE, 'id', 'task_id', Subtask::TABLE) - ->join(User::TABLE, 'id', 'user_id') - ->eq(Task::TABLE.'.project_id', $project_id) - ->callback(array($this, 'applyUserRate')); - } - - /** - * Gather necessary information to display the budget graph - * - * @access public - * @param integer $project_id - * @return array - */ - public function getDailyBudgetBreakdown($project_id) - { - $out = array(); - $in = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->gt('amount', 0)->asc('date')->getAll('date', 'amount'); - $time_slots = $this->getSubtaskBreakdown($project_id)->findAll(); - - foreach ($time_slots as $slot) { - $date = date('Y-m-d', $slot['start']); - - if (! isset($out[$date])) { - $out[$date] = 0; - } - - $out[$date] += $slot['cost']; - } - - $start = key($in) ?: key($out); - $end = new DateTime; - $left = 0; - $serie = array(); - - for ($today = new DateTime($start); $today <= $end; $today->add(new DateInterval('P1D'))) { - - $date = $today->format('Y-m-d'); - $today_in = isset($in[$date]) ? (int) $in[$date] : 0; - $today_out = isset($out[$date]) ? (int) $out[$date] : 0; - - if ($today_in > 0 || $today_out > 0) { - - $left += $today_in; - $left -= $today_out; - - $serie[] = array( - 'date' => $date, - 'in' => $today_in, - 'out' => -$today_out, - 'left' => $left, - ); - } - } - - return $serie; - } - - /** - * Filter callback to apply the rate according to the effective date - * - * @access public - * @param array $records - * @return array - */ - public function applyUserRate(array $records) - { - $rates = $this->hourlyRate->getAllByProject($records[0]['project_id']); - - foreach ($records as &$record) { - - $hourly_price = 0; - - foreach ($rates as $rate) { - - if ($rate['user_id'] == $record['user_id'] && date('Y-m-d', $rate['date_effective']) <= date('Y-m-d', $record['start'])) { - $hourly_price = $this->currency->getPrice($rate['currency'], $rate['rate']); - break; - } - } - - $record['cost'] = $hourly_price * $record['time_spent']; - } - - return $records; - } - - /** - * Add a new budget line in the database - * - * @access public - * @param integer $project_id - * @param float $amount - * @param string $comment - * @param string $date - * @return boolean|integer - */ - public function create($project_id, $amount, $comment, $date = '') - { - $values = array( - 'project_id' => $project_id, - 'amount' => $amount, - 'comment' => $comment, - 'date' => $date ?: date('Y-m-d'), - ); - - return $this->persist(self::TABLE, $values); - } - - /** - * Remove a specific budget line - * - * @access public - * @param integer $budget_id - * @return boolean - */ - public function remove($budget_id) - { - return $this->db->table(self::TABLE)->eq('id', $budget_id)->remove(); - } - - /** - * Validate creation - * - * @access public - * @param array $values Form values - * @return array $valid, $errors [0] = Success or not, [1] = List of errors - */ - public function validateCreation(array $values) - { - $v = new Validator($values, array( - new Validators\Required('project_id', t('Field required')), - new Validators\Required('amount', t('Field required')), - )); - - return array( - $v->execute(), - $v->getErrors() - ); - } -} \ No newline at end of file diff --git a/sources/app/Model/Config.php b/sources/app/Model/Config.php index 6fa98f9..bbc86a8 100644 --- a/sources/app/Model/Config.php +++ b/sources/app/Model/Config.php @@ -75,6 +75,7 @@ class Config extends Base { // Sorted by value $languages = array( + 'id_ID' => 'Bahasa Indonesia', 'cs_CZ' => 'Čeština', 'da_DK' => 'Dansk', 'de_DE' => 'Deutsch', @@ -135,6 +136,7 @@ class Config extends Base 'zh_CN' => 'zh-cn', 'ja_JP' => 'ja', 'th_TH' => 'th', + 'id_ID' => 'id' ); $lang = $this->getCurrentLanguage(); @@ -206,6 +208,11 @@ class Config extends Base { foreach ($values as $option => $value) { + // Be sure that a trailing slash is there for the url + if ($option === 'application_url' && ! empty($value) && substr($value, -1) !== '/') { + $value .= '/'; + } + $result = $this->db->table(self::TABLE)->eq('option', $option)->update(array('value' => $value)); if (! $result) { diff --git a/sources/app/Model/CustomFilter.php b/sources/app/Model/CustomFilter.php new file mode 100644 index 0000000..2c48524 --- /dev/null +++ b/sources/app/Model/CustomFilter.php @@ -0,0 +1,163 @@ +db + ->table(self::TABLE) + ->columns( + User::TABLE.'.name as owner_name', + User::TABLE.'.username as owner_username', + self::TABLE.'.id', + self::TABLE.'.user_id', + self::TABLE.'.project_id', + self::TABLE.'.filter', + self::TABLE.'.name', + self::TABLE.'.is_shared' + ) + ->asc(self::TABLE.'.name') + ->join(User::TABLE, 'id', 'user_id') + ->beginOr() + ->eq('is_shared', 1) + ->eq('user_id', $user_id) + ->closeOr() + ->eq('project_id', $project_id) + ->findAll(); + } + + /** + * Get custom filter by id + * + * @access private + * @param integer $filter_id + * @return array + */ + public function getById($filter_id) + { + return $this->db->table(self::TABLE)->eq('id', $filter_id)->findOne(); + } + + /** + * Create a custom filter + * + * @access public + * @param array $values Form values + * @return bool|integer + */ + public function create(array $values) + { + return $this->persist(self::TABLE, $values); + } + + /** + * Update a custom filter + * + * @access public + * @param array $values Form values + * @return bool + */ + public function update(array $values) + { + return $this->db->table(self::TABLE) + ->eq('id', $values['id']) + ->update($values); + } + + /** + * Remove a custom filter + * + * @access public + * @param integer $filter_id + * @return bool + */ + public function remove($filter_id) + { + return $this->db->table(self::TABLE)->eq('id', $filter_id)->remove(); + } + + /** + * Common validation rules + * + * @access private + * @return array + */ + private function commonValidationRules() + { + return array( + new Validators\Required('project_id', t('Field required')), + new Validators\Required('user_id', t('Field required')), + new Validators\Required('name', t('Field required')), + new Validators\Required('filter', t('Field required')), + new Validators\Integer('user_id', t('This value must be an integer')), + new Validators\Integer('project_id', t('This value must be an integer')), + new Validators\MaxLength('name', t('The maximum length is %d characters', 100), 100), + new Validators\MaxLength('filter', t('The maximum length is %d characters', 100), 100) + ); + } + + /** + * Validate filter creation + * + * @access public + * @param array $values Form values + * @return array $valid, $errors [0] = Success or not, [1] = List of errors + */ + public function validateCreation(array $values) + { + $v = new Validator($values, $this->commonValidationRules()); + + return array( + $v->execute(), + $v->getErrors() + ); + } + + /** + * Validate filter modification + * + * @access public + * @param array $values Form values + * @return array $valid, $errors [0] = Success or not, [1] = List of errors + */ + public function validateModification(array $values) + { + $rules = array( + new Validators\Required('id', t('Field required')), + new Validators\Integer('id', t('This value must be an integer')), + ); + + $v = new Validator($values, array_merge($rules, $this->commonValidationRules())); + + return array( + $v->execute(), + $v->getErrors() + ); + } +} diff --git a/sources/app/Model/EmailNotification.php b/sources/app/Model/EmailNotification.php new file mode 100644 index 0000000..39b60fc --- /dev/null +++ b/sources/app/Model/EmailNotification.php @@ -0,0 +1,123 @@ +emailClient->send( + $user['email'], + $user['name'] ?: $user['username'], + $this->getMailSubject($event_name, $event_data), + $this->getMailContent($event_name, $event_data) + ); + } + } + + /** + * Get the mail content for a given template name + * + * @access public + * @param string $event_name Event name + * @param array $event_data Event data + * @return string + */ + public function getMailContent($event_name, array $event_data) + { + return $this->template->render( + 'notification/'.str_replace('.', '_', $event_name), + $event_data + array('application_url' => $this->config->get('application_url')) + ); + } + + /** + * Get the mail subject for a given template name + * + * @access public + * @param string $event_name Event name + * @param array $event_data Event data + * @return string + */ + public function getMailSubject($event_name, array $event_data) + { + switch ($event_name) { + case File::EVENT_CREATE: + $subject = $this->getStandardMailSubject(e('New attachment'), $event_data); + break; + case Comment::EVENT_CREATE: + $subject = $this->getStandardMailSubject(e('New comment'), $event_data); + break; + case Comment::EVENT_UPDATE: + $subject = $this->getStandardMailSubject(e('Comment updated'), $event_data); + break; + case Subtask::EVENT_CREATE: + $subject = $this->getStandardMailSubject(e('New subtask'), $event_data); + break; + case Subtask::EVENT_UPDATE: + $subject = $this->getStandardMailSubject(e('Subtask updated'), $event_data); + break; + case Task::EVENT_CREATE: + $subject = $this->getStandardMailSubject(e('New task'), $event_data); + break; + case Task::EVENT_UPDATE: + $subject = $this->getStandardMailSubject(e('Task updated'), $event_data); + break; + case Task::EVENT_CLOSE: + $subject = $this->getStandardMailSubject(e('Task closed'), $event_data); + break; + case Task::EVENT_OPEN: + $subject = $this->getStandardMailSubject(e('Task opened'), $event_data); + break; + case Task::EVENT_MOVE_COLUMN: + $subject = $this->getStandardMailSubject(e('Column change'), $event_data); + break; + case Task::EVENT_MOVE_POSITION: + $subject = $this->getStandardMailSubject(e('Position change'), $event_data); + break; + case Task::EVENT_MOVE_SWIMLANE: + $subject = $this->getStandardMailSubject(e('Swimlane change'), $event_data); + break; + case Task::EVENT_ASSIGNEE_CHANGE: + $subject = $this->getStandardMailSubject(e('Assignee change'), $event_data); + break; + case Task::EVENT_OVERDUE: + $subject = e('[%s] Overdue tasks', $event_data['project_name']); + break; + default: + $subject = e('Notification'); + } + + return $subject; + } + + /** + * Get the mail subject for a given label + * + * @access private + * @param string $label Label + * @param array $data Template data + * @return string + */ + private function getStandardMailSubject($label, array $data) + { + return sprintf('[%s][%s] %s (#%d)', $data['task']['project_name'], $label, $data['task']['title'], $data['task']['id']); + } +} diff --git a/sources/app/Model/File.php b/sources/app/Model/File.php index f884e46..1d44a41 100644 --- a/sources/app/Model/File.php +++ b/sources/app/Model/File.php @@ -3,6 +3,8 @@ namespace Model; use Event\FileEvent; +use Core\Tool; +use Core\ObjectStorage\ObjectStorageException; /** * File model @@ -47,14 +49,21 @@ class File extends Base */ public function remove($file_id) { - $file = $this->getbyId($file_id); + try { - if (! empty($file)) { - @unlink(FILES_DIR.$file['path']); - return $this->db->table(self::TABLE)->eq('id', $file_id)->remove(); + $file = $this->getbyId($file_id); + $this->objectStorage->remove($file['path']); + + if ($file['is_image'] == 1) { + $this->objectStorage->remove($this->getThumbnailPath($file['path'])); + } + + return $this->db->table(self::TABLE)->eq('id', $file['id'])->remove(); + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); + return false; } - - return false; } /** @@ -66,11 +75,11 @@ class File extends Base */ public function removeAll($task_id) { - $files = $this->getAll($task_id); + $file_ids = $this->db->table(self::TABLE)->eq('task_id', $task_id)->asc('id')->findAllByColumn('id'); $results = array(); - foreach ($files as $file) { - $results[] = $this->remove($file['id']); + foreach ($file_ids as $file_id) { + $results[] = $this->remove($file_id); } return ! in_array(false, $results, true); @@ -195,6 +204,30 @@ class File extends Base return false; } + /** + * Return the image mimetype based on the file extension + * + * @access public + * @param $filename + * @return string + */ + public function getImageMimeType($filename) + { + $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); + + switch ($extension) { + case 'jpeg': + case 'jpg': + return 'image/jpeg'; + case 'png': + return 'image/png'; + case 'gif': + return 'image/gif'; + default: + return 'image/jpeg'; + } + } + /** * Generate the path for a new filename * @@ -209,6 +242,18 @@ class File extends Base return $project_id.DIRECTORY_SEPARATOR.$task_id.DIRECTORY_SEPARATOR.hash('sha1', $filename.time()); } + /** + * Generate the path for a thumbnails + * + * @access public + * @param string $key Storage key + * @return string + */ + public function getThumbnailPath($key) + { + return 'thumbnails'.DIRECTORY_SEPARATOR.$key; + } + /** * Handle file upload * @@ -218,11 +263,13 @@ class File extends Base * @param string $form_name File form name * @return bool */ - public function upload($project_id, $task_id, $form_name) + public function uploadFiles($project_id, $task_id, $form_name) { - $results = array(); + try { - if (! empty($_FILES[$form_name])) { + if (empty($_FILES[$form_name])) { + return false; + } foreach ($_FILES[$form_name]['error'] as $key => $error) { @@ -232,22 +279,27 @@ class File extends Base $uploaded_filename = $_FILES[$form_name]['tmp_name'][$key]; $destination_filename = $this->generatePath($project_id, $task_id, $original_filename); - @mkdir(FILES_DIR.dirname($destination_filename), 0755, true); - - if (@move_uploaded_file($uploaded_filename, FILES_DIR.$destination_filename)) { - - $results[] = $this->create( - $task_id, - $original_filename, - $destination_filename, - $_FILES[$form_name]['size'][$key] - ); + if ($this->isImage($original_filename)) { + $this->generateThumbnailFromFile($uploaded_filename, $destination_filename); } + + $this->objectStorage->moveUploadedFile($uploaded_filename, $destination_filename); + + $this->create( + $task_id, + $original_filename, + $destination_filename, + $_FILES[$form_name]['size'][$key] + ); } } - } - return ! in_array(false, $results, true); + return true; + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); + return false; + } } /** @@ -261,129 +313,77 @@ class File extends Base */ public function uploadScreenshot($project_id, $task_id, $blob) { - $data = base64_decode($blob); - - if (empty($data)) { - return false; - } - $original_filename = e('Screenshot taken %s', dt('%B %e, %Y at %k:%M %p', time())).'.png'; - $destination_filename = $this->generatePath($project_id, $task_id, $original_filename); - - @mkdir(FILES_DIR.dirname($destination_filename), 0755, true); - @file_put_contents(FILES_DIR.$destination_filename, $data); - - return $this->create( - $task_id, - $original_filename, - $destination_filename, - strlen($data) - ); + return $this->uploadContent($project_id, $task_id, $original_filename, $blob); } /** * Handle file upload (base64 encoded content) * * @access public - * @param integer $project_id Project id - * @param integer $task_id Task id - * @param string $filename Filename - * @param string $blob Base64 encoded image + * @param integer $project_id Project id + * @param integer $task_id Task id + * @param string $original_filename Filename + * @param string $blob Base64 encoded file * @return bool|integer */ - public function uploadContent($project_id, $task_id, $filename, $blob) + public function uploadContent($project_id, $task_id, $original_filename, $blob) { - $data = base64_decode($blob); + try { - if (empty($data)) { + $data = base64_decode($blob); + + if (empty($data)) { + return false; + } + + $destination_filename = $this->generatePath($project_id, $task_id, $original_filename); + $this->objectStorage->put($destination_filename, $data); + + if ($this->isImage($original_filename)) { + $this->generateThumbnailFromData($destination_filename, $data); + } + + return $this->create( + $task_id, + $original_filename, + $destination_filename, + strlen($data) + ); + } + catch (ObjectStorageException $e) { + $this->logger->error($e->getMessage()); return false; } - - $destination_filename = $this->generatePath($project_id, $task_id, $filename); - - @mkdir(FILES_DIR.dirname($destination_filename), 0755, true); - @file_put_contents(FILES_DIR.$destination_filename, $data); - - return $this->create( - $task_id, - $filename, - $destination_filename, - strlen($data) - ); } /** - * Generate a jpeg thumbnail from an image (output directly the image) + * Generate thumbnail from a blob * * @access public - * @param string $filename Source image - * @param integer $resize_width Desired image width - * @param integer $resize_height Desired image height + * @param string $destination_filename + * @param string $data */ - public function generateThumbnail($filename, $resize_width, $resize_height) + public function generateThumbnailFromData($destination_filename, &$data) { - $metadata = getimagesize($filename); - $src_width = $metadata[0]; - $src_height = $metadata[1]; - $dst_y = 0; - $dst_x = 0; + $temp_filename = tempnam(sys_get_temp_dir(), 'datafile'); - if (empty($metadata['mime'])) { - return; - } + file_put_contents($temp_filename, $data); + $this->generateThumbnailFromFile($temp_filename, $destination_filename); + unlink($temp_filename); + } - if ($resize_width == 0 && $resize_height == 0) { - $resize_width = 100; - $resize_height = 100; - } - - if ($resize_width > 0 && $resize_height == 0) { - $dst_width = $resize_width; - $dst_height = floor($src_height * ($resize_width / $src_width)); - $dst_image = imagecreatetruecolor($dst_width, $dst_height); - } - elseif ($resize_width == 0 && $resize_height > 0) { - $dst_width = floor($src_width * ($resize_height / $src_height)); - $dst_height = $resize_height; - $dst_image = imagecreatetruecolor($dst_width, $dst_height); - } - else { - - $src_ratio = $src_width / $src_height; - $resize_ratio = $resize_width / $resize_height; - - if ($src_ratio <= $resize_ratio) { - $dst_width = $resize_width; - $dst_height = floor($src_height * ($resize_width / $src_width)); - - $dst_y = ($dst_height - $resize_height) / 2 * (-1); - } - else { - $dst_width = floor($src_width * ($resize_height / $src_height)); - $dst_height = $resize_height; - - $dst_x = ($dst_width - $resize_width) / 2 * (-1); - } - - $dst_image = imagecreatetruecolor($resize_width, $resize_height); - } - - switch ($metadata['mime']) { - case 'image/jpeg': - case 'image/jpg': - $src_image = imagecreatefromjpeg($filename); - break; - case 'image/png': - $src_image = imagecreatefrompng($filename); - break; - case 'image/gif': - $src_image = imagecreatefromgif($filename); - break; - default: - return; - } - - imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $dst_width, $dst_height, $src_width, $src_height); - imagejpeg($dst_image); + /** + * Generate thumbnail from a blob + * + * @access public + * @param string $uploaded_filename + * @param string $destination_filename + */ + public function generateThumbnailFromFile($uploaded_filename, $destination_filename) + { + $thumbnail_filename = tempnam(sys_get_temp_dir(), 'thumbnail'); + Tool::generateThumbnail($uploaded_filename, $thumbnail_filename); + $this->objectStorage->moveFile($thumbnail_filename, $this->getThumbnailPath($destination_filename)); } } diff --git a/sources/app/Model/HourlyRate.php b/sources/app/Model/HourlyRate.php deleted file mode 100644 index 1550bda..0000000 --- a/sources/app/Model/HourlyRate.php +++ /dev/null @@ -1,121 +0,0 @@ -projectPermission->getMembers($project_id); - - if (empty($members)) { - return array(); - } - - return $this->db->table(self::TABLE)->in('user_id', array_keys($members))->desc('date_effective')->findAll(); - } - - /** - * Get all rates for a given user - * - * @access public - * @param integer $user_id User id - * @return array - */ - public function getAllByUser($user_id) - { - return $this->db->table(self::TABLE)->eq('user_id', $user_id)->desc('date_effective')->findAll(); - } - - /** - * Get current rate for a given user - * - * @access public - * @param integer $user_id User id - * @return float - */ - public function getCurrentRate($user_id) - { - return $this->db->table(self::TABLE)->eq('user_id', $user_id)->desc('date_effective')->findOneColumn('rate') ?: 0; - } - - /** - * Add a new rate in the database - * - * @access public - * @param integer $user_id User id - * @param float $rate Hourly rate - * @param string $currency Currency code - * @param string $date ISO8601 date format - * @return boolean|integer - */ - public function create($user_id, $rate, $currency, $date) - { - $values = array( - 'user_id' => $user_id, - 'rate' => $rate, - 'currency' => $currency, - 'date_effective' => $this->dateParser->removeTimeFromTimestamp($this->dateParser->getTimestamp($date)), - ); - - return $this->persist(self::TABLE, $values); - } - - /** - * Remove a specific rate - * - * @access public - * @param integer $rate_id - * @return boolean - */ - public function remove($rate_id) - { - return $this->db->table(self::TABLE)->eq('id', $rate_id)->remove(); - } - - /** - * Validate creation - * - * @access public - * @param array $values Form values - * @return array $valid, $errors [0] = Success or not, [1] = List of errors - */ - public function validateCreation(array $values) - { - $v = new Validator($values, array( - new Validators\Required('user_id', t('Field required')), - new Validators\Required('rate', t('Field required')), - new Validators\Numeric('rate', t('This value must be numeric')), - new Validators\Required('date_effective', t('Field required')), - new Validators\Required('currency', t('Field required')), - )); - - return array( - $v->execute(), - $v->getErrors() - ); - } -} diff --git a/sources/app/Model/Notification.php b/sources/app/Model/Notification.php index 9628e34..525e7f1 100644 --- a/sources/app/Model/Notification.php +++ b/sources/app/Model/Notification.php @@ -12,71 +12,6 @@ use Core\Translator; */ class Notification extends Base { - /** - * SQL table name - * - * @var string - */ - const TABLE = 'user_has_notifications'; - - /** - * User filters - * - * @var integer - */ - const FILTER_NONE = 1; - const FILTER_ASSIGNEE = 2; - const FILTER_CREATOR = 3; - const FILTER_BOTH = 4; - - /** - * Send overdue tasks - * - * @access public - */ - public function sendOverdueTaskNotifications() - { - $tasks = $this->taskFinder->getOverdueTasks(); - - foreach ($this->groupByColumn($tasks, 'project_id') as $project_id => $project_tasks) { - - // Get the list of users that should receive notifications for each projects - $users = $this->notification->getUsersWithNotificationEnabled($project_id); - - foreach ($users as $user) { - $this->sendUserOverdueTaskNotifications($user, $project_tasks); - } - } - - return $tasks; - } - - /** - * Send overdue tasks for a given user - * - * @access public - * @param array $user - * @param array $tasks - */ - public function sendUserOverdueTaskNotifications(array $user, array $tasks) - { - $user_tasks = array(); - - foreach ($tasks as $task) { - if ($this->notification->shouldReceiveNotification($user, array('task' => $task))) { - $user_tasks[] = $task; - } - } - - if (! empty($user_tasks)) { - $this->sendEmailNotification( - $user, - Task::EVENT_OVERDUE, - array('tasks' => $user_tasks, 'project_name' => $tasks[0]['project_name']) - ); - } - } - /** * Send notifications to people * @@ -89,26 +24,31 @@ class Notification extends Base $logged_user_id = $this->userSession->isLogged() ? $this->userSession->getId() : 0; $users = $this->notification->getUsersWithNotificationEnabled($event_data['task']['project_id'], $logged_user_id); - foreach ($users as $user) { - if ($this->shouldReceiveNotification($user, $event_data)) { - $this->sendEmailNotification($user, $event_name, $event_data); - } - } + if (! empty($users)) { - // Restore locales - $this->config->setupTranslations(); + foreach ($users as $user) { + if ($this->notificationFilter->shouldReceiveNotification($user, $event_data)) { + $this->sendUserNotification($user, $event_name, $event_data); + } + } + + // Restore locales + $this->config->setupTranslations(); + } } /** - * Send email notification to someone + * Send notification to someone * * @access public * @param array $user User * @param string $event_name * @param array $event_data */ - public function sendEmailNotification(array $user, $event_name, array $event_data) + public function sendUserNotification(array $user, $event_name, array $event_data) { + Translator::unload(); + // Use the user language otherwise use the application language (do not use the session language) if (! empty($user['language'])) { Translator::load($user['language']); @@ -117,109 +57,10 @@ class Notification extends Base Translator::load($this->config->get('application_language', 'en_US')); } - $this->emailClient->send( - $user['email'], - $user['name'] ?: $user['username'], - $this->getMailSubject($event_name, $event_data), - $this->getMailContent($event_name, $event_data) - ); - } - - /** - * Return true if the user should receive notification - * - * @access public - * @param array $user - * @param array $event_data - * @return boolean - */ - public function shouldReceiveNotification(array $user, array $event_data) - { - $filters = array( - 'filterNone', - 'filterAssignee', - 'filterCreator', - 'filterBoth', - ); - - foreach ($filters as $filter) { - if ($this->$filter($user, $event_data)) { - return $this->filterProject($user, $event_data); - } + foreach ($this->notificationType->getUserSelectedTypes($user['id']) as $type) { + $className = strtolower($type).'Notification'; + $this->$className->send($user, $event_name, $event_data); } - - return false; - } - - /** - * Return true if the user will receive all notifications - * - * @access public - * @param array $user - * @return boolean - */ - public function filterNone(array $user) - { - return $user['notifications_filter'] == self::FILTER_NONE; - } - - /** - * Return true if the user is the assignee and selected the filter "assignee" - * - * @access public - * @param array $user - * @param array $event_data - * @return boolean - */ - public function filterAssignee(array $user, array $event_data) - { - return $user['notifications_filter'] == self::FILTER_ASSIGNEE && $event_data['task']['owner_id'] == $user['id']; - } - - /** - * Return true if the user is the creator and enabled the filter "creator" - * - * @access public - * @param array $user - * @param array $event_data - * @return boolean - */ - public function filterCreator(array $user, array $event_data) - { - return $user['notifications_filter'] == self::FILTER_CREATOR && $event_data['task']['creator_id'] == $user['id']; - } - - /** - * Return true if the user is the assignee or the creator and selected the filter "both" - * - * @access public - * @param array $user - * @param array $event_data - * @return boolean - */ - public function filterBoth(array $user, array $event_data) - { - return $user['notifications_filter'] == self::FILTER_BOTH && - ($event_data['task']['creator_id'] == $user['id'] || $event_data['task']['owner_id'] == $user['id']); - } - - /** - * Return true if the user want to receive notification for the selected project - * - * @access public - * @param array $user - * @param array $event_data - * @return boolean - */ - public function filterProject(array $user, array $event_data) - { - $projects = $this->db->table(self::TABLE)->eq('user_id', $user['id'])->findAllByColumn('project_id'); - - if (! empty($projects)) { - return in_array($event_data['task']['project_id'], $projects); - } - - return true; } /** @@ -233,114 +74,34 @@ class Notification extends Base public function getUsersWithNotificationEnabled($project_id, $exclude_user_id = 0) { if ($this->projectPermission->isEverybodyAllowed($project_id)) { - - return $this->db - ->table(User::TABLE) - ->columns(User::TABLE.'.id', User::TABLE.'.username', User::TABLE.'.name', User::TABLE.'.email', User::TABLE.'.language', User::TABLE.'.notifications_filter') - ->eq('notifications_enabled', '1') - ->neq('email', '') - ->neq(User::TABLE.'.id', $exclude_user_id) - ->findAll(); + return $this->getEverybodyWithNotificationEnabled($exclude_user_id); } - return $this->db - ->table(ProjectPermission::TABLE) - ->columns(User::TABLE.'.id', User::TABLE.'.username', User::TABLE.'.name', User::TABLE.'.email', User::TABLE.'.language', User::TABLE.'.notifications_filter') - ->join(User::TABLE, 'id', 'user_id') - ->eq('project_id', $project_id) - ->eq('notifications_enabled', '1') - ->neq('email', '') - ->neq(User::TABLE.'.id', $exclude_user_id) - ->findAll(); + return $this->getProjectMembersWithNotificationEnabled($project_id, $exclude_user_id); } /** - * Get the mail content for a given template name + * Enable notification for someone * * @access public - * @param string $event_name Event name - * @param array $event_data Event data - * @return string + * @param integer $user_id + * @return boolean */ - public function getMailContent($event_name, array $event_data) + public function enableNotification($user_id) { - return $this->template->render( - 'notification/'.str_replace('.', '_', $event_name), - $event_data + array('application_url' => $this->config->get('application_url')) - ); + return $this->db->table(User::TABLE)->eq('id', $user_id)->update(array('notifications_enabled' => 1)); } /** - * Get the mail subject for a given template name + * Disable notification for someone * * @access public - * @param string $event_name Event name - * @param array $event_data Event data - * @return string + * @param integer $user_id + * @return boolean */ - public function getMailSubject($event_name, array $event_data) + public function disableNotification($user_id) { - switch ($event_name) { - case File::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New attachment'), $event_data); - break; - case Comment::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New comment'), $event_data); - break; - case Comment::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Comment updated'), $event_data); - break; - case Subtask::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New subtask'), $event_data); - break; - case Subtask::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Subtask updated'), $event_data); - break; - case Task::EVENT_CREATE: - $subject = $this->getStandardMailSubject(e('New task'), $event_data); - break; - case Task::EVENT_UPDATE: - $subject = $this->getStandardMailSubject(e('Task updated'), $event_data); - break; - case Task::EVENT_CLOSE: - $subject = $this->getStandardMailSubject(e('Task closed'), $event_data); - break; - case Task::EVENT_OPEN: - $subject = $this->getStandardMailSubject(e('Task opened'), $event_data); - break; - case Task::EVENT_MOVE_COLUMN: - $subject = $this->getStandardMailSubject(e('Column change'), $event_data); - break; - case Task::EVENT_MOVE_POSITION: - $subject = $this->getStandardMailSubject(e('Position change'), $event_data); - break; - case Task::EVENT_MOVE_SWIMLANE: - $subject = $this->getStandardMailSubject(e('Swimlane change'), $event_data); - break; - case Task::EVENT_ASSIGNEE_CHANGE: - $subject = $this->getStandardMailSubject(e('Assignee change'), $event_data); - break; - case Task::EVENT_OVERDUE: - $subject = e('[%s] Overdue tasks', $event_data['project_name']); - break; - default: - $subject = e('Notification'); - } - - return $subject; - } - - /** - * Get the mail subject for a given label - * - * @access private - * @param string $label Label - * @param array $data Template data - * @return string - */ - private function getStandardMailSubject($label, array $data) - { - return sprintf('[%s][%s] %s (#%d)', $data['task']['project_name'], $label, $data['task']['title'], $data['task']['id']); + return $this->db->table(User::TABLE)->eq('id', $user_id)->update(array('notifications_enabled' => 0)); } /** @@ -352,35 +113,24 @@ class Notification extends Base */ public function saveSettings($user_id, array $values) { - // Delete all selected projects - $this->db->table(self::TABLE)->eq('user_id', $user_id)->remove(); + $this->db->startTransaction(); if (isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1) { + $this->enableNotification($user_id); - // Activate notifications - $this->db->table(User::TABLE)->eq('id', $user_id)->update(array( - 'notifications_enabled' => '1', - 'notifications_filter' => empty($values['notifications_filter']) ? self::FILTER_BOTH : $values['notifications_filter'], - )); + $filter = empty($values['notifications_filter']) ? NotificationFilter::FILTER_BOTH : $values['notifications_filter']; + $projects = empty($values['notification_projects']) ? array() : array_keys($values['notification_projects']); + $types = empty($values['notification_types']) ? array() : array_keys($values['notification_types']); - // Save selected projects - if (! empty($values['projects'])) { - - foreach ($values['projects'] as $project_id => $checkbox_value) { - $this->db->table(self::TABLE)->insert(array( - 'user_id' => $user_id, - 'project_id' => $project_id, - )); - } - } + $this->notificationFilter->saveUserFilter($user_id, $filter); + $this->notificationFilter->saveUserSelectedProjects($user_id, $projects); + $this->notificationType->saveUserSelectedTypes($user_id, $types); } else { - - // Disable notifications - $this->db->table(User::TABLE)->eq('id', $user_id)->update(array( - 'notifications_enabled' => '0' - )); + $this->disableNotification($user_id); } + + $this->db->closeTransaction(); } /** @@ -393,12 +143,45 @@ class Notification extends Base public function readSettings($user_id) { $values = $this->db->table(User::TABLE)->eq('id', $user_id)->columns('notifications_enabled', 'notifications_filter')->findOne(); - $projects = $this->db->table(self::TABLE)->eq('user_id', $user_id)->findAllByColumn('project_id'); - - foreach ($projects as $project_id) { - $values['project_'.$project_id] = true; - } - + $values['notification_types'] = $this->notificationType->getUserSelectedTypes($user_id); + $values['notification_projects'] = $this->notificationFilter->getUserSelectedProjects($user_id); return $values; } + + /** + * Get a list of project members with notification enabled + * + * @access private + * @param integer $project_id Project id + * @param integer $exclude_user_id User id to exclude + * @return array + */ + private function getProjectMembersWithNotificationEnabled($project_id, $exclude_user_id) + { + return $this->db + ->table(ProjectPermission::TABLE) + ->columns(User::TABLE.'.id', User::TABLE.'.username', User::TABLE.'.name', User::TABLE.'.email', User::TABLE.'.language', User::TABLE.'.notifications_filter') + ->join(User::TABLE, 'id', 'user_id') + ->eq('project_id', $project_id) + ->eq('notifications_enabled', '1') + ->neq(User::TABLE.'.id', $exclude_user_id) + ->findAll(); + } + + /** + * Get a list of project members with notification enabled + * + * @access private + * @param integer $exclude_user_id User id to exclude + * @return array + */ + private function getEverybodyWithNotificationEnabled($exclude_user_id) + { + return $this->db + ->table(User::TABLE) + ->columns(User::TABLE.'.id', User::TABLE.'.username', User::TABLE.'.name', User::TABLE.'.email', User::TABLE.'.language', User::TABLE.'.notifications_filter') + ->eq('notifications_enabled', '1') + ->neq(User::TABLE.'.id', $exclude_user_id) + ->findAll(); + } } diff --git a/sources/app/Model/NotificationFilter.php b/sources/app/Model/NotificationFilter.php new file mode 100644 index 0000000..6279551 --- /dev/null +++ b/sources/app/Model/NotificationFilter.php @@ -0,0 +1,199 @@ + t('All tasks'), + self::FILTER_ASSIGNEE => t('Only for tasks assigned to me'), + self::FILTER_CREATOR => t('Only for tasks created by me'), + self::FILTER_BOTH => t('Only for tasks created by me and assigned to me'), + ); + } + + /** + * Get user selected filter + * + * @access public + * @param integer $user_id + * @return integer + */ + public function getUserSelectedFilter($user_id) + { + return $this->db->table(User::TABLE)->eq('id', $user_id)->findOneColumn('notifications_filter'); + } + + /** + * Save selected filter for a user + * + * @access public + * @param integer $user_id + * @param string $filter + */ + public function saveUserFilter($user_id, $filter) + { + $this->db->table(User::TABLE)->eq('id', $user_id)->update(array( + 'notifications_filter' => $filter, + )); + } + + /** + * Get user selected projects + * + * @access public + * @param integer $user_id + * @return array + */ + public function getUserSelectedProjects($user_id) + { + return $this->db->table(self::PROJECT_TABLE)->eq('user_id', $user_id)->findAllByColumn('project_id'); + } + + /** + * Save selected projects for a user + * + * @access public + * @param integer $user_id + * @param integer[] $project_ids + */ + public function saveUserSelectedProjects($user_id, array $project_ids) + { + $this->db->table(self::PROJECT_TABLE)->eq('user_id', $user_id)->remove(); + + foreach ($project_ids as $project_id) { + $this->db->table(self::PROJECT_TABLE)->insert(array( + 'user_id' => $user_id, + 'project_id' => $project_id, + )); + } + } + + /** + * Return true if the user should receive notification + * + * @access public + * @param array $user + * @param array $event_data + * @return boolean + */ + public function shouldReceiveNotification(array $user, array $event_data) + { + $filters = array( + 'filterNone', + 'filterAssignee', + 'filterCreator', + 'filterBoth', + ); + + foreach ($filters as $filter) { + if ($this->$filter($user, $event_data)) { + return $this->filterProject($user, $event_data); + } + } + + return false; + } + + /** + * Return true if the user will receive all notifications + * + * @access public + * @param array $user + * @return boolean + */ + public function filterNone(array $user) + { + return $user['notifications_filter'] == self::FILTER_NONE; + } + + /** + * Return true if the user is the assignee and selected the filter "assignee" + * + * @access public + * @param array $user + * @param array $event_data + * @return boolean + */ + public function filterAssignee(array $user, array $event_data) + { + return $user['notifications_filter'] == self::FILTER_ASSIGNEE && $event_data['task']['owner_id'] == $user['id']; + } + + /** + * Return true if the user is the creator and enabled the filter "creator" + * + * @access public + * @param array $user + * @param array $event_data + * @return boolean + */ + public function filterCreator(array $user, array $event_data) + { + return $user['notifications_filter'] == self::FILTER_CREATOR && $event_data['task']['creator_id'] == $user['id']; + } + + /** + * Return true if the user is the assignee or the creator and selected the filter "both" + * + * @access public + * @param array $user + * @param array $event_data + * @return boolean + */ + public function filterBoth(array $user, array $event_data) + { + return $user['notifications_filter'] == self::FILTER_BOTH && + ($event_data['task']['creator_id'] == $user['id'] || $event_data['task']['owner_id'] == $user['id']); + } + + /** + * Return true if the user want to receive notification for the selected project + * + * @access public + * @param array $user + * @param array $event_data + * @return boolean + */ + public function filterProject(array $user, array $event_data) + { + $projects = $this->getUserSelectedProjects($user['id']); + + if (! empty($projects)) { + return in_array($event_data['task']['project_id'], $projects); + } + + return true; + } +} diff --git a/sources/app/Model/NotificationType.php b/sources/app/Model/NotificationType.php new file mode 100644 index 0000000..3fd5c15 --- /dev/null +++ b/sources/app/Model/NotificationType.php @@ -0,0 +1,73 @@ + t('Email'), + self::TYPE_WEB => t('Web'), + ); + } + + /** + * Get selected notification types for a given user + * + * @access public + * @param integer $user_id + * @return array + */ + public function getUserSelectedTypes($user_id) + { + return $this->db->table(self::TABLE)->eq('user_id', $user_id)->asc('notification_type')->findAllByColumn('notification_type'); + } + + /** + * Save notification types for a given user + * + * @access public + * @param integer $user_id + * @param string[] $types + * @return boolean + */ + public function saveUserSelectedTypes($user_id, array $types) + { + $results = array(); + $this->db->table(self::TABLE)->eq('user_id', $user_id)->remove(); + + foreach ($types as $type) { + $results[] = $this->db->table(self::TABLE)->insert(array('user_id' => $user_id, 'notification_type' => $type)); + } + + return ! in_array(false, $results); + } +} diff --git a/sources/app/Model/OverdueNotification.php b/sources/app/Model/OverdueNotification.php new file mode 100644 index 0000000..19bd098 --- /dev/null +++ b/sources/app/Model/OverdueNotification.php @@ -0,0 +1,60 @@ +taskFinder->getOverdueTasks(); + + foreach ($this->groupByColumn($tasks, 'project_id') as $project_id => $project_tasks) { + + // Get the list of users that should receive notifications for each projects + $users = $this->notification->getUsersWithNotificationEnabled($project_id); + + foreach ($users as $user) { + $this->sendUserOverdueTaskNotifications($user, $project_tasks); + } + } + + return $tasks; + } + + /** + * Send overdue tasks for a given user + * + * @access public + * @param array $user + * @param array $tasks + */ + public function sendUserOverdueTaskNotifications(array $user, array $tasks) + { + $user_tasks = array(); + + foreach ($tasks as $task) { + if ($this->notificationFilter->shouldReceiveNotification($user, array('task' => $task))) { + $user_tasks[] = $task; + } + } + + if (! empty($user_tasks)) { + $this->notification->sendUserNotification( + $user, + Task::EVENT_OVERDUE, + array('tasks' => $user_tasks, 'project_name' => $tasks[0]['project_name']) + ); + } + } +} diff --git a/sources/app/Model/Project.php b/sources/app/Model/Project.php index 5250082..1bd5b62 100644 --- a/sources/app/Model/Project.php +++ b/sources/app/Model/Project.php @@ -114,54 +114,6 @@ class Project extends Base return $this->db->table(self::TABLE)->eq('id', $project_id)->eq('is_private', 1)->exists(); } - /** - * Get all projects to generate the Gantt chart - * - * @access public - * @param array $project_ids - * @return array - */ - public function getGanttBars(array $project_ids) - { - if (empty($project_ids)) { - return array(); - } - - $colors = $this->color->getDefaultColors(); - $projects = $this->db->table(self::TABLE)->asc('start_date')->in('id', $project_ids)->eq('is_active', self::ACTIVE)->eq('is_private', 0)->findAll(); - $bars = array(); - - foreach ($projects as $project) { - $start = empty($project['start_date']) ? time() : strtotime($project['start_date']); - $end = empty($project['end_date']) ? $start : strtotime($project['end_date']); - $color = next($colors) ?: reset($colors); - - $bars[] = array( - 'type' => 'project', - 'id' => $project['id'], - 'title' => $project['name'], - 'start' => array( - (int) date('Y', $start), - (int) date('n', $start), - (int) date('j', $start), - ), - 'end' => array( - (int) date('Y', $end), - (int) date('n', $end), - (int) date('j', $end), - ), - 'link' => $this->helper->url->href('project', 'show', array('project_id' => $project['id'])), - 'board_link' => $this->helper->url->href('board', 'show', array('project_id' => $project['id'])), - 'gantt_link' => $this->helper->url->href('gantt', 'project', array('project_id' => $project['id'])), - 'color' => $color, - 'not_defined' => empty($project['start_date']) || empty($project['end_date']), - 'users' => $this->projectPermission->getProjectUsers($project['id']), - ); - } - - return $bars; - } - /** * Get all projects * @@ -173,6 +125,22 @@ class Project extends Base return $this->db->table(self::TABLE)->asc('name')->findAll(); } + /** + * Get all projects with given Ids + * + * @access public + * @param integer[] $project_ids + * @return array + */ + public function getAllByIds(array $project_ids) + { + if (empty($project_ids)) { + return array(); + } + + return $this->db->table(self::TABLE)->in('id', $project_ids)->asc('name')->findAll(); + } + /** * Get all project ids * diff --git a/sources/app/Model/Subtask.php b/sources/app/Model/Subtask.php index d8a44af..3c6269f 100644 --- a/sources/app/Model/Subtask.php +++ b/sources/app/Model/Subtask.php @@ -49,12 +49,13 @@ class Subtask extends Base */ const EVENT_UPDATE = 'subtask.update'; const EVENT_CREATE = 'subtask.create'; + const EVENT_DELETE = 'subtask.delete'; /** * Get available status * * @access public - * @return array + * @return string[] */ public function getStatusList() { @@ -173,6 +174,23 @@ class Subtask extends Base $this->resetFields($values, array('time_estimated', 'time_spent')); } + /** + * Prepare data before insert + * + * @access public + * @param array $values Form values + */ + public function prepareCreation(array &$values) + { + $this->prepare($values); + + $values['position'] = $this->getLastPosition($values['task_id']) + 1; + $values['status'] = isset($values['status']) ? $values['status'] : self::STATUS_TODO; + $values['time_estimated'] = isset($values['time_estimated']) ? $values['time_estimated'] : 0; + $values['time_spent'] = isset($values['time_spent']) ? $values['time_spent'] : 0; + $values['user_id'] = isset($values['user_id']) ? $values['user_id'] : 0; + } + /** * Get the position of the last column for a given project * @@ -198,9 +216,7 @@ class Subtask extends Base */ public function create(array $values) { - $this->prepare($values); - $values['position'] = $this->getLastPosition($values['task_id']) + 1; - + $this->prepareCreation($values); $subtask_id = $this->persist(self::TABLE, $values); if ($subtask_id) { @@ -217,20 +233,20 @@ class Subtask extends Base * Update * * @access public - * @param array $values Form values + * @param array $values Form values + * @param bool $fire_events If true, will be called an event * @return bool */ - public function update(array $values) + public function update(array $values, $fire_events = true) { $this->prepare($values); + $subtask = $this->getById($values['id']); $result = $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values); - if ($result) { - - $this->container['dispatcher']->dispatch( - self::EVENT_UPDATE, - new SubtaskEvent($values) - ); + if ($result && $fire_events) { + $event = $subtask; + $event['changes'] = array_diff_assoc($values, $subtask); + $this->container['dispatcher']->dispatch(self::EVENT_UPDATE, new SubtaskEvent($event)); } return $result; @@ -302,7 +318,6 @@ class Subtask extends Base $positions = array_flip($subtasks); if (isset($subtasks[$subtask_id]) && $subtasks[$subtask_id] < count($subtasks)) { - $position = ++$subtasks[$subtask_id]; $subtasks[$positions[$position]]--; @@ -402,7 +417,14 @@ class Subtask extends Base */ public function remove($subtask_id) { - return $this->db->table(self::TABLE)->eq('id', $subtask_id)->remove(); + $subtask = $this->getById($subtask_id); + $result = $this->db->table(self::TABLE)->eq('id', $subtask_id)->remove(); + + if ($result) { + $this->container['dispatcher']->dispatch(self::EVENT_DELETE, new SubtaskEvent($subtask)); + } + + return $result; } /** diff --git a/sources/app/Model/SubtaskForecast.php b/sources/app/Model/SubtaskForecast.php deleted file mode 100644 index 263aa27..0000000 --- a/sources/app/Model/SubtaskForecast.php +++ /dev/null @@ -1,124 +0,0 @@ -db - ->table(Subtask::TABLE) - ->columns(Subtask::TABLE.'.id', Task::TABLE.'.project_id', Subtask::TABLE.'.task_id', Subtask::TABLE.'.title', Subtask::TABLE.'.time_estimated') - ->join(Task::TABLE, 'id', 'task_id') - ->asc(Task::TABLE.'.position') - ->asc(Subtask::TABLE.'.position') - ->gt(Subtask::TABLE.'.time_estimated', 0) - ->eq(Subtask::TABLE.'.status', Subtask::STATUS_TODO) - ->eq(Subtask::TABLE.'.user_id', $user_id) - ->findAll(); - } - - /** - * Get the start date for the forecast - * - * @access public - * @param integer $user_id - * @return array - */ - public function getStartDate($user_id) - { - $subtask = $this->db->table(Subtask::TABLE) - ->columns(Subtask::TABLE.'.time_estimated', SubtaskTimeTracking::TABLE.'.start') - ->eq(SubtaskTimeTracking::TABLE.'.user_id', $user_id) - ->eq(SubtaskTimeTracking::TABLE.'.end', 0) - ->status('status', Subtask::STATUS_INPROGRESS) - ->join(SubtaskTimeTracking::TABLE, 'subtask_id', 'id') - ->findOne(); - - if ($subtask && $subtask['time_estimated'] && $subtask['start']) { - return date('Y-m-d H:i', $subtask['start'] + $subtask['time_estimated'] * 3600); - } - - return date('Y-m-d H:i'); - } - - /** - * Get all calendar events according to the user timetable and the subtasks estimates - * - * @access public - * @param integer $user_id - * @param string $end End date of the calendar - * @return array - */ - public function getCalendarEvents($user_id, $end) - { - $events = array(); - $start_date = new DateTime($this->getStartDate($user_id)); - $timetable = $this->timetable->calculate($user_id, $start_date, new DateTime($end)); - $subtasks = $this->getSubtasks($user_id); - $total = count($subtasks); - $offset = 0; - - foreach ($timetable as $slot) { - - $interval = $this->dateParser->getHours($slot[0], $slot[1]); - $start = $slot[0]->getTimestamp(); - - if ($slot[0] < $start_date) { - - if (! $this->dateParser->withinDateRange($start_date, $slot[0], $slot[1])) { - continue; - } - - $interval = $this->dateParser->getHours(new DateTime, $slot[1]); - $start = time(); - } - - while ($offset < $total) { - - $event = array( - 'id' => $subtasks[$offset]['id'].'-'.$subtasks[$offset]['task_id'].'-'.$offset, - 'subtask_id' => $subtasks[$offset]['id'], - 'title' => t('#%d', $subtasks[$offset]['task_id']).' '.$subtasks[$offset]['title'], - 'url' => $this->helper->url->to('task', 'show', array('task_id' => $subtasks[$offset]['task_id'], 'project_id' => $subtasks[$offset]['project_id'])), - 'editable' => false, - 'start' => date('Y-m-d\TH:i:s', $start), - ); - - if ($subtasks[$offset]['time_estimated'] <= $interval) { - - $start += $subtasks[$offset]['time_estimated'] * 3600; - $interval -= $subtasks[$offset]['time_estimated']; - $offset++; - - $event['end'] = date('Y-m-d\TH:i:s', $start); - $events[] = $event; - } - else { - $subtasks[$offset]['time_estimated'] -= $interval; - $event['end'] = $slot[1]->format('Y-m-d\TH:i:s'); - $events[] = $event; - break; - } - } - } - - return $events; - } -} diff --git a/sources/app/Model/SubtaskTimeTracking.php b/sources/app/Model/SubtaskTimeTracking.php index 997031e..4a18c8a 100644 --- a/sources/app/Model/SubtaskTimeTracking.php +++ b/sources/app/Model/SubtaskTimeTracking.php @@ -150,13 +150,14 @@ class SubtaskTimeTracking extends Base * * @access public * @param integer $user_id - * @param integer $start - * @param integer $end + * @param string $start ISO-8601 format + * @param string $end * @return array */ public function getUserCalendarEvents($user_id, $start, $end) { - $result = $this->getUserQuery($user_id) + $hook = 'model:subtask-time-tracking:calendar:events'; + $events = $this->getUserQuery($user_id) ->addCondition($this->getCalendarCondition( $this->dateParser->getTimestampFromIsoFormat($start), $this->dateParser->getTimestampFromIsoFormat($end), @@ -165,9 +166,16 @@ class SubtaskTimeTracking extends Base )) ->findAll(); - $result = $this->timetable->calculateEventsIntersect($user_id, $result, $start, $end); + if ($this->hook->exists($hook)) { + $events = $this->hook->first($hook, array( + 'user_id' => $user_id, + 'events' => $events, + 'start' => $start, + 'end' => $end, + )); + } - return $this->toCalendarEvents($result); + return $this->toCalendarEvents($events); } /** @@ -293,6 +301,7 @@ class SubtaskTimeTracking extends Base */ public function getTimeSpent($subtask_id, $user_id) { + $hook = 'model:subtask-time-tracking:calculate:time-spent'; $start_time = $this->db ->table(self::TABLE) ->eq('subtask_id', $subtask_id) @@ -300,14 +309,23 @@ class SubtaskTimeTracking extends Base ->eq('end', 0) ->findOneColumn('start'); - if ($start_time) { - $start = new DateTime; - $start->setTimestamp($start_time); - - return $this->timetable->calculateEffectiveDuration($user_id, $start, new DateTime); + if (empty($start_time)) { + return 0; } - return 0; + $end = new DateTime; + $start = new DateTime; + $start->setTimestamp($start_time); + + if ($this->hook->exists($hook)) { + return $this->hook->first($hook, array( + 'user_id' => $user_id, + 'start' => $start, + 'end' => $end, + )); + } + + return $this->dateParser->getHours($start, $end); } /** @@ -327,7 +345,7 @@ class SubtaskTimeTracking extends Base 'id' => $subtask['id'], 'time_spent' => $subtask['time_spent'] + $time_spent, 'task_id' => $subtask['task_id'], - )); + ), false); } /** @@ -339,20 +357,7 @@ class SubtaskTimeTracking extends Base */ public function updateTaskTimeTracking($task_id) { - $result = $this->calculateSubtaskTime($task_id); - $values = array(); - - if ($result['total_spent'] > 0) { - $values['time_spent'] = $result['total_spent']; - } - - if ($result['total_estimated'] > 0) { - $values['time_estimated'] = $result['total_estimated']; - } - - if (empty($values)) { - return true; - } + $values = $this->calculateSubtaskTime($task_id); return $this->db ->table(Task::TABLE) @@ -373,8 +378,8 @@ class SubtaskTimeTracking extends Base ->table(Subtask::TABLE) ->eq('task_id', $task_id) ->columns( - 'SUM(time_spent) AS total_spent', - 'SUM(time_estimated) AS total_estimated' + 'SUM(time_spent) AS time_spent', + 'SUM(time_estimated) AS time_estimated' ) ->findOne(); } diff --git a/sources/app/Model/Swimlane.php b/sources/app/Model/Swimlane.php index 3b78a40..06e879a 100644 --- a/sources/app/Model/Swimlane.php +++ b/sources/app/Model/Swimlane.php @@ -160,7 +160,7 @@ class Swimlane extends Base public function getSwimlanes($project_id) { $swimlanes = $this->db->table(self::TABLE) - ->columns('id', 'name') + ->columns('id', 'name', 'description') ->eq('project_id', $project_id) ->eq('is_active', self::ACTIVE) ->orderBy('position', 'asc') @@ -216,32 +216,30 @@ class Swimlane extends Base * Add a new swimlane * * @access public - * @param integer $project_id - * @param string $name + * @param array $values Form values * @return integer|boolean */ - public function create($project_id, $name) + public function create($values) { - return $this->persist(self::TABLE, array( - 'project_id' => $project_id, - 'name' => $name, - 'position' => $this->getLastPosition($project_id), - )); + if (! $this->project->exists($values['project_id'])) { + return 0; + } + $values['position'] = $this->getLastPosition($values['project_id']); + return $this->persist(self::TABLE, $values); } /** - * Rename a swimlane + * Update a swimlane * * @access public - * @param integer $swimlane_id Swimlane id - * @param string $name Swimlane name + * @param array $values Form values * @return bool */ - public function rename($swimlane_id, $name) + public function update(array $values) { return $this->db->table(self::TABLE) - ->eq('id', $swimlane_id) - ->update(array('name' => $name)); + ->eq('id', $values['id']) + ->update($values); } /** diff --git a/sources/app/Model/TaskDuplication.php b/sources/app/Model/TaskDuplication.php index 8048f03..958b2b3 100755 --- a/sources/app/Model/TaskDuplication.php +++ b/sources/app/Model/TaskDuplication.php @@ -105,7 +105,7 @@ class TaskDuplication extends Base { $values = $this->copyFields($task_id); $values['project_id'] = $project_id; - $values['column_id'] = $column_id !== null ? $column_id : $this->board->getFirstColumn($project_id); + $values['column_id'] = $column_id !== null ? $column_id : $values['column_id']; $values['swimlane_id'] = $swimlane_id !== null ? $swimlane_id : $values['swimlane_id']; $values['category_id'] = $category_id !== null ? $category_id : $values['category_id']; $values['owner_id'] = $owner_id !== null ? $owner_id : $values['owner_id']; @@ -134,7 +134,7 @@ class TaskDuplication extends Base $values = array(); $values['is_active'] = 1; $values['project_id'] = $project_id; - $values['column_id'] = $column_id !== null ? $column_id : $this->board->getFirstColumn($project_id); + $values['column_id'] = $column_id !== null ? $column_id : $task['column_id']; $values['position'] = $this->taskFinder->countByColumnId($project_id, $values['column_id']) + 1; $values['swimlane_id'] = $swimlane_id !== null ? $swimlane_id : $task['swimlane_id']; $values['category_id'] = $category_id !== null ? $category_id : $task['category_id']; @@ -181,6 +181,16 @@ class TaskDuplication extends Base ); } + // Check if the column exists for the destination project + if ($values['column_id'] > 0) { + $values['column_id'] = $this->board->getColumnIdByTitle( + $values['project_id'], + $this->board->getColumnTitleById($values['column_id']) + ); + + $values['column_id'] = $values['column_id'] ?: $this->board->getFirstColumn($values['project_id']); + } + return $values; } diff --git a/sources/app/Model/TaskFilter.php b/sources/app/Model/TaskFilter.php index 89ad9aa..efd3be6 100644 --- a/sources/app/Model/TaskFilter.php +++ b/sources/app/Model/TaskFilter.php @@ -2,11 +2,6 @@ namespace Model; -use DateTime; -use Eluceo\iCal\Component\Calendar; -use Eluceo\iCal\Component\Event; -use Eluceo\iCal\Property\Event\Attendees; - /** * Task Filter * @@ -15,6 +10,28 @@ use Eluceo\iCal\Property\Event\Attendees; */ class TaskFilter extends Base { + /** + * Filters mapping + * + * @access private + * @var array + */ + private $filters = array( + 'T_ASSIGNEE' => 'filterByAssignee', + 'T_COLOR' => 'filterByColors', + 'T_DUE' => 'filterByDueDate', + 'T_UPDATED' => 'filterByModificationDate', + 'T_CREATED' => 'filterByCreationDate', + 'T_TITLE' => 'filterByTitle', + 'T_STATUS' => 'filterByStatusName', + 'T_DESCRIPTION' => 'filterByDescription', + 'T_CATEGORY' => 'filterByCategoryName', + 'T_PROJECT' => 'filterByProjectName', + 'T_COLUMN' => 'filterByColumnName', + 'T_REFERENCE' => 'filterByReference', + 'T_SWIMLANE' => 'filterBySwimlaneName', + ); + /** * Query * @@ -40,47 +57,8 @@ class TaskFilter extends Base } foreach ($tree as $filter => $value) { - switch ($filter) { - case 'T_ASSIGNEE': - $this->filterByAssignee($value); - break; - case 'T_COLOR': - $this->filterByColors($value); - break; - case 'T_DUE': - $this->filterByDueDate($value); - break; - case 'T_UPDATED': - $this->filterByModificationDate($value); - break; - case 'T_CREATED': - $this->filterByCreationDate($value); - break; - case 'T_TITLE': - $this->filterByTitle($value); - break; - case 'T_STATUS': - $this->filterByStatusName($value); - break; - case 'T_DESCRIPTION': - $this->filterByDescription($value); - break; - case 'T_CATEGORY': - $this->filterByCategoryName($value); - break; - case 'T_PROJECT': - $this->filterByProjectName($value); - break; - case 'T_COLUMN': - $this->filterByColumnName($value); - break; - case 'T_REFERENCE': - $this->filterByReference($value); - break; - case 'T_SWIMLANE': - $this->filterBySwimlaneName($value); - break; - } + $method = $this->filters[$filter]; + $this->$method($value); } return $this; @@ -137,7 +115,7 @@ class TaskFilter extends Base */ public function copy() { - $filter = clone($this); + $filter = new static($this->container); $filter->query = clone($this->query); $filter->query->condition = clone($this->query->condition); return $filter; @@ -674,223 +652,6 @@ class TaskFilter extends Base }); } - /** - * Format tasks to be displayed in the Gantt chart - * - * @access public - * @return array - */ - public function toGanttBars() - { - $bars = array(); - $columns = array(); - - foreach ($this->query->findAll() as $task) { - if (! isset($column_count[$task['project_id']])) { - $columns[$task['project_id']] = $this->board->getColumnsList($task['project_id']); - } - - $start = $task['date_started'] ?: time(); - $end = $task['date_due'] ?: $start; - - $bars[] = array( - 'type' => 'task', - 'id' => $task['id'], - 'title' => $task['title'], - 'start' => array( - (int) date('Y', $start), - (int) date('n', $start), - (int) date('j', $start), - ), - 'end' => array( - (int) date('Y', $end), - (int) date('n', $end), - (int) date('j', $end), - ), - 'column_title' => $task['column_name'], - 'assignee' => $task['assignee_name'] ?: $task['assignee_username'], - 'progress' => $this->task->getProgress($task, $columns[$task['project_id']]).'%', - 'link' => $this->helper->url->href('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), - 'color' => $this->color->getColorProperties($task['color_id']), - 'not_defined' => empty($task['date_due']) || empty($task['date_started']), - ); - } - - return $bars; - } - - /** - * Format the results to the ajax autocompletion - * - * @access public - * @return array - */ - public function toAutoCompletion() - { - return $this->query->columns(Task::TABLE.'.id', Task::TABLE.'.title')->callback(function(array $results) { - - foreach ($results as &$result) { - $result['value'] = $result['title']; - $result['label'] = '#'.$result['id'].' - '.$result['title']; - } - - return $results; - - })->findAll(); - } - - /** - * Transform results to calendar events - * - * @access public - * @param string $start_column Column name for the start date - * @param string $end_column Column name for the end date - * @return array - */ - public function toDateTimeCalendarEvents($start_column, $end_column) - { - $events = array(); - - foreach ($this->query->findAll() as $task) { - - $events[] = array_merge( - $this->getTaskCalendarProperties($task), - array( - 'start' => date('Y-m-d\TH:i:s', $task[$start_column]), - 'end' => date('Y-m-d\TH:i:s', $task[$end_column] ?: time()), - 'editable' => false, - ) - ); - } - - return $events; - } - - /** - * Transform results to all day calendar events - * - * @access public - * @param string $column Column name for the date - * @return array - */ - public function toAllDayCalendarEvents($column = 'date_due') - { - $events = array(); - - foreach ($this->query->findAll() as $task) { - - $events[] = array_merge( - $this->getTaskCalendarProperties($task), - array( - 'start' => date('Y-m-d', $task[$column]), - 'end' => date('Y-m-d', $task[$column]), - 'allday' => true, - ) - ); - } - - return $events; - } - - /** - * Transform results to ical events - * - * @access public - * @param string $start_column Column name for the start date - * @param string $end_column Column name for the end date - * @param Calendar $vCalendar Calendar object - * @return Calendar - */ - public function addDateTimeIcalEvents($start_column, $end_column, Calendar $vCalendar = null) - { - if ($vCalendar === null) { - $vCalendar = new Calendar('Kanboard'); - } - - foreach ($this->query->findAll() as $task) { - - $start = new DateTime; - $start->setTimestamp($task[$start_column]); - - $end = new DateTime; - $end->setTimestamp($task[$end_column] ?: time()); - - $vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-'.$start_column.'-'.$end_column); - $vEvent->setDtStart($start); - $vEvent->setDtEnd($end); - - $vCalendar->addComponent($vEvent); - } - - return $vCalendar; - } - - /** - * Transform results to all day ical events - * - * @access public - * @param string $column Column name for the date - * @param Calendar $vCalendar Calendar object - * @return Calendar - */ - public function addAllDayIcalEvents($column = 'date_due', Calendar $vCalendar = null) - { - if ($vCalendar === null) { - $vCalendar = new Calendar('Kanboard'); - } - - foreach ($this->query->findAll() as $task) { - - $date = new DateTime; - $date->setTimestamp($task[$column]); - - $vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-'.$column); - $vEvent->setDtStart($date); - $vEvent->setDtEnd($date); - $vEvent->setNoTime(true); - - $vCalendar->addComponent($vEvent); - } - - return $vCalendar; - } - - /** - * Get common events for task ical events - * - * @access protected - * @param array $task - * @param string $uid - * @return Event - */ - protected function getTaskIcalEvent(array &$task, $uid) - { - $dateCreation = new DateTime; - $dateCreation->setTimestamp($task['date_creation']); - - $dateModif = new DateTime; - $dateModif->setTimestamp($task['date_modification']); - - $vEvent = new Event($uid); - $vEvent->setCreated($dateCreation); - $vEvent->setModified($dateModif); - $vEvent->setUseTimezone(true); - $vEvent->setSummary(t('#%d', $task['id']).' '.$task['title']); - $vEvent->setUrl($this->helper->url->base().$this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); - - if (! empty($task['owner_id'])) { - $vEvent->setOrganizer($task['assignee_name'] ?: $task['assignee_username'], $task['assignee_email']); - } - - if (! empty($task['creator_id'])) { - $attendees = new Attendees; - $attendees->add('MAILTO:'.($task['creator_email'] ?: $task['creator_username'].'@kanboard.local')); - $vEvent->setAttendees($attendees); - } - - return $vEvent; - } - /** * Filter with an operator * diff --git a/sources/app/Model/TaskFinder.php b/sources/app/Model/TaskFinder.php index 3e76041..9e76e62 100644 --- a/sources/app/Model/TaskFinder.php +++ b/sources/app/Model/TaskFinder.php @@ -93,7 +93,7 @@ class TaskFinder extends Base '(SELECT count(*) FROM '.Subtask::TABLE.' WHERE '.Subtask::TABLE.'.task_id=tasks.id) AS nb_subtasks', '(SELECT count(*) FROM '.Subtask::TABLE.' WHERE '.Subtask::TABLE.'.task_id=tasks.id AND status=2) AS nb_completed_subtasks', '(SELECT count(*) FROM '.TaskLink::TABLE.' WHERE '.TaskLink::TABLE.'.task_id = tasks.id) AS nb_links', - '(SELECT 1 FROM '.TaskLink::TABLE.' WHERE '.TaskLink::TABLE.'.task_id = tasks.id AND '.TaskLink::TABLE.'.link_id = 9) AS is_milestone', + '(SELECT DISTINCT 1 FROM '.TaskLink::TABLE.' WHERE '.TaskLink::TABLE.'.task_id = tasks.id AND '.TaskLink::TABLE.'.link_id = 9) AS is_milestone', 'tasks.id', 'tasks.reference', 'tasks.title', @@ -177,14 +177,14 @@ class TaskFinder extends Base } /** - * Get a list of overdue tasks for all projects + * Get overdue tasks query * * @access public - * @return array + * @return \PicoDb\Table */ - public function getOverdueTasks() + public function getOverdueTasksQuery() { - $tasks = $this->db->table(Task::TABLE) + return $this->db->table(Task::TABLE) ->columns( Task::TABLE.'.id', Task::TABLE.'.title', @@ -201,10 +201,42 @@ class TaskFinder extends Base ->eq(Project::TABLE.'.is_active', 1) ->eq(Task::TABLE.'.is_active', 1) ->neq(Task::TABLE.'.date_due', 0) - ->lte(Task::TABLE.'.date_due', mktime(23, 59, 59)) - ->findAll(); + ->lte(Task::TABLE.'.date_due', mktime(23, 59, 59)); + } - return $tasks; + /** + * Get a list of overdue tasks for all projects + * + * @access public + * @return array + */ + public function getOverdueTasks() + { + return $this->getOverdueTasksQuery()->findAll(); + } + + /** + * Get a list of overdue tasks by project + * + * @access public + * @param integer $project_id + * @return array + */ + public function getOverdueTasksByProject($project_id) + { + return $this->getOverdueTasksQuery()->eq(Task::TABLE.'.project_id', $project_id)->findAll(); + } + + /** + * Get a list of overdue tasks by user + * + * @access public + * @param integer $user_id + * @return array + */ + public function getOverdueTasksByUser($user_id) + { + return $this->getOverdueTasksQuery()->eq(Task::TABLE.'.owner_id', $user_id)->findAll(); } /** diff --git a/sources/app/Model/TaskLink.php b/sources/app/Model/TaskLink.php index 466e44d..1c7d628 100644 --- a/sources/app/Model/TaskLink.php +++ b/sources/app/Model/TaskLink.php @@ -82,13 +82,15 @@ class TaskLink extends Base Task::TABLE.'.owner_id AS task_assignee_id', User::TABLE.'.username AS task_assignee_username', User::TABLE.'.name AS task_assignee_name', - Board::TABLE.'.title AS column_title' + Board::TABLE.'.title AS column_title', + Project::TABLE.'.name AS project_name' ) ->eq(self::TABLE.'.task_id', $task_id) ->join(Link::TABLE, 'id', 'link_id') ->join(Task::TABLE, 'id', 'opposite_task_id') ->join(Board::TABLE, 'id', 'column_id', Task::TABLE) ->join(User::TABLE, 'id', 'owner_id', Task::TABLE) + ->join(Project::TABLE, 'id', 'project_id', Task::TABLE) ->asc(Link::TABLE.'.id') ->desc(Board::TABLE.'.position') ->desc(Task::TABLE.'.is_active') diff --git a/sources/app/Model/TaskStatus.php b/sources/app/Model/TaskStatus.php index 3f62667..23d77fa 100644 --- a/sources/app/Model/TaskStatus.php +++ b/sources/app/Model/TaskStatus.php @@ -12,23 +12,6 @@ use Event\TaskEvent; */ class TaskStatus extends Base { - /** - * Return the list of statuses - * - * @access public - * @param boolean $prepend Prepend default value - * @return array - */ - public function getList($prepend = false) - { - $listing = $prepend ? array(-1 => t('All status')) : array(); - - return $listing + array( - Task::STATUS_OPEN => t('Open'), - Task::STATUS_CLOSED => t('Closed'), - ); - } - /** * Return true if the task is closed * diff --git a/sources/app/Model/Timetable.php b/sources/app/Model/Timetable.php deleted file mode 100644 index 6ddf826..0000000 --- a/sources/app/Model/Timetable.php +++ /dev/null @@ -1,356 +0,0 @@ -setTime(0, 0); - - $end_dt = new DateTime($end); - $end_dt->setTime(23, 59); - - $timetable = $this->calculate($user_id, $start_dt, $end_dt); - - // The user has no timetable - if (empty($this->week)) { - return $events; - } - - $results = array(); - - foreach ($events as $event) { - $results = array_merge($results, $this->calculateEventIntersect($event, $timetable)); - } - - return $results; - } - - /** - * Get a serie of events based on the timetable and the provided event - * - * @access public - * @param array $event - * @param array $timetable - * @return array - */ - public function calculateEventIntersect(array $event, array $timetable) - { - $events = array(); - - foreach ($timetable as $slot) { - - $start_ts = $slot[0]->getTimestamp(); - $end_ts = $slot[1]->getTimestamp(); - - if ($start_ts > $event['end']) { - break; - } - - if ($event['start'] <= $start_ts) { - $event['start'] = $start_ts; - } - - if ($event['start'] >= $start_ts && $event['start'] <= $end_ts) { - - if ($event['end'] >= $end_ts) { - $events[] = array_merge($event, array('end' => $end_ts)); - } - else { - $events[] = $event; - break; - } - } - } - - return $events; - } - - /** - * Calculate effective worked hours by taking into consideration the timetable - * - * @access public - * @param integer $user_id - * @param \DateTime $start - * @param \DateTime $end - * @return float - */ - public function calculateEffectiveDuration($user_id, DateTime $start, DateTime $end) - { - $end_timetable = clone($end); - $end_timetable->setTime(23, 59); - - $timetable = $this->calculate($user_id, $start, $end_timetable); - $found_start = false; - $hours = 0; - - // The user has no timetable - if (empty($this->week)) { - return $this->dateParser->getHours($start, $end); - } - - foreach ($timetable as $slot) { - - $isStartSlot = $this->dateParser->withinDateRange($start, $slot[0], $slot[1]); - $isEndSlot = $this->dateParser->withinDateRange($end, $slot[0], $slot[1]); - - // Start and end are within the same time slot - if ($isStartSlot && $isEndSlot) { - return $this->dateParser->getHours($start, $end); - } - - // We found the start slot - if (! $found_start && $isStartSlot) { - $found_start = true; - $hours = $this->dateParser->getHours($start, $slot[1]); - } - else if ($found_start) { - - // We found the end slot - if ($isEndSlot) { - $hours += $this->dateParser->getHours($slot[0], $end); - break; - } - else { - - // Sum hours of the intermediate time slots - $hours += $this->dateParser->getHours($slot[0], $slot[1]); - } - } - } - - // The start date was not found in regular hours so we get the nearest time slot - if (! empty($timetable) && ! $found_start) { - $slot = $this->findClosestTimeSlot($start, $timetable); - - if ($start < $slot[0]) { - return $this->calculateEffectiveDuration($user_id, $slot[0], $end); - } - } - - return $hours; - } - - /** - * Find the nearest time slot - * - * @access public - * @param DateTime $date - * @param array $timetable - * @return array - */ - public function findClosestTimeSlot(DateTime $date, array $timetable) - { - $values = array(); - - foreach ($timetable as $slot) { - $t1 = abs($slot[0]->getTimestamp() - $date->getTimestamp()); - $t2 = abs($slot[1]->getTimestamp() - $date->getTimestamp()); - - $values[] = min($t1, $t2); - } - - asort($values); - return $timetable[key($values)]; - } - - /** - * Get the timetable for a user for a given date range - * - * @access public - * @param integer $user_id - * @param \DateTime $start - * @param \DateTime $end - * @return array - */ - public function calculate($user_id, DateTime $start, DateTime $end) - { - $timetable = array(); - - $this->day = $this->timetableDay->getByUser($user_id); - $this->week = $this->timetableWeek->getByUser($user_id); - $this->overtime = $this->timetableExtra->getByUserAndDate($user_id, $start->format('Y-m-d'), $end->format('Y-m-d')); - $this->timeoff = $this->timetableOff->getByUserAndDate($user_id, $start->format('Y-m-d'), $end->format('Y-m-d')); - - for ($today = clone($start); $today <= $end; $today->add(new DateInterval('P1D'))) { - $week_day = $today->format('N'); - $timetable = array_merge($timetable, $this->getWeekSlots($today, $week_day)); - $timetable = array_merge($timetable, $this->getOvertimeSlots($today, $week_day)); - } - - return $timetable; - } - - /** - * Return worked time slots for the given day - * - * @access public - * @param \DateTime $today - * @param string $week_day - * @return array - */ - public function getWeekSlots(DateTime $today, $week_day) - { - $slots = array(); - $dayoff = $this->getDayOff($today); - - if (! empty($dayoff) && $dayoff['all_day'] == 1) { - return array(); - } - - foreach ($this->week as $slot) { - if ($week_day == $slot['day']) { - $slots = array_merge($slots, $this->getDayWorkSlots($slot, $dayoff, $today)); - } - } - - return $slots; - } - - /** - * Get the overtime time slots for the given day - * - * @access public - * @param \DateTime $today - * @param string $week_day - * @return array - */ - public function getOvertimeSlots(DateTime $today, $week_day) - { - $slots = array(); - - foreach ($this->overtime as $slot) { - - $day = new DateTime($slot['date']); - - if ($week_day == $day->format('N')) { - - if ($slot['all_day'] == 1) { - $slots = array_merge($slots, $this->getDaySlots($today)); - } - else { - $slots[] = $this->getTimeSlot($slot, $day); - } - } - } - - return $slots; - } - - /** - * Get worked time slots and remove time off - * - * @access public - * @param array $slot - * @param array $dayoff - * @param \DateTime $today - * @return array - */ - public function getDayWorkSlots(array $slot, array $dayoff, DateTime $today) - { - $slots = array(); - - if (! empty($dayoff) && $dayoff['start'] < $slot['end']) { - - if ($dayoff['start'] > $slot['start']) { - $slots[] = $this->getTimeSlot(array('end' => $dayoff['start']) + $slot, $today); - } - - if ($dayoff['end'] < $slot['end']) { - $slots[] = $this->getTimeSlot(array('start' => $dayoff['end']) + $slot, $today); - } - } - else { - $slots[] = $this->getTimeSlot($slot, $today); - } - - return $slots; - } - - /** - * Get regular day work time slots - * - * @access public - * @param \DateTime $today - * @return array - */ - public function getDaySlots(DateTime $today) - { - $slots = array(); - - foreach ($this->day as $day) { - $slots[] = $this->getTimeSlot($day, $today); - } - - return $slots; - } - - /** - * Get the start and end time slot for a given day - * - * @access public - * @param array $slot - * @param \DateTime $today - * @return array - */ - public function getTimeSlot(array $slot, DateTime $today) - { - $date = $today->format('Y-m-d'); - - return array( - new DateTime($date.' '.$slot['start']), - new DateTime($date.' '.$slot['end']), - ); - } - - /** - * Return day off time slot - * - * @access public - * @param \DateTime $today - * @return array - */ - public function getDayOff(DateTime $today) - { - foreach ($this->timeoff as $day) { - - if ($day['date'] === $today->format('Y-m-d')) { - return $day; - } - } - - return array(); - } -} diff --git a/sources/app/Model/TimetableDay.php b/sources/app/Model/TimetableDay.php deleted file mode 100644 index 0c7bf20..0000000 --- a/sources/app/Model/TimetableDay.php +++ /dev/null @@ -1,87 +0,0 @@ -db->table(self::TABLE)->eq('user_id', $user_id)->asc('start')->findAll(); - } - - /** - * Add a new time slot in the database - * - * @access public - * @param integer $user_id User id - * @param string $start Start hour (24h format) - * @param string $end End hour (24h format) - * @return boolean|integer - */ - public function create($user_id, $start, $end) - { - $values = array( - 'user_id' => $user_id, - 'start' => $start, - 'end' => $end, - ); - - return $this->persist(self::TABLE, $values); - } - - /** - * Remove a specific time slot - * - * @access public - * @param integer $slot_id - * @return boolean - */ - public function remove($slot_id) - { - return $this->db->table(self::TABLE)->eq('id', $slot_id)->remove(); - } - - /** - * Validate creation - * - * @access public - * @param array $values Form values - * @return array $valid, $errors [0] = Success or not, [1] = List of errors - */ - public function validateCreation(array $values) - { - $v = new Validator($values, array( - new Validators\Required('user_id', t('Field required')), - new Validators\Required('start', t('Field required')), - new Validators\Required('end', t('Field required')), - )); - - return array( - $v->execute(), - $v->getErrors() - ); - } -} diff --git a/sources/app/Model/TimetableExtra.php b/sources/app/Model/TimetableExtra.php deleted file mode 100644 index 48db662..0000000 --- a/sources/app/Model/TimetableExtra.php +++ /dev/null @@ -1,22 +0,0 @@ -db->table(static::TABLE)->eq('user_id', $user_id); - } - - /** - * Get the timetable for a given user - * - * @access public - * @param integer $user_id User id - * @return array - */ - public function getByUser($user_id) - { - return $this->db->table(static::TABLE)->eq('user_id', $user_id)->desc('date')->asc('start')->findAll(); - } - - /** - * Get the timetable for a given user - * - * @access public - * @param integer $user_id User id - * @param string $start_date - * @param string $end_date - * @return array - */ - public function getByUserAndDate($user_id, $start_date, $end_date) - { - return $this->db->table(static::TABLE) - ->eq('user_id', $user_id) - ->gte('date', $start_date) - ->lte('date', $end_date) - ->desc('date') - ->asc('start') - ->findAll(); - } - - /** - * Add a new time slot in the database - * - * @access public - * @param integer $user_id User id - * @param string $date Day (ISO8601 format) - * @param boolean $all_day All day flag - * @param float $start Start hour (24h format) - * @param float $end End hour (24h format) - * @param string $comment - * @return boolean|integer - */ - public function create($user_id, $date, $all_day, $start = '', $end = '', $comment = '') - { - $values = array( - 'user_id' => $user_id, - 'date' => $date, - 'all_day' => (int) $all_day, // Postgres fix - 'start' => $all_day ? '' : $start, - 'end' => $all_day ? '' : $end, - 'comment' => $comment, - ); - - return $this->persist(static::TABLE, $values); - } - - /** - * Remove a specific time slot - * - * @access public - * @param integer $slot_id - * @return boolean - */ - public function remove($slot_id) - { - return $this->db->table(static::TABLE)->eq('id', $slot_id)->remove(); - } - - /** - * Validate creation - * - * @access public - * @param array $values Form values - * @return array $valid, $errors [0] = Success or not, [1] = List of errors - */ - public function validateCreation(array $values) - { - $v = new Validator($values, array( - new Validators\Required('user_id', t('Field required')), - new Validators\Required('date', t('Field required')), - new Validators\Numeric('all_day', t('This value must be numeric')), - )); - - return array( - $v->execute(), - $v->getErrors() - ); - } -} diff --git a/sources/app/Model/TimetableWeek.php b/sources/app/Model/TimetableWeek.php deleted file mode 100644 index b22b3b7..0000000 --- a/sources/app/Model/TimetableWeek.php +++ /dev/null @@ -1,91 +0,0 @@ -db->table(self::TABLE)->eq('user_id', $user_id)->asc('day')->asc('start')->findAll(); - } - - /** - * Add a new time slot in the database - * - * @access public - * @param integer $user_id User id - * @param string $day Day of the week (ISO-8601) - * @param string $start Start hour (24h format) - * @param string $end End hour (24h format) - * @return boolean|integer - */ - public function create($user_id, $day, $start, $end) - { - $values = array( - 'user_id' => $user_id, - 'day' => $day, - 'start' => $start, - 'end' => $end, - ); - - return $this->persist(self::TABLE, $values); - } - - /** - * Remove a specific time slot - * - * @access public - * @param integer $slot_id - * @return boolean - */ - public function remove($slot_id) - { - return $this->db->table(self::TABLE)->eq('id', $slot_id)->remove(); - } - - /** - * Validate creation - * - * @access public - * @param array $values Form values - * @return array $valid, $errors [0] = Success or not, [1] = List of errors - */ - public function validateCreation(array $values) - { - $v = new Validator($values, array( - new Validators\Required('user_id', t('Field required')), - new Validators\Required('day', t('Field required')), - new Validators\Numeric('day', t('This value must be numeric')), - new Validators\Required('start', t('Field required')), - new Validators\Required('end', t('Field required')), - )); - - return array( - $v->execute(), - $v->getErrors() - ); - } -} diff --git a/sources/app/Model/User.php b/sources/app/Model/User.php index 8a7eff4..fd2ec95 100644 --- a/sources/app/Model/User.php +++ b/sources/app/Model/User.php @@ -91,7 +91,7 @@ class User extends Base ->table(User::TABLE) ->eq('id', $user_id) ->eq('is_admin', 1) - ->count() === 1; + ->exists(); } /** @@ -251,7 +251,7 @@ class User extends Base $result = array(); foreach ($users as $user) { - $result[$user['id']] = $user['name'] ?: $user['username']; + $result[$user['id']] = $this->getFullname($user); } asort($result); @@ -278,7 +278,9 @@ class User extends Base } $this->removeFields($values, array('confirmation', 'current_password')); - $this->resetFields($values, array('is_admin', 'is_ldap_user', 'is_project_admin')); + $this->resetFields($values, array('is_admin', 'is_ldap_user', 'is_project_admin', 'disable_login_form')); + $this->convertNullFields($values, array('gitlab_id')); + $this->convertIntegerFields($values, array('gitlab_id')); } /** diff --git a/sources/app/Model/WebNotification.php b/sources/app/Model/WebNotification.php new file mode 100644 index 0000000..4f4e8af --- /dev/null +++ b/sources/app/Model/WebNotification.php @@ -0,0 +1,156 @@ +db->table(self::TABLE)->insert(array( + 'user_id' => $user['id'], + 'date_creation' => time(), + 'event_name' => $event_name, + 'event_data' => json_encode($event_data), + )); + } + + /** + * Get all notifications for a user + * + * @access public + * @param integer $user_id + * @return array + */ + public function getAll($user_id) + { + $events = $this->db->table(self::TABLE)->eq('user_id', $user_id)->asc('date_creation')->findAll(); + + foreach ($events as &$event) { + $event['event_data'] = json_decode($event['event_data'], true); + $event['title'] = $this->getTitleFromEvent($event['event_name'], $event['event_data']); + } + + return $events; + } + + /** + * Mark a notification as read + * + * @access public + * @param integer $user_id + * @param integer $notification_id + * @return boolean + */ + public function markAsRead($user_id, $notification_id) + { + return $this->db->table(self::TABLE)->eq('id', $notification_id)->eq('user_id', $user_id)->remove(); + } + + /** + * Mark all notifications as read for a user + * + * @access public + * @param integer $user_id + * @return boolean + */ + public function markAllAsRead($user_id) + { + return $this->db->table(self::TABLE)->eq('user_id', $user_id)->remove(); + } + + /** + * Return true if the user as unread notifications + * + * @access public + * @param integer $user_id + * @return boolean + */ + public function hasNotifications($user_id) + { + return $this->db->table(self::TABLE)->eq('user_id', $user_id)->exists(); + } + + /** + * Get title from event + * + * @access public + * @param string $event_name + * @param array $event_data + * @return string + */ + public function getTitleFromEvent($event_name, array $event_data) + { + switch ($event_name) { + case File::EVENT_CREATE: + $title = t('New attachment on task #%d: %s', $event_data['file']['task_id'], $event_data['file']['name']); + break; + case Comment::EVENT_CREATE: + $title = t('New comment on task #%d', $event_data['comment']['task_id']); + break; + case Comment::EVENT_UPDATE: + $title = t('Comment updated on task #%d', $event_data['comment']['task_id']); + break; + case Subtask::EVENT_CREATE: + $title = t('New subtask on task #%d', $event_data['subtask']['task_id']); + break; + case Subtask::EVENT_UPDATE: + $title = t('Subtask updated on task #%d', $event_data['subtask']['task_id']); + break; + case Task::EVENT_CREATE: + $title = t('New task #%d: %s', $event_data['task']['id'], $event_data['task']['title']); + break; + case Task::EVENT_UPDATE: + $title = t('Task updated #%d', $event_data['task']['id']); + break; + case Task::EVENT_CLOSE: + $title = t('Task #%d closed', $event_data['task']['id']); + break; + case Task::EVENT_OPEN: + $title = t('Task #%d opened', $event_data['task']['id']); + break; + case Task::EVENT_MOVE_COLUMN: + $title = t('Column changed for task #%d', $event_data['task']['id']); + break; + case Task::EVENT_MOVE_POSITION: + $title = t('New position for task #%d', $event_data['task']['id']); + break; + case Task::EVENT_MOVE_SWIMLANE: + $title = t('Swimlane changed for task #%d', $event_data['task']['id']); + break; + case Task::EVENT_ASSIGNEE_CHANGE: + $title = t('Assignee changed on task #%d', $event_data['task']['id']); + break; + case Task::EVENT_OVERDUE: + $nb = count($event_data['tasks']); + $title = $nb > 1 ? t('%d overdue tasks', $nb) : t('Task #%d is overdue', $event_data['tasks'][0]['id']); + break; + default: + $title = e('Notification'); + } + + return $title; + } +} diff --git a/sources/app/Schema/Mysql.php b/sources/app/Schema/Mysql.php index b1ac0ab..37894db 100644 --- a/sources/app/Schema/Mysql.php +++ b/sources/app/Schema/Mysql.php @@ -6,7 +6,96 @@ use PDO; use Core\Security; use Model\Link; -const VERSION = 85; +const VERSION = 90; + +function version_90($pdo) +{ + $pdo->exec("ALTER TABLE tasks MODIFY date_due BIGINT"); + $pdo->exec("ALTER TABLE tasks MODIFY date_creation BIGINT"); + $pdo->exec("ALTER TABLE tasks MODIFY date_completed BIGINT"); + $pdo->exec("ALTER TABLE tasks MODIFY date_started BIGINT"); + $pdo->exec("ALTER TABLE tasks MODIFY date_moved BIGINT"); + $pdo->exec("ALTER TABLE comments MODIFY date_creation BIGINT"); + $pdo->exec("ALTER TABLE last_logins MODIFY date_creation BIGINT"); + $pdo->exec("ALTER TABLE project_activities MODIFY date_creation BIGINT"); + $pdo->exec("ALTER TABLE projects MODIFY last_modified BIGINT"); + $pdo->exec("ALTER TABLE remember_me MODIFY date_creation BIGINT"); + $pdo->exec('ALTER TABLE files MODIFY `date` BIGINT'); + $pdo->exec('ALTER TABLE transitions MODIFY `date` BIGINT'); + $pdo->exec('ALTER TABLE subtask_time_tracking MODIFY `start` BIGINT'); + $pdo->exec('ALTER TABLE subtask_time_tracking MODIFY `end` BIGINT'); + $pdo->exec('ALTER TABLE users MODIFY `lock_expiration_date` BIGINT'); +} + +function version_89($pdo) +{ + $pdo->exec(" + CREATE TABLE user_has_unread_notifications ( + id INT NOT NULL AUTO_INCREMENT, + user_id INT NOT NULL, + date_creation BIGINT NOT NULL, + event_name VARCHAR(50) NOT NULL, + event_data TEXT NOT NULL, + PRIMARY KEY(id), + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) ENGINE=InnoDB CHARSET=utf8 + "); + + $pdo->exec(" + CREATE TABLE user_has_notification_types ( + id INT NOT NULL AUTO_INCREMENT, + user_id INT NOT NULL, + notification_type VARCHAR(50), + PRIMARY KEY(id), + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) ENGINE=InnoDB CHARSET=utf8 + "); + + $pdo->exec('CREATE UNIQUE INDEX user_has_notification_types_user_idx ON user_has_notification_types(user_id, notification_type)'); + + // Migrate people who have notification enabled before + $rq = $pdo->prepare('SELECT id FROM users WHERE notifications_enabled=1'); + $rq->execute(); + $user_ids = $rq->fetchAll(PDO::FETCH_COLUMN, 0); + + foreach ($user_ids as $user_id) { + $rq = $pdo->prepare('INSERT INTO user_has_notification_types (user_id, notification_type) VALUES (?, ?)'); + $rq->execute(array($user_id, 'email')); + } +} + +function version_88($pdo) +{ + $pdo->exec(" + CREATE TABLE custom_filters ( + id INT NOT NULL AUTO_INCREMENT, + filter VARCHAR(100) NOT NULL, + project_id INT NOT NULL, + user_id INT NOT NULL, + name VARCHAR(100) NOT NULL, + is_shared TINYINT(1) DEFAULT 0, + PRIMARY KEY(id), + FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE, + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) ENGINE=InnoDB CHARSET=utf8 + "); +} + +function version_87($pdo) +{ + $pdo->exec(" + CREATE TABLE plugin_schema_versions ( + plugin VARCHAR(80) NOT NULL, + version INT NOT NULL DEFAULT 0, + PRIMARY KEY(plugin) + ) ENGINE=InnoDB CHARSET=utf8 + "); +} + +function version_86($pdo) +{ + $pdo->exec("ALTER TABLE swimlanes ADD COLUMN description TEXT"); +} function version_85($pdo) { @@ -150,7 +239,6 @@ function version_69($pdo) $result = $rq->fetch(PDO::FETCH_ASSOC); $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)'); - $rq->execute(array('calendar_user_subtasks_forecast', isset($result['subtask_forecast']) && $result['subtask_forecast'] == 1 ? 1 : 0)); $rq->execute(array('calendar_user_subtasks_time_tracking', 0)); $rq->execute(array('calendar_user_tasks', 'date_started')); $rq->execute(array('calendar_project_tasks', 'date_started')); @@ -306,78 +394,6 @@ function version_53($pdo) $pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent FLOAT DEFAULT 0"); } -function version_52($pdo) -{ - $pdo->exec('CREATE TABLE budget_lines ( - `id` INT NOT NULL AUTO_INCREMENT, - `project_id` INT NOT NULL, - `amount` FLOAT NOT NULL, - `date` VARCHAR(10) NOT NULL, - `comment` TEXT, - FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8'); -} - -function version_51($pdo) -{ - $pdo->exec('CREATE TABLE timetable_day ( - id INT NOT NULL AUTO_INCREMENT, - user_id INT NOT NULL, - start VARCHAR(5) NOT NULL, - end VARCHAR(5) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8'); - - $pdo->exec('CREATE TABLE timetable_week ( - id INT NOT NULL AUTO_INCREMENT, - user_id INTEGER NOT NULL, - day INT NOT NULL, - start VARCHAR(5) NOT NULL, - end VARCHAR(5) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8'); - - $pdo->exec('CREATE TABLE timetable_off ( - id INT NOT NULL AUTO_INCREMENT, - user_id INT NOT NULL, - date VARCHAR(10) NOT NULL, - all_day TINYINT(1) DEFAULT 0, - start VARCHAR(5) DEFAULT 0, - end VARCHAR(5) DEFAULT 0, - comment TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8'); - - $pdo->exec('CREATE TABLE timetable_extra ( - id INT NOT NULL AUTO_INCREMENT, - user_id INT NOT NULL, - date VARCHAR(10) NOT NULL, - all_day TINYINT(1) DEFAULT 0, - start VARCHAR(5) DEFAULT 0, - end VARCHAR(5) DEFAULT 0, - comment TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8'); -} - -function version_50($pdo) -{ - $pdo->exec("CREATE TABLE hourly_rates ( - id INT NOT NULL AUTO_INCREMENT, - user_id INT NOT NULL, - rate FLOAT DEFAULT 0, - date_effective INTEGER NOT NULL, - currency CHAR(3) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(id) - ) ENGINE=InnoDB CHARSET=utf8"); -} - function version_49($pdo) { $pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1'); diff --git a/sources/app/Schema/Postgres.php b/sources/app/Schema/Postgres.php index 9477b41..2a446e4 100644 --- a/sources/app/Schema/Postgres.php +++ b/sources/app/Schema/Postgres.php @@ -6,7 +6,90 @@ use PDO; use Core\Security; use Model\Link; -const VERSION = 65; +const VERSION = 70; + +function version_70($pdo) +{ + $pdo->exec("ALTER TABLE tasks ALTER COLUMN date_due TYPE BIGINT"); + $pdo->exec("ALTER TABLE tasks ALTER COLUMN date_creation TYPE BIGINT"); + $pdo->exec("ALTER TABLE tasks ALTER COLUMN date_completed TYPE BIGINT"); + $pdo->exec("ALTER TABLE tasks ALTER COLUMN date_started TYPE BIGINT"); + $pdo->exec("ALTER TABLE tasks ALTER COLUMN date_moved TYPE BIGINT"); + $pdo->exec("ALTER TABLE comments ALTER COLUMN date_creation TYPE BIGINT"); + $pdo->exec("ALTER TABLE last_logins ALTER COLUMN date_creation TYPE BIGINT"); + $pdo->exec("ALTER TABLE project_activities ALTER COLUMN date_creation TYPE BIGINT"); + $pdo->exec("ALTER TABLE projects ALTER COLUMN last_modified TYPE BIGINT"); + $pdo->exec("ALTER TABLE remember_me ALTER COLUMN date_creation TYPE BIGINT"); + $pdo->exec('ALTER TABLE files ALTER COLUMN "date" TYPE BIGINT'); + $pdo->exec('ALTER TABLE transitions ALTER COLUMN "date" TYPE BIGINT'); + $pdo->exec('ALTER TABLE subtask_time_tracking ALTER COLUMN "start" TYPE BIGINT'); + $pdo->exec('ALTER TABLE subtask_time_tracking ALTER COLUMN "end" TYPE BIGINT'); + $pdo->exec('ALTER TABLE users ALTER COLUMN "lock_expiration_date" TYPE BIGINT'); +} + +function version_69($pdo) +{ + $pdo->exec(" + CREATE TABLE user_has_unread_notifications ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL, + date_creation BIGINT NOT NULL, + event_name VARCHAR(50) NOT NULL, + event_data TEXT NOT NULL, + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) + "); + + $pdo->exec(" + CREATE TABLE user_has_notification_types ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL, + notification_type VARCHAR(50), + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) + "); + + $pdo->exec('CREATE UNIQUE INDEX user_has_notification_types_user_idx ON user_has_notification_types(user_id, notification_type)'); + + // Migrate people who have notification enabled before + $rq = $pdo->prepare("SELECT id FROM users WHERE notifications_enabled='1'"); + $rq->execute(); + $user_ids = $rq->fetchAll(PDO::FETCH_COLUMN, 0); + + foreach ($user_ids as $user_id) { + $rq = $pdo->prepare('INSERT INTO user_has_notification_types (user_id, notification_type) VALUES (?, ?)'); + $rq->execute(array($user_id, 'email')); + } +} + +function version_68($pdo) +{ + $pdo->exec(" + CREATE TABLE custom_filters ( + id SERIAL PRIMARY KEY, + filter VARCHAR(100) NOT NULL, + project_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + name VARCHAR(100) NOT NULL, + is_shared BOOLEAN DEFAULT '0' + ) + "); +} + +function version_67($pdo) +{ + $pdo->exec(" + CREATE TABLE plugin_schema_versions ( + plugin VARCHAR(80) NOT NULL PRIMARY KEY, + version INTEGER NOT NULL DEFAULT 0 + ) + "); +} + +function version_66($pdo) +{ + $pdo->exec("ALTER TABLE swimlanes ADD COLUMN description TEXT"); +} function version_65($pdo) { @@ -146,7 +229,6 @@ function version_50($pdo) $result = $rq->fetch(PDO::FETCH_ASSOC); $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)'); - $rq->execute(array('calendar_user_subtasks_forecast', isset($result['subtask_forecast']) && $result['subtask_forecast'] == 1 ? 1 : 0)); $rq->execute(array('calendar_user_subtasks_time_tracking', 0)); $rq->execute(array('calendar_user_tasks', 'date_started')); $rq->execute(array('calendar_project_tasks', 'date_started')); @@ -300,72 +382,6 @@ function version_34($pdo) $pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent REAL DEFAULT 0"); } -function version_33($pdo) -{ - $pdo->exec('CREATE TABLE budget_lines ( - "id" SERIAL PRIMARY KEY, - "project_id" INTEGER NOT NULL, - "amount" REAL NOT NULL, - "date" VARCHAR(10) NOT NULL, - "comment" TEXT, - FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE - )'); -} - -function version_32($pdo) -{ - $pdo->exec('CREATE TABLE timetable_day ( - "id" SERIAL PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "start" VARCHAR(5) NOT NULL, - "end" VARCHAR(5) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_week ( - "id" SERIAL PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "day" INTEGER NOT NULL, - "start" VARCHAR(5) NOT NULL, - "end" VARCHAR(5) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_off ( - "id" SERIAL PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "date" VARCHAR(10) NOT NULL, - "all_day" BOOLEAN DEFAULT \'0\', - "start" VARCHAR(5) DEFAULT 0, - "end" VARCHAR(5) DEFAULT 0, - "comment" TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_extra ( - "id" SERIAL PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "date" VARCHAR(10) NOT NULL, - "all_day" BOOLEAN DEFAULT \'0\', - "start" VARCHAR(5) DEFAULT 0, - "end" VARCHAR(5) DEFAULT 0, - "comment" TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); -} - -function version_31($pdo) -{ - $pdo->exec("CREATE TABLE hourly_rates ( - id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL, - rate REAL DEFAULT 0, - date_effective INTEGER NOT NULL, - currency CHAR(3) NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )"); -} - function version_30($pdo) { $pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1'); diff --git a/sources/app/Schema/Sqlite.php b/sources/app/Schema/Sqlite.php index b4e4b94..633c90a 100644 --- a/sources/app/Schema/Sqlite.php +++ b/sources/app/Schema/Sqlite.php @@ -6,7 +6,71 @@ use Core\Security; use PDO; use Model\Link; -const VERSION = 81; +const VERSION = 85; + +function version_85($pdo) +{ + $pdo->exec(" + CREATE TABLE user_has_unread_notifications ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + date_creation INTEGER NOT NULL, + event_name TEXT NOT NULL, + event_data TEXT NOT NULL, + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) + "); + + $pdo->exec(" + CREATE TABLE user_has_notification_types ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + notification_type TEXT, + FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE + ) + "); + + $pdo->exec('CREATE UNIQUE INDEX user_has_notification_types_user_idx ON user_has_notification_types(user_id, notification_type)'); + + // Migrate people who have notification enabled before + $rq = $pdo->prepare('SELECT id FROM users WHERE notifications_enabled=1'); + $rq->execute(); + $user_ids = $rq->fetchAll(PDO::FETCH_COLUMN, 0); + + foreach ($user_ids as $user_id) { + $rq = $pdo->prepare('INSERT INTO user_has_notification_types (user_id, notification_type) VALUES (?, ?)'); + $rq->execute(array($user_id, 'email')); + } +} + +function version_84($pdo) +{ + $pdo->exec(" + CREATE TABLE custom_filters ( + id INTEGER PRIMARY KEY, + filter TEXT NOT NULL, + project_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + name TEXT NOT NULL, + is_shared INTEGER DEFAULT 0 + ) + "); +} + +function version_83($pdo) +{ + $pdo->exec(" + CREATE TABLE plugin_schema_versions ( + plugin TEXT NOT NULL PRIMARY KEY, + version INTEGER NOT NULL DEFAULT 0 + ) + "); +} + +function version_82($pdo) +{ + $pdo->exec("ALTER TABLE swimlanes ADD COLUMN description TEXT"); +} function version_81($pdo) { @@ -123,7 +187,6 @@ function version_68($pdo) $result = $rq->fetch(PDO::FETCH_ASSOC); $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)'); - $rq->execute(array('calendar_user_subtasks_forecast', isset($result['subtask_forecast']) && $result['subtask_forecast'] == 1 ? 1 : 0)); $rq->execute(array('calendar_user_subtasks_time_tracking', 0)); $rq->execute(array('calendar_user_tasks', 'date_started')); $rq->execute(array('calendar_project_tasks', 'date_started')); @@ -277,72 +340,6 @@ function version_52($pdo) $pdo->exec("ALTER TABLE subtask_time_tracking ADD COLUMN time_spent REAL DEFAULT 0"); } -function version_51($pdo) -{ - $pdo->exec('CREATE TABLE budget_lines ( - "id" INTEGER PRIMARY KEY, - "project_id" INTEGER NOT NULL, - "amount" REAL NOT NULL, - "date" TEXT NOT NULL, - "comment" TEXT, - FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE - )'); -} - -function version_50($pdo) -{ - $pdo->exec('CREATE TABLE timetable_day ( - "id" INTEGER PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "start" TEXT NOT NULL, - "end" TEXT NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_week ( - "id" INTEGER PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "day" INTEGER NOT NULL, - "start" TEXT NOT NULL, - "end" TEXT NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_off ( - "id" INTEGER PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "date" TEXT NOT NULL, - "all_day" INTEGER DEFAULT 0, - "start" TEXT DEFAULT 0, - "end" TEXT DEFAULT 0, - "comment" TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); - - $pdo->exec('CREATE TABLE timetable_extra ( - "id" INTEGER PRIMARY KEY, - "user_id" INTEGER NOT NULL, - "date" TEXT NOT NULL, - "all_day" INTEGER DEFAULT 0, - "start" TEXT DEFAULT 0, - "end" TEXT DEFAULT 0, - "comment" TEXT, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )'); -} - -function version_49($pdo) -{ - $pdo->exec("CREATE TABLE hourly_rates ( - id INTEGER PRIMARY KEY, - user_id INTEGER NOT NULL, - rate REAL DEFAULT 0, - date_effective INTEGER NOT NULL, - currency TEXT NOT NULL, - FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE - )"); -} - function version_48($pdo) { $pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1'); diff --git a/sources/app/ServiceProvider/ClassProvider.php b/sources/app/ServiceProvider/ClassProvider.php index ef7aa57..5d15774 100644 --- a/sources/app/ServiceProvider/ClassProvider.php +++ b/sources/app/ServiceProvider/ClassProvider.php @@ -2,13 +2,17 @@ namespace ServiceProvider; +use Core\Plugin\Loader; +use Core\ObjectStorage\FileStorage; use Core\Paginator; use Core\OAuth2; +use Core\Tool; use Model\Config; use Model\Project; use Model\Webhook; use Pimple\Container; use Pimple\ServiceProviderInterface; +use League\HTMLToMarkdown\HtmlConverter; class ClassProvider implements ServiceProviderInterface { @@ -18,18 +22,22 @@ class ClassProvider implements ServiceProviderInterface 'Action', 'Authentication', 'Board', - 'Budget', 'Category', 'Color', 'Comment', 'Config', 'Currency', + 'CustomFilter', 'DateParser', 'File', - 'HourlyRate', 'LastLogin', 'Link', 'Notification', + 'NotificationType', + 'NotificationFilter', + 'OverdueNotification', + 'WebNotification', + 'EmailNotification', 'Project', 'ProjectActivity', 'ProjectAnalytic', @@ -40,7 +48,6 @@ class ClassProvider implements ServiceProviderInterface 'ProjectPermission', 'Subtask', 'SubtaskExport', - 'SubtaskForecast', 'SubtaskTimeTracking', 'Swimlane', 'Task', @@ -56,27 +63,34 @@ class ClassProvider implements ServiceProviderInterface 'TaskPosition', 'TaskStatus', 'TaskValidator', - 'Timetable', - 'TimetableDay', - 'TimetableExtra', - 'TimetableWeek', - 'TimetableOff', 'Transition', 'User', 'UserSession', 'Webhook', ), + 'Formatter' => array( + 'TaskFilterGanttFormatter', + 'TaskFilterAutoCompleteFormatter', + 'TaskFilterCalendarFormatter', + 'TaskFilterICalendarFormatter', + 'ProjectGanttFormatter', + ), 'Core' => array( 'EmailClient', 'Helper', 'HttpClient', 'Lexer', - 'MemoryCache', 'Request', 'Router', 'Session', 'Template', ), + 'Core\Cache' => array( + 'MemoryCache', + ), + 'Core\Plugin' => array( + 'Hook', + ), 'Integration' => array( 'BitbucketWebhook', 'GithubWebhook', @@ -93,17 +107,7 @@ class ClassProvider implements ServiceProviderInterface public function register(Container $container) { - foreach ($this->classes as $namespace => $classes) { - - foreach ($classes as $name) { - - $class = '\\'.$namespace.'\\'.$name; - - $container[lcfirst($name)] = function ($c) use ($class) { - return new $class($c); - }; - } - } + Tool::buildDIC($container, $this->classes); $container['paginator'] = $container->factory(function ($c) { return new Paginator($c); @@ -112,5 +116,17 @@ class ClassProvider implements ServiceProviderInterface $container['oauth'] = $container->factory(function ($c) { return new OAuth2($c); }); + + $container['htmlConverter'] = function() { + return new HtmlConverter(array('strip_tags' => true)); + }; + + $container['objectStorage'] = function() { + return new FileStorage(FILES_DIR); + }; + + $container['pluginLoader'] = new Loader($container); + + $container['cspRules'] = array('style-src' => "'self' 'unsafe-inline'", 'img-src' => '* data:'); } } diff --git a/sources/app/ServiceProvider/LoggingProvider.php b/sources/app/ServiceProvider/LoggingProvider.php index dd79d65..16fa6ce 100644 --- a/sources/app/ServiceProvider/LoggingProvider.php +++ b/sources/app/ServiceProvider/LoggingProvider.php @@ -13,11 +13,13 @@ class LoggingProvider implements ServiceProviderInterface { public function register(Container $container) { - $syslog = new Syslog('kanboard'); - $syslog->setLevel(LogLevel::ERROR); - $logger = new Logger; - $logger->setLogger($syslog); + + if (ENABLE_SYSLOG) { + $syslog = new Syslog('kanboard'); + $syslog->setLevel(LogLevel::ERROR); + $logger->setLogger($syslog); + } if (DEBUG) { $logger->setLogger(new File(DEBUG_FILE)); diff --git a/sources/app/Subscriber/SubtaskTimeTrackingSubscriber.php b/sources/app/Subscriber/SubtaskTimeTrackingSubscriber.php index e45b2c9..2d3b5f9 100644 --- a/sources/app/Subscriber/SubtaskTimeTrackingSubscriber.php +++ b/sources/app/Subscriber/SubtaskTimeTrackingSubscriber.php @@ -12,6 +12,7 @@ class SubtaskTimeTrackingSubscriber extends \Core\Base implements EventSubscribe { return array( Subtask::EVENT_CREATE => array('updateTaskTime', 0), + Subtask::EVENT_DELETE => array('updateTaskTime', 0), Subtask::EVENT_UPDATE => array( array('logStartEnd', 10), array('updateTaskTime', 0), diff --git a/sources/app/Template/app/notifications.php b/sources/app/Template/app/notifications.php new file mode 100644 index 0000000..4f7dd35 --- /dev/null +++ b/sources/app/Template/app/notifications.php @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + +
+ text->contains($notification['event_name'], 'subtask')): ?> + + text->contains($notification['event_name'], 'task.move')): ?> + + text->contains($notification['event_name'], 'task.overdue')): ?> + + text->contains($notification['event_name'], 'task')): ?> + + text->contains($notification['event_name'], 'comment')): ?> + + text->contains($notification['event_name'], 'file')): ?> + + + + text->contains($notification['event_name'], 'comment')): ?> + url->link($notification['title'], 'task', 'show', array('task_id' => $notification['event_data']['task']['id'], 'project_id' => $notification['event_data']['task']['project_id']), false, '', '', false, 'comment-'.$notification['event_data']['comment']['id']) ?> + text->contains($notification['event_name'], 'task.overdue')): ?> + 1): ?> + + + url->link($notification['title'], 'task', 'show', array('task_id' => $notification['event_data']['tasks'][0]['id'], 'project_id' => $notification['event_data']['tasks'][0]['project_id'])) ?> + + + url->link($notification['title'], 'task', 'show', array('task_id' => $notification['event_data']['task']['id'], 'project_id' => $notification['event_data']['task']['project_id'])) ?> + + + + + + url->link(t('Mark as read'), 'webnotification', 'remove', array('user_id' => $user['id'], 'notification_id' => $notification['id'])) ?> +
+ \ No newline at end of file diff --git a/sources/app/Template/app/projects.php b/sources/app/Template/app/projects.php index 43db85b..cf22707 100644 --- a/sources/app/Template/app/projects.php +++ b/sources/app/Template/app/projects.php @@ -6,8 +6,9 @@ - - + + + getCollection() as $project): ?> @@ -15,11 +16,17 @@ + + + + + diff --git a/sources/app/Template/board/table_container.php b/sources/app/Template/board/table_container.php index 98b40eb..b2d475a 100644 --- a/sources/app/Template/board/table_container.php +++ b/sources/app/Template/board/table_container.php @@ -1,31 +1,58 @@
- -
order('Id', 'id') ?>order(t('Project'), 'name') ?>order('Id', 'id') ?>order('', 'is_private') ?>order(t('Project'), 'name') ?>
url->link('#'.$project['id'], 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link') ?> + + + + user->isProjectManagementAllowed($project['id'])): ?> - url->link('', 'project', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Settings')) ?>  + url->link('', 'gantt', 'project', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Gantt chart')) ?> + url->link('', 'listing', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('List')) ?>  url->link('', 'calendar', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Calendar')) ?>  url->link($this->e($project['name']), 'board', 'show', array('project_id' => $project['id'])) ?> diff --git a/sources/app/Template/app/sidebar.php b/sources/app/Template/app/sidebar.php index 2d96600..552a9c2 100644 --- a/sources/app/Template/app/sidebar.php +++ b/sources/app/Template/app/sidebar.php @@ -19,6 +19,10 @@
  • app->getRouterAction() === 'activity' ? 'class="active"' : '' ?>> url->link(t('My activity stream'), 'app', 'activity', array('user_id' => $user['id'])) ?>
  • +
  • app->getRouterAction() === 'notifications' ? 'class="active"' : '' ?>> + url->link(t('My notifications'), 'app', 'notifications', array('user_id' => $user['id'])) ?> +
  • + hook->render('template:dashboard:sidebar') ?> diff --git a/sources/app/Template/board/table_column.php b/sources/app/Template/board/table_column.php new file mode 100644 index 0000000..2a6b496 --- /dev/null +++ b/sources/app/Template/board/table_column.php @@ -0,0 +1,56 @@ + +
    + + +
    + + + +
    + + +
    + +
    + url->link('+', 'taskcreation', 'create', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']), false, 'popover', t('Add a new task')) ?> +
    + + + 1 && ! empty($column['nb_column_tasks'])): ?> + + () + + + + + e($column['title']) ?> + + + + '> + + + + + + + + + + + + + (/e($column['task_limit']) ?>) + + + + () + + +
    + +
    + +

    -
    - - - -

    - + +
    - render('board/table_swimlane', array( - 'project' => $project, - 'swimlane' => $swimlane, - 'board_highlight_period' => $board_highlight_period, - 'hide_swimlane' => count($swimlanes) === 1, - 'not_editable' => isset($not_editable), - )) ?> +
    - -
    + + $swimlane): ?> + + + + 0 && $swimlane['nb_swimlanes'] > 1): ?> + render('board/table_swimlane', array( + 'project' => $project, + 'swimlane' => $swimlane, + 'not_editable' => isset($not_editable), + )) ?> + + + render('board/table_column', array( + 'swimlane' => $swimlane, + 'not_editable' => isset($not_editable), + )) ?> + + 1): ?> + render('board/table_swimlane', array( + 'project' => $project, + 'swimlane' => $swimlane, + 'not_editable' => isset($not_editable), + )) ?> + + + render('board/table_tasks', array( + 'project' => $project, + 'swimlane' => $swimlane, + 'not_editable' => isset($not_editable), + 'board_highlight_period' => $board_highlight_period, + )) ?> + + + + + + + \ No newline at end of file diff --git a/sources/app/Template/board/table_swimlane.php b/sources/app/Template/board/table_swimlane.php index be40163..dd38fc9 100644 --- a/sources/app/Template/board/table_swimlane.php +++ b/sources/app/Template/board/table_swimlane.php @@ -1,94 +1,26 @@ + - - - - - - - - - e($swimlane['name']) ?> - - - + + + + + + + - - - -
    - - + e($swimlane['name']) ?> + + + + -
    -
    - -
    - url->link('+', 'taskcreation', 'create', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']), false, 'popover', t('Add a new task')) ?> -
    - + - - e($column['title']) ?> - - - - '> - - - - - - -   - - - - - - (/e($column['task_limit']) ?>) - - - - () - - -
    + + () + - - - - - - - e($swimlane['name']) ?> - -
    - () -
    - - - - - - -
    - - render($not_editable ? 'board/task_public' : 'board/task_private', array( - 'project' => $project, - 'task' => $task, - 'board_highlight_period' => $board_highlight_period, - 'not_editable' => $not_editable, - )) ?> - -
    -
    -
    -
    - e($column['title']) ?> -
    -
    -
    - - - \ No newline at end of file diff --git a/sources/app/Template/board/table_tasks.php b/sources/app/Template/board/table_tasks.php new file mode 100644 index 0000000..f10d48e --- /dev/null +++ b/sources/app/Template/board/table_tasks.php @@ -0,0 +1,31 @@ + + + + + + +
    + + render($not_editable ? 'board/task_public' : 'board/task_private', array( + 'project' => $project, + 'task' => $task, + 'board_highlight_period' => $board_highlight_period, + 'not_editable' => $not_editable, + )) ?> + +
    + + +
    +
    +
    + e($column['title']) ?> +
    +
    +
    + + + diff --git a/sources/app/Template/board/task_menu.php b/sources/app/Template/board/task_menu.php index 7cda510..3eb3570 100644 --- a/sources/app/Template/board/task_menu.php +++ b/sources/app/Template/board/task_menu.php @@ -1,13 +1,17 @@ \ No newline at end of file diff --git a/sources/app/Template/board/task_private.php b/sources/app/Template/board/task_private.php index a6c8a9e..da993fd 100644 --- a/sources/app/Template/board/task_private.php +++ b/sources/app/Template/board/task_private.php @@ -9,10 +9,11 @@ data-task-url="url->href('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"> - render('board/task_menu', array('task' => $task)) ?> - board->isCollapsed($project['id'])): ?> + board->isCollapsed($task['project_id'])): ?>
    + render('board/task_menu', array('task' => $task)) ?> + e($this->user->getInitials($task['assignee_name'] ?: $task['assignee_username'])) ?> @@ -22,6 +23,7 @@
    + render('board/task_menu', array('task' => $task)) ?> @@ -29,9 +31,10 @@ + url->link( - (! empty($task['owner_id']) ? ($task['assignee_name'] ?: $task['assignee_username']) : t('Nobody assigned')), + $task['assignee_name'] ?: $task['assignee_username'], 'board', 'changeAssignee', array('task_id' => $task['id'], 'project_id' => $task['project_id']), @@ -40,6 +43,7 @@ t('Change assignee') ) ?> +
    diff --git a/sources/app/Template/board/tooltip_tasklinks.php b/sources/app/Template/board/tooltip_tasklinks.php index 25aa91a..5991fec 100644 --- a/sources/app/Template/board/tooltip_tasklinks.php +++ b/sources/app/Template/board/tooltip_tasklinks.php @@ -3,6 +3,7 @@
  • + [] url->link( $this->e('#'.$link['task_id'].' - '.$link['title']), 'task', 'show', array('task_id' => $link['task_id'], 'project_id' => $link['project_id']), diff --git a/sources/app/Template/board/private_view.php b/sources/app/Template/board/view_private.php similarity index 90% rename from sources/app/Template/board/private_view.php rename to sources/app/Template/board/view_private.php index d4c2c65..63d261f 100644 --- a/sources/app/Template/board/private_view.php +++ b/sources/app/Template/board/view_private.php @@ -5,6 +5,7 @@ 'filters' => $filters, 'categories_list' => $categories_list, 'users_list' => $users_list, + 'custom_filters_list' => $custom_filters_list, 'is_board' => true, )) ?> diff --git a/sources/app/Template/board/public_view.php b/sources/app/Template/board/view_public.php similarity index 100% rename from sources/app/Template/board/public_view.php rename to sources/app/Template/board/view_public.php diff --git a/sources/app/Template/budget/breakdown.php b/sources/app/Template/budget/breakdown.php deleted file mode 100644 index 9256118..0000000 --- a/sources/app/Template/budget/breakdown.php +++ /dev/null @@ -1,30 +0,0 @@ - - -isEmpty()): ?> -

    - - - - - - - - - - - getCollection() as $record): ?> - - - - - - - - - -
    order(t('Task'), 'task_title') ?>order(t('Subtask'), 'subtask_title') ?>order(t('User'), 'username') ?>order(t('Time spent'), \Model\SubtaskTimeTracking::TABLE.'.time_spent') ?>order(t('Date'), 'start') ?>
    url->link($this->e($record['task_title']), 'task', 'show', array('project_id' => $project['id'], 'task_id' => $record['task_id'])) ?>url->link($this->e($record['subtask_title']), 'task', 'show', array('project_id' => $project['id'], 'task_id' => $record['task_id'])) ?>url->link($this->e($record['name'] ?: $record['username']), 'user', 'show', array('user_id' => $record['user_id'])) ?>
    - - - \ No newline at end of file diff --git a/sources/app/Template/budget/create.php b/sources/app/Template/budget/create.php deleted file mode 100644 index a563796..0000000 --- a/sources/app/Template/budget/create.php +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - -
    e($line['comment']) ?> - url->link(t('Remove'), 'budget', 'confirm', array('project_id' => $project['id'], 'budget_id' => $line['id'])) ?> -
    - -

    - - -
    - - form->csrf() ?> - - form->hidden('id', $values) ?> - form->hidden('project_id', $values) ?> - - form->label(t('Amount'), 'amount') ?> - form->text('amount', $values, $errors, array('required'), 'form-numeric') ?> - - form->label(t('Date'), 'date') ?> - form->text('date', $values, $errors, array('required'), 'form-date') ?> - - form->label(t('Comment'), 'comment') ?> - form->text('comment', $values, $errors) ?> - -
    - -
    -
    \ No newline at end of file diff --git a/sources/app/Template/budget/index.php b/sources/app/Template/budget/index.php deleted file mode 100644 index 51ef3d8..0000000 --- a/sources/app/Template/budget/index.php +++ /dev/null @@ -1,34 +0,0 @@ - - - -
    -
    t('Budget line'), 'out' => t('Expenses'), 'left' => t('Remaining'), 'value' => t('Amount'), 'date' => t('Date'), 'type' => t('Type')), JSON_HEX_APOS) ?>'>
    -
    -
    - - - - - - - - - - - -
    - - - -
    - -

    - - -asset->js('assets/js/vendor/d3.v3.min.js') ?> -asset->js('assets/js/vendor/c3.min.js') ?> \ No newline at end of file diff --git a/sources/app/Template/budget/remove.php b/sources/app/Template/budget/remove.php deleted file mode 100644 index a5b906a..0000000 --- a/sources/app/Template/budget/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'budget', 'remove', array('project_id' => $project['id'], 'budget_id' => $budget_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'budget', 'create', array('project_id' => $project['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/budget/sidebar.php b/sources/app/Template/budget/sidebar.php deleted file mode 100644 index 8477c05..0000000 --- a/sources/app/Template/budget/sidebar.php +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/sources/app/Template/config/calendar.php b/sources/app/Template/config/calendar.php index 1cc985c..f525013 100644 --- a/sources/app/Template/config/calendar.php +++ b/sources/app/Template/config/calendar.php @@ -6,24 +6,25 @@ form->csrf() ?> -

    +

    form->radios('calendar_project_tasks', array( 'date_creation' => t('Show tasks based on the creation date'), 'date_started' => t('Show tasks based on the start date'), ), $values) ?>
    -

    +

    form->radios('calendar_user_tasks', array( 'date_creation' => t('Show tasks based on the creation date'), 'date_started' => t('Show tasks based on the start date'), ), $values) ?> +
    -

    +
    +

    form->checkbox('calendar_user_subtasks_time_tracking', t('Show subtasks based on the time tracking'), 1, $values['calendar_user_subtasks_time_tracking'] == 1) ?> - form->checkbox('calendar_user_subtasks_forecast', t('Show subtask estimates (forecast of future work)'), 1, $values['calendar_user_subtasks_forecast'] == 1) ?>
    diff --git a/sources/app/Template/config/plugins.php b/sources/app/Template/config/plugins.php new file mode 100644 index 0000000..fea48d5 --- /dev/null +++ b/sources/app/Template/config/plugins.php @@ -0,0 +1,30 @@ + + + +

    + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sources/app/Template/config/sidebar.php b/sources/app/Template/config/sidebar.php index 3617979..4195cde 100644 --- a/sources/app/Template/config/sidebar.php +++ b/sources/app/Template/config/sidebar.php @@ -4,6 +4,9 @@
  • app->getRouterAction() === 'index' ? 'class="active"' : '' ?>> url->link(t('About'), 'config', 'index') ?>
  • +
  • app->getRouterAction() === 'plugins' ? 'class="active"' : '' ?>> + url->link(t('Plugins'), 'config', 'plugins') ?> +
  • app->getRouterAction() === 'application' ? 'class="active"' : '' ?>> url->link(t('Application settings'), 'config', 'application') ?>
  • @@ -34,6 +37,7 @@
  • url->link(t('Documentation'), 'doc', 'show') ?>
  • + hook->render('template:config:sidebar') ?> diff --git a/sources/app/Template/currency/index.php b/sources/app/Template/currency/index.php index f72c570..1c78c47 100644 --- a/sources/app/Template/currency/index.php +++ b/sources/app/Template/currency/index.php @@ -52,5 +52,3 @@ - -

    diff --git a/sources/app/Template/custom_filter/add.php b/sources/app/Template/custom_filter/add.php new file mode 100644 index 0000000..d4e102b --- /dev/null +++ b/sources/app/Template/custom_filter/add.php @@ -0,0 +1,22 @@ + + + + form->csrf() ?> + form->hidden('project_id', $values) ?> + + form->label(t('Name'), 'name') ?> + form->text('name', $values, $errors, array('required', 'maxlength="100"')) ?> + + form->label(t('Filter'), 'filter') ?> + form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> + + user->isProjectManagementAllowed($project['id'])): ?> + form->checkbox('is_shared', t('Share with all project members'), 1) ?> + + +
    + +
    + \ No newline at end of file diff --git a/sources/app/Template/custom_filter/edit.php b/sources/app/Template/custom_filter/edit.php new file mode 100644 index 0000000..7525574 --- /dev/null +++ b/sources/app/Template/custom_filter/edit.php @@ -0,0 +1,30 @@ + + + + + form->csrf() ?> + + form->hidden('id', $values) ?> + form->hidden('user_id', $values) ?> + form->hidden('project_id', $values) ?> + + form->label(t('Name'), 'name') ?> + form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="100"')) ?> + + form->label(t('Filter'), 'filter') ?> + form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> + + user->isProjectManagementAllowed($project['id'])): ?> + form->checkbox('is_shared', t('Share with all project members'), 1, $values['is_shared'] == 1) ?> + + form->hidden('is_shared', $values) ?> + + +
    + + + url->link(t('cancel'), 'customfilter', 'index', array('project_id' => $project['id'])) ?> +
    + \ No newline at end of file diff --git a/sources/app/Template/custom_filter/index.php b/sources/app/Template/custom_filter/index.php new file mode 100644 index 0000000..a53d0d0 --- /dev/null +++ b/sources/app/Template/custom_filter/index.php @@ -0,0 +1,40 @@ + + +
    +
    + getPluginHomepage()): ?> + e($plugin->getPluginName()) ?> + + e($plugin->getPluginName()) ?> + + e($plugin->getPluginAuthor()) ?>e($plugin->getPluginVersion()) ?>e($plugin->getPluginDescription()) ?>
    + + + + + + + + + + + + + + + + +
    e($filter['name']) ?>e($filter['filter']) ?> + + + + + + e($filter['owner_name'] ?: $filter['owner_username']) ?> + user->getId() || $this->user->isProjectManagementAllowed($project['id'])): ?> +
      +
    • url->link(t('Remove'), 'customfilter', 'remove', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id']), true) ?>
    • +
    • url->link(t('Edit'), 'customfilter', 'edit', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?>
    • +
    + +
    +
    + + +render('custom_filter/add', array('project' => $project, 'values' => $values, 'errors' => $errors)) ?> \ No newline at end of file diff --git a/sources/app/Template/export/sidebar.php b/sources/app/Template/export/sidebar.php index f204d29..4444852 100644 --- a/sources/app/Template/export/sidebar.php +++ b/sources/app/Template/export/sidebar.php @@ -13,6 +13,7 @@
  • app->getRouterAction() === 'summary' ? 'class="active"' : '' ?>> url->link(t('Daily project summary'), 'export', 'summary', array('project_id' => $project['id'])) ?>
  • + hook->render('template:export:sidebar') ?> diff --git a/sources/app/Template/file/show.php b/sources/app/Template/file/show.php index b1a0a81..a390c9f 100644 --- a/sources/app/Template/file/show.php +++ b/sources/app/Template/file/show.php @@ -11,7 +11,7 @@
  • - <?= $this->e($file['name']) ?> + <?= $this->e($file['name']) ?>

    diff --git a/sources/app/Template/gantt/task_creation.php b/sources/app/Template/gantt/task_creation.php index d0d14c1..7997e23 100644 --- a/sources/app/Template/gantt/task_creation.php +++ b/sources/app/Template/gantt/task_creation.php @@ -12,7 +12,6 @@ form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="200"', 'tabindex="1"'), 'form-input-large') ?> form->label(t('Description'), 'description') ?> -

    form->textarea('description', $values, $errors, array('placeholder="'.t('Leave a description').'"', 'tabindex="2"')) ?> @@ -29,6 +28,8 @@
  • + + render('task/color_picker', array('colors_list' => $colors_list, 'values' => $values)) ?>
    @@ -43,17 +44,14 @@ form->select('swimlane_id', $swimlanes_list, $values, $errors, array('tabindex="5"')) ?>
    - form->label(t('Color'), 'color_id') ?> - form->select('color_id', $colors_list, $values, $errors, array('tabindex="7"')) ?>
    - form->label(t('Complexity'), 'score') ?> - form->number('score', $values, $errors, array('tabindex="8"')) ?>
    + form->number('score', $values, $errors, array('tabindex="6"')) ?>
    form->label(t('Start Date'), 'date_started') ?> - form->text('date_started', $values, $errors, array('placeholder="'.$this->text->in($date_format, $date_formats).'"', 'tabindex="9"'), 'form-date') ?> + form->text('date_started', $values, $errors, array('placeholder="'.$this->text->in($date_format, $date_formats).'"', 'tabindex="7"'), 'form-date') ?> form->label(t('Due Date'), 'date_due') ?> - form->text('date_due', $values, $errors, array('placeholder="'.$this->text->in($date_format, $date_formats).'"', 'tabindex="10"'), 'form-date') ?>
    + form->text('date_due', $values, $errors, array('placeholder="'.$this->text->in($date_format, $date_formats).'"', 'tabindex="8"'), 'form-date') ?>
    diff --git a/sources/app/Template/header.php b/sources/app/Template/header.php new file mode 100644 index 0000000..19ffbbf --- /dev/null +++ b/sources/app/Template/header.php @@ -0,0 +1,37 @@ +
    + +
    \ No newline at end of file diff --git a/sources/app/Template/hourlyrate/index.php b/sources/app/Template/hourlyrate/index.php deleted file mode 100644 index af305d0..0000000 --- a/sources/app/Template/hourlyrate/index.php +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
    - url->link(t('Remove'), 'hourlyrate', 'confirm', array('user_id' => $user['id'], 'rate_id' => $rate['id'])) ?> -
    - -

    - - -
    - - form->hidden('user_id', $values) ?> - form->csrf() ?> - - form->label(t('Hourly rate'), 'rate') ?> - form->text('rate', $values, $errors, array('required'), 'form-numeric') ?> - - form->label(t('Currency'), 'currency') ?> - form->select('currency', $currencies_list, $values, $errors, array('required')) ?> - - form->label(t('Effective date'), 'date_effective') ?> - form->text('date_effective', $values, $errors, array('required'), 'form-date') ?> - -
    - -
    -
    diff --git a/sources/app/Template/hourlyrate/remove.php b/sources/app/Template/hourlyrate/remove.php deleted file mode 100644 index 121436e..0000000 --- a/sources/app/Template/hourlyrate/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'hourlyrate', 'remove', array('user_id' => $user['id'], 'rate_id' => $rate_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'hourlyrate', 'index', array('user_id' => $user['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/layout.php b/sources/app/Template/layout.php index 3e883fb..2058295 100644 --- a/sources/app/Template/layout.php +++ b/sources/app/Template/layout.php @@ -21,6 +21,9 @@ asset->css('assets/css/print.css', true, 'print') ?> asset->customCss() ?> + hook->asset('css', 'template:layout:css') ?> + hook->asset('js', 'template:layout:js') ?> + @@ -28,52 +31,29 @@ <?= isset($title) ? $this->e($title) : 'Kanboard' ?> + + hook->render('template:layout:head') ?> -
    - -
    + hook->render('template:layout:top') ?> + render('header', array( + 'title' => $title, + 'description' => isset($description) ? $description : '', + 'board_selector' => isset($board_selector) ? $board_selector : array(), + )) ?>
    app->flashMessage() ?>
    + hook->render('template:layout:bottom') ?> diff --git a/sources/app/Template/project/dropdown.php b/sources/app/Template/project/dropdown.php index 0a53cc0..1eb87b0 100644 --- a/sources/app/Template/project/dropdown.php +++ b/sources/app/Template/project/dropdown.php @@ -1,29 +1,31 @@
  • - +   url->link(t('Activity'), 'activity', 'project', array('project_id' => $project['id'])) ?>
  • +
  • +   + url->link(t('Custom filters'), 'customfilter', 'index', array('project_id' => $project['id'])) ?> +
  • - url->link(t('Public link'), 'board', 'readonly', array('token' => $project['token']), false, '', '', true) ?> +  url->link(t('Public link'), 'board', 'readonly', array('token' => $project['token']), false, '', '', true) ?>
  • +hook->render('template:project:dropdown', array('project' => $project)) ?> + user->isProjectManagementAllowed($project['id'])): ?> -
  • - - url->link(t('Analytics'), 'analytic', 'tasks', array('project_id' => $project['id'])) ?> -
  • -
  • - - url->link(t('Budget'), 'budget', 'index', array('project_id' => $project['id'])) ?> -
  • -
  • - - url->link(t('Exports'), 'export', 'tasks', array('project_id' => $project['id'])) ?> -
  • -
  • - - url->link(t('Settings'), 'project', 'show', array('project_id' => $project['id'])) ?> -
  • +
  • +   + url->link(t('Analytics'), 'analytic', 'tasks', array('project_id' => $project['id'])) ?> +
  • +
  • +   + url->link(t('Exports'), 'export', 'tasks', array('project_id' => $project['id'])) ?> +
  • +
  • +   + url->link(t('Settings'), 'project', 'show', array('project_id' => $project['id'])) ?> +
  • diff --git a/sources/app/Template/project/filters.php b/sources/app/Template/project/filters.php index fa50b36..c22d7b4 100644 --- a/sources/app/Template/project/filters.php +++ b/sources/app/Template/project/filters.php @@ -21,6 +21,14 @@ "> +
  • + + + + +
  • render('project/dropdown', array('project' => $project)) ?> @@ -55,14 +63,24 @@
    render('app/filters_helper', array('reset' => 'status:open')) ?> + + + + @@ -72,10 +90,9 @@ diff --git a/sources/app/Template/project/index.php b/sources/app/Template/project/index.php index 5ca6e6b..4b62a27 100644 --- a/sources/app/Template/project/index.php +++ b/sources/app/Template/project/index.php @@ -11,91 +11,89 @@
    -
    - isEmpty()): ?> -

    - - - - - - - - - user->isAdmin() || $this->user->isProjectAdmin()): ?> - - + isEmpty()): ?> +

    + +
    order(t('Id'), 'id') ?>order(t('Status'), 'is_active') ?>order(t('Project'), 'name') ?>order(t('Start date'), 'start_date') ?>order(t('End date'), 'end_date') ?>
    + + + + + + + user->isAdmin() || $this->user->isProjectAdmin()): ?> + + + + + + getCollection() as $project): ?> + + + - - getCollection() as $project): ?> - - - - + - - - user->isAdmin() || $this->user->isProjectAdmin()): ?> - + + + user->isAdmin() || $this->user->isProjectAdmin()): ?> + + - - - - -
    order(t('Id'), 'id') ?>order(t('Status'), 'is_active') ?>order(t('Project'), 'name') ?>order(t('Start date'), 'start_date') ?>order(t('End date'), 'end_date') ?>
    + url->link('#'.$project['id'], 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link') ?> + + + + + -
    - url->link('#'.$project['id'], 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link') ?> - - - - - - - - url->link('', 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Board')) ?> - url->link('', 'gantt', 'project', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Gantt chart')) ?> + + url->link('', 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Board')) ?> + url->link('', 'gantt', 'project', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Gantt chart')) ?> - - - - - - + + + + + + - - '> - - - + + '> + + + - url->link($this->e($project['name']), 'project', 'show', array('project_id' => $project['id'])) ?> - - - - - + url->link($this->e($project['name']), 'project', 'show', array('project_id' => $project['id'])) ?> + + + + + +
      + $user_name): ?> +
    • url->link($this->e($user_name), 'projectuser', 'opens', array('user_id' => $user_id)) ?>
    • + +
    +
    + + +
      - $user_name): ?> + $user_name): ?>
    • url->link($this->e($user_name), 'projectuser', 'opens', array('user_id' => $user_id)) ?>
    -
    - - - -
      - $user_name): ?> -
    • url->link($this->e($user_name), 'projectuser', 'opens', array('user_id' => $user_id)) ?>
    • - -
    - -
    - - - e($column['title']) ?> - -
    + + + + + + e($column['title']) ?> + + + + + - - -
    + + diff --git a/sources/app/Template/project/sidebar.php b/sources/app/Template/project/sidebar.php index 7b5d976..d8b35e3 100644 --- a/sources/app/Template/project/sidebar.php +++ b/sources/app/Template/project/sidebar.php @@ -4,6 +4,9 @@
  • app->getRouterAction() === 'show' ? 'class="active"' : '' ?>> url->link(t('Summary'), 'project', 'show', array('project_id' => $project['id'])) ?>
  • +
  • app->getRouterController() === 'customfilter' && $this->app->getRouterAction() === 'index' ? 'class="active"' : '' ?>> + url->link(t('Custom filters'), 'customfilter', 'index', array('project_id' => $project['id'])) ?> +
  • user->isProjectManagementAllowed($project['id'])): ?>
  • app->getRouterController() === 'project' && $this->app->getRouterAction() === 'share' ? 'class="active"' : '' ?>> @@ -48,6 +51,8 @@
  • + + hook->render('template:project:sidebar') ?> diff --git a/sources/app/Template/project_user/sidebar.php b/sources/app/Template/project_user/sidebar.php index 8cc3f41..b81ba14 100644 --- a/sources/app/Template/project_user/sidebar.php +++ b/sources/app/Template/project_user/sidebar.php @@ -24,5 +24,7 @@
  • app->getRouterAction() === 'closed' ? 'class="active"' : '' ?>> url->link(t('Closed tasks'), 'projectuser', 'closed', $filter) ?>
  • + + hook->render('template:project-user:sidebar') ?> \ No newline at end of file diff --git a/sources/app/Template/swimlane/edit.php b/sources/app/Template/swimlane/edit.php index 1788fed..dfc5cf0 100644 --- a/sources/app/Template/swimlane/edit.php +++ b/sources/app/Template/swimlane/edit.php @@ -12,6 +12,27 @@ form->label(t('Name'), 'name') ?> form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> + form->label(t('Description'), 'description') ?> + +
    + +
    + form->textarea('description', $values, $errors) ?> +
    +
    +
    +
    + +
    +
    url->doc(t('Write your text in Markdown'), 'syntax-guide') ?>
    +
    diff --git a/sources/app/Template/swimlane/index.php b/sources/app/Template/swimlane/index.php index daee6af..95b462d 100644 --- a/sources/app/Template/swimlane/index.php +++ b/sources/app/Template/swimlane/index.php @@ -14,7 +14,27 @@ form->hidden('project_id', $values) ?> form->label(t('Name'), 'name') ?> - form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?> + form->text('name', $values, $errors, array('required', 'maxlength="50"')) ?> + + form->label(t('Description'), 'description') ?> + +
    +
    + form->textarea('description', $values, $errors) ?> +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    url->doc(t('Write your text in Markdown'), 'syntax-guide') ?>
    @@ -30,9 +50,11 @@ form->hidden('id', $default_swimlane) ?> form->label(t('Rename'), 'default_swimlane') ?> - form->text('default_swimlane', $default_swimlane, array(), array('autofocus', 'required', 'maxlength="50"')) ?>
    + form->text('default_swimlane', $default_swimlane, array(), array('required', 'maxlength="50"')) ?>
    - form->checkbox('show_default_swimlane', t('Show default swimlane'), 1, isset($default_swimlane['show_default_swimlane']) && $default_swimlane['show_default_swimlane'] == 1) ?> + + form->checkbox('show_default_swimlane', t('Show default swimlane'), 1, isset($default_swimlane['show_default_swimlane']) && $default_swimlane['show_default_swimlane'] == 1) ?> +
    diff --git a/sources/app/Template/swimlane/table.php b/sources/app/Template/swimlane/table.php index f38572a..b708e63 100644 --- a/sources/app/Template/swimlane/table.php +++ b/sources/app/Template/swimlane/table.php @@ -25,7 +25,7 @@
  • - url->link(t('Rename'), 'swimlane', 'edit', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id'])) ?> + url->link(t('Edit'), 'swimlane', 'edit', array('project_id' => $project['id'], 'swimlane_id' => $swimlane['id'])) ?>
  • diff --git a/sources/app/Template/task/color_picker.php b/sources/app/Template/task/color_picker.php new file mode 100644 index 0000000..a849b9c --- /dev/null +++ b/sources/app/Template/task/color_picker.php @@ -0,0 +1,11 @@ +
    + $color_name): ?> +
    +
    + +
    + +form->hidden('color_id', $values) ?> \ No newline at end of file diff --git a/sources/app/Template/task/sidebar.php b/sources/app/Template/task/sidebar.php index 1f06ab8..9ee1e7d 100644 --- a/sources/app/Template/task/sidebar.php +++ b/sources/app/Template/task/sidebar.php @@ -18,6 +18,8 @@ url->link(t('Time tracking'), 'task', 'timetracking', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
  • + + hook->render('template:task:sidebar:information') ?>

      @@ -66,6 +68,8 @@ url->link(t('Remove'), 'task', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + + hook->render('template:task:sidebar:actions') ?>
    diff --git a/sources/app/Template/task_creation/form.php b/sources/app/Template/task_creation/form.php index 8a29896..325ca1c 100644 --- a/sources/app/Template/task_creation/form.php +++ b/sources/app/Template/task_creation/form.php @@ -10,8 +10,7 @@
    -
    -
    + form->csrf() ?> @@ -38,7 +37,7 @@
    -
    url->doc(t('Write your text in Markdown'), 'syntax-guide') ?>
    + render('task/color_picker', array('colors_list' => $colors_list, 'values' => $values)) ?> form->checkbox('another_task', t('Create another task'), 1, isset($values['another_task']) && $values['another_task'] == 1) ?> @@ -62,9 +61,6 @@ form->label(t('Column'), 'column_id') ?> form->select('column_id', $columns_list, $values, $errors, array('tabindex="6"')) ?>
    - form->label(t('Color'), 'color_id') ?> - form->select('color_id', $colors_list, $values, $errors, array('tabindex="7"')) ?>
    - form->label(t('Complexity'), 'score') ?> form->number('score', $values, $errors, array('tabindex="8"')) ?>
    @@ -80,5 +76,4 @@ url->link(t('cancel'), 'board', 'show', array('project_id' => $values['project_id']), false, 'close-popover') ?>
    - - + \ No newline at end of file diff --git a/sources/app/Template/task_modification/edit_task.php b/sources/app/Template/task_modification/edit_task.php index fe4696d..f4d7449 100644 --- a/sources/app/Template/task_modification/edit_task.php +++ b/sources/app/Template/task_modification/edit_task.php @@ -1,8 +1,7 @@ -
    -
    + form->csrf() ?> @@ -12,7 +11,6 @@ form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="200"', 'tabindex="1"')) ?>
    form->label(t('Description'), 'description') ?> -
    form->textarea('description', $values, $errors, array('placeholder="'.t('Leave a description').'"', 'tabindex="2"')) ?> @@ -30,6 +28,7 @@
    + render('task/color_picker', array('colors_list' => $colors_list, 'values' => $values)) ?>
    @@ -42,9 +41,6 @@ form->label(t('Category'), 'category_id') ?> form->select('category_id', $categories_list, $values, $errors, array('tabindex="4"')) ?>
    - form->label(t('Color'), 'color_id') ?> - form->select('color_id', $colors_list, $values, $errors, array('tabindex="5"')) ?>
    - form->label(t('Complexity'), 'score') ?> form->number('score', $values, $errors, array('tabindex="6"')) ?>
    @@ -62,5 +58,4 @@ url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
    -
    -
    + \ No newline at end of file diff --git a/sources/app/Template/task_status/close.php b/sources/app/Template/task_status/close.php index 4de3dcb..d32863b 100644 --- a/sources/app/Template/task_status/close.php +++ b/sources/app/Template/task_status/close.php @@ -4,7 +4,7 @@

    - e($task['title'])) ?> +

    diff --git a/sources/app/Template/task_status/open.php b/sources/app/Template/task_status/open.php index 0043fda..615b246 100644 --- a/sources/app/Template/task_status/open.php +++ b/sources/app/Template/task_status/open.php @@ -4,12 +4,12 @@

    - e($task['title'])) ?> +

    - url->link(t('Yes'), 'taskstatus', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes'), true, 'btn btn-red') ?> + url->link(t('Yes'), 'taskstatus', 'open', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'confirmation' => 'yes', 'redirect' => $redirect), true, 'btn btn-red') ?> - url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?>
    \ No newline at end of file diff --git a/sources/app/Template/tasklink/show.php b/sources/app/Template/tasklink/show.php index 7125b11..97a3a76 100644 --- a/sources/app/Template/tasklink/show.php +++ b/sources/app/Template/tasklink/show.php @@ -6,6 +6,7 @@ + @@ -52,6 +53,7 @@ e($link['task_time_estimated']).'h' ?> + e($link['project_name']) ?> e($link['column_title']) ?> diff --git a/sources/app/Template/timetable/index.php b/sources/app/Template/timetable/index.php deleted file mode 100644 index 7a63a2e..0000000 --- a/sources/app/Template/timetable/index.php +++ /dev/null @@ -1,44 +0,0 @@ - - -
    - - form->hidden('controller', $values) ?> - form->hidden('action', $values) ?> - form->hidden('user_id', $values) ?> - - form->label(t('From'), 'from') ?> - form->text('from', $values, array(), array(), 'form-date') ?> - - form->label(t('To'), 'to') ?> - form->text('to', $values, array(), array(), 'form-date') ?> - - -
    - - -
    -

    - - - - - - - - - - - - - -
    getTimestamp()) ?>getTimestamp()) ?>getTimestamp()) ?>
    - - \ No newline at end of file diff --git a/sources/app/Template/timetable_day/index.php b/sources/app/Template/timetable_day/index.php deleted file mode 100644 index 386ceec..0000000 --- a/sources/app/Template/timetable_day/index.php +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - -
    - url->link(t('Remove'), 'timetableday', 'confirm', array('user_id' => $user['id'], 'slot_id' => $slot['id'])) ?> -
    - -

    - - -
    - - form->hidden('user_id', $values) ?> - form->csrf() ?> - - form->label(t('Start time'), 'start') ?> - form->select('start', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('End time'), 'end') ?> - form->select('end', $this->dt->getDayHours(), $values, $errors) ?> - -
    - -
    -
    - -

    - -

    \ No newline at end of file diff --git a/sources/app/Template/timetable_day/remove.php b/sources/app/Template/timetable_day/remove.php deleted file mode 100644 index 1b33b26..0000000 --- a/sources/app/Template/timetable_day/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'timetableday', 'remove', array('user_id' => $user['id'], 'slot_id' => $slot_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'timetableday', 'index', array('user_id' => $user['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_extra/index.php b/sources/app/Template/timetable_extra/index.php deleted file mode 100644 index e998233..0000000 --- a/sources/app/Template/timetable_extra/index.php +++ /dev/null @@ -1,56 +0,0 @@ - - -isEmpty()): ?> - - - - - - - - - - - getCollection() as $slot): ?> - - - - - - - - - -
    order(t('Day'), 'Day') ?>order(t('All day'), 'all_day') ?>order(t('Start time'), 'start') ?>order(t('End time'), 'end') ?>
    e($slot['comment']) ?> - url->link(t('Remove'), 'timetableextra', 'confirm', array('user_id' => $user['id'], 'slot_id' => $slot['id'])) ?> -
    - - - - - -
    - - form->hidden('user_id', $values) ?> - form->csrf() ?> - - form->label(t('Day'), 'date') ?> - form->text('date', $values, $errors, array('required'), 'form-date') ?> - - form->checkbox('all_day', t('All day'), 1) ?> - - form->label(t('Start time'), 'start') ?> - form->select('start', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('End time'), 'end') ?> - form->select('end', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('Comment'), 'comment') ?> - form->text('comment', $values, $errors) ?> - -
    - -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_extra/remove.php b/sources/app/Template/timetable_extra/remove.php deleted file mode 100644 index fc90743..0000000 --- a/sources/app/Template/timetable_extra/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'timetableextra', 'remove', array('user_id' => $user['id'], 'slot_id' => $slot_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'timetableextra', 'index', array('user_id' => $user['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_off/index.php b/sources/app/Template/timetable_off/index.php deleted file mode 100644 index 615c2b8..0000000 --- a/sources/app/Template/timetable_off/index.php +++ /dev/null @@ -1,56 +0,0 @@ - - -isEmpty()): ?> - - - - - - - - - - - getCollection() as $slot): ?> - - - - - - - - - -
    order(t('Day'), 'Day') ?>order(t('All day'), 'all_day') ?>order(t('Start time'), 'start') ?>order(t('End time'), 'end') ?>
    e($slot['comment']) ?> - url->link(t('Remove'), 'timetableoff', 'confirm', array('user_id' => $user['id'], 'slot_id' => $slot['id'])) ?> -
    - - - - - -
    - - form->hidden('user_id', $values) ?> - form->csrf() ?> - - form->label(t('Day'), 'date') ?> - form->text('date', $values, $errors, array('required'), 'form-date') ?> - - form->checkbox('all_day', t('All day'), 1) ?> - - form->label(t('Start time'), 'start') ?> - form->select('start', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('End time'), 'end') ?> - form->select('end', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('Comment'), 'comment') ?> - form->text('comment', $values, $errors) ?> - -
    - -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_off/remove.php b/sources/app/Template/timetable_off/remove.php deleted file mode 100644 index 621e191..0000000 --- a/sources/app/Template/timetable_off/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'timetableoff', 'remove', array('user_id' => $user['id'], 'slot_id' => $slot_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'timetableoff', 'index', array('user_id' => $user['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_week/index.php b/sources/app/Template/timetable_week/index.php deleted file mode 100644 index d58c6cf..0000000 --- a/sources/app/Template/timetable_week/index.php +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
    dt->getWeekDay($slot['day']) ?> - url->link(t('Remove'), 'timetableweek', 'confirm', array('user_id' => $user['id'], 'slot_id' => $slot['id'])) ?> -
    - -

    - - -
    - - form->hidden('user_id', $values) ?> - form->csrf() ?> - - form->label(t('Day'), 'day') ?> - form->select('day', $this->dt->getWeekDays(), $values, $errors) ?> - - form->label(t('Start time'), 'start') ?> - form->select('start', $this->dt->getDayHours(), $values, $errors) ?> - - form->label(t('End time'), 'end') ?> - form->select('end', $this->dt->getDayHours(), $values, $errors) ?> - -
    - -
    -
    \ No newline at end of file diff --git a/sources/app/Template/timetable_week/remove.php b/sources/app/Template/timetable_week/remove.php deleted file mode 100644 index f5a1019..0000000 --- a/sources/app/Template/timetable_week/remove.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -

    - -
    - url->link(t('Yes'), 'timetableweek', 'remove', array('user_id' => $user['id'], 'slot_id' => $slot_id), true, 'btn btn-red') ?> - - url->link(t('cancel'), 'timetableweek', 'index', array('user_id' => $user['id'])) ?> -
    -
    \ No newline at end of file diff --git a/sources/app/Template/user/create_local.php b/sources/app/Template/user/create_local.php index 3c8b43b..98c38f0 100644 --- a/sources/app/Template/user/create_local.php +++ b/sources/app/Template/user/create_local.php @@ -37,7 +37,7 @@ form->label(t('Language'), 'language') ?> form->select('language', $languages, $values, $errors) ?>
    - form->checkbox('notifications_enabled', t('Enable notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> + form->checkbox('notifications_enabled', t('Enable email notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> form->checkbox('is_admin', t('Administrator'), 1, isset($values['is_admin']) && $values['is_admin'] == 1 ? true : false) ?> form->checkbox('is_project_admin', t('Project Administrator'), 1, isset($values['is_project_admin']) && $values['is_project_admin'] == 1 ? true : false) ?>
    diff --git a/sources/app/Template/user/create_remote.php b/sources/app/Template/user/create_remote.php index 1d04bc8..49d1548 100644 --- a/sources/app/Template/user/create_remote.php +++ b/sources/app/Template/user/create_remote.php @@ -21,13 +21,13 @@ form->email('email', $values, $errors) ?>
    form->label(t('Google Id'), 'google_id') ?> - form->password('google_id', $values, $errors) ?>
    + form->text('google_id', $values, $errors) ?>
    form->label(t('Github Id'), 'github_id') ?> - form->password('github_id', $values, $errors) ?>
    + form->text('github_id', $values, $errors) ?>
    form->label(t('Gitlab Id'), 'gitlab_id') ?> - form->password('gitlab_id', $values, $errors) ?>
    + form->text('gitlab_id', $values, $errors) ?>
    @@ -40,7 +40,7 @@ form->label(t('Language'), 'language') ?> form->select('language', $languages, $values, $errors) ?>
    - form->checkbox('notifications_enabled', t('Enable notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> + form->checkbox('notifications_enabled', t('Enable email notifications'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1 ? true : false) ?> form->checkbox('is_admin', t('Administrator'), 1, isset($values['is_admin']) && $values['is_admin'] == 1 ? true : false) ?> form->checkbox('is_project_admin', t('Project Administrator'), 1, isset($values['is_project_admin']) && $values['is_project_admin'] == 1 ? true : false) ?> form->checkbox('disable_login_form', t('Disallow login form'), 1, isset($values['disable_login_form']) && $values['disable_login_form'] == 1) ?> diff --git a/sources/app/Template/user/external.php b/sources/app/Template/user/external.php index 9ef0b4d..7a42f38 100644 --- a/sources/app/Template/user/external.php +++ b/sources/app/Template/user/external.php @@ -34,7 +34,7 @@

    - +

     

    diff --git a/sources/app/Template/user/notifications.php b/sources/app/Template/user/notifications.php index a425705..7223013 100644 --- a/sources/app/Template/user/notifications.php +++ b/sources/app/Template/user/notifications.php @@ -1,33 +1,24 @@

    form->csrf() ?> - form->checkbox('notifications_enabled', t('Enable email notifications'), '1', $notifications['notifications_enabled'] == 1) ?>
    + form->checkbox('notifications_enabled', t('Enable notifications'), '1', $notifications['notifications_enabled'] == 1) ?>

    - - - - form->radios('notifications_filter', array( - \Model\Notification::FILTER_NONE => t('All tasks'), - \Model\Notification::FILTER_ASSIGNEE => t('Only for tasks assigned to me'), - \Model\Notification::FILTER_CREATOR => t('Only for tasks created by me'), - \Model\Notification::FILTER_BOTH => t('Only for tasks created by me and assigned to me'), - ), $notifications) ?>
    +

    + form->checkboxes('notification_types', $types, $notifications) ?>
    +

    + form->radios('notifications_filter', $filters, $notifications) ?> +
    -



    - -
    - $project_name): ?> - form->checkbox('projects['.$project_id.']', $project_name, '1', isset($notifications['project_'.$project_id])) ?>
    - -
    +

    + form->checkboxes('notification_projects', $projects, $notifications) ?>
    diff --git a/sources/app/Template/user/sidebar.php b/sources/app/Template/user/sidebar.php index cd1c85c..ca1e062 100644 --- a/sources/app/Template/user/sidebar.php +++ b/sources/app/Template/user/sidebar.php @@ -20,6 +20,8 @@ url->link(t('Persistent connections'), 'user', 'sessions', array('user_id' => $user['id'])) ?> + + hook->render('template:user:sidebar:information') ?>

    @@ -49,7 +51,7 @@ url->link(t('Public access'), 'user', 'share', array('user_id' => $user['id'])) ?>
  • app->getRouterController() === 'user' && $this->app->getRouterAction() === 'notifications' ? 'class="active"' : '' ?>> - url->link(t('Email notifications'), 'user', 'notifications', array('user_id' => $user['id'])) ?> + url->link(t('Notifications'), 'user', 'notifications', array('user_id' => $user['id'])) ?>
  • app->getRouterController() === 'user' && $this->app->getRouterAction() === 'external' ? 'class="active"' : '' ?>> url->link(t('External accounts'), 'user', 'external', array('user_id' => $user['id'])) ?> @@ -60,14 +62,10 @@
  • app->getRouterController() === 'user' && $this->app->getRouterAction() === 'authentication' ? 'class="active"' : '' ?>> url->link(t('Edit Authentication'), 'user', 'authentication', array('user_id' => $user['id'])) ?>
  • -
  • app->getRouterController() === 'hourlyrate' ? 'class="active"' : '' ?>> - url->link(t('Hourly rates'), 'hourlyrate', 'index', array('user_id' => $user['id'])) ?> -
  • -
  • app->getRouterController() === 'timetable' ? 'class="active"' : '' ?>> - url->link(t('Manage timetable'), 'timetable', 'index', array('user_id' => $user['id'])) ?> -
  • + hook->render('template:user:sidebar:actions', array('user' => $user)) ?> + user->isAdmin() && ! $this->user->isCurrentUser($user['id'])): ?>
  • app->getRouterController() === 'user' && $this->app->getRouterAction() === 'remove' ? 'class="active"' : '' ?>> url->link(t('Remove'), 'user', 'remove', array('user_id' => $user['id'])) ?> diff --git a/sources/app/check_setup.php b/sources/app/check_setup.php index 624b6b3..65f291e 100644 --- a/sources/app/check_setup.php +++ b/sources/app/check_setup.php @@ -29,24 +29,7 @@ if (! extension_loaded('mbstring')) { die('PHP extension required: mbstring'); } -// Check if /data is writeable -if (! is_writable('data')) { - die('The directory "data" must be writeable by your web server user'); -} - // Fix wrong value for arg_separator.output, used by the function http_build_query() if (ini_get('arg_separator.output') === '&') { ini_set('arg_separator.output', '&'); } - -// Prepare folder for uploaded files -if (! is_dir(FILES_DIR)) { - if (! mkdir(FILES_DIR, 0755, true)) { - die('Unable to create the upload directory: "'.FILES_DIR.'"'); - } -} - -// Check permissions for files folder -if (! is_writable(FILES_DIR)) { - die('The directory "'.FILES_DIR.'" must be writeable by your webserver user'); -} diff --git a/sources/app/common.php b/sources/app/common.php index 1f1c727..e63d82b 100644 --- a/sources/app/common.php +++ b/sources/app/common.php @@ -30,120 +30,7 @@ $container->register(new ServiceProvider\ClassProvider); $container->register(new ServiceProvider\EventDispatcherProvider); if (ENABLE_URL_REWRITE) { - - // Dashboard - $container['router']->addRoute('dashboard', 'app', 'index'); - $container['router']->addRoute('dashboard/:user_id', 'app', 'index', array('user_id')); - $container['router']->addRoute('dashboard/:user_id/projects', 'app', 'projects', array('user_id')); - $container['router']->addRoute('dashboard/:user_id/tasks', 'app', 'tasks', array('user_id')); - $container['router']->addRoute('dashboard/:user_id/subtasks', 'app', 'subtasks', array('user_id')); - $container['router']->addRoute('dashboard/:user_id/calendar', 'app', 'calendar', array('user_id')); - $container['router']->addRoute('dashboard/:user_id/activity', 'app', 'activity', array('user_id')); - - // Search routes - $container['router']->addRoute('search', 'search', 'index'); - $container['router']->addRoute('search/:search', 'search', 'index', array('search')); - - // Project routes - $container['router']->addRoute('projects', 'project', 'index'); - $container['router']->addRoute('project/create', 'project', 'create'); - $container['router']->addRoute('project/create/:private', 'project', 'create', array('private')); - $container['router']->addRoute('project/:project_id', 'project', 'show', array('project_id')); - $container['router']->addRoute('p/:project_id', 'project', 'show', array('project_id')); - $container['router']->addRoute('project/:project_id/share', 'project', 'share', array('project_id')); - $container['router']->addRoute('project/:project_id/edit', 'project', 'edit', array('project_id')); - $container['router']->addRoute('project/:project_id/integration', 'project', 'integration', array('project_id')); - $container['router']->addRoute('project/:project_id/users', 'project', 'users', array('project_id')); - $container['router']->addRoute('project/:project_id/duplicate', 'project', 'duplicate', array('project_id')); - $container['router']->addRoute('project/:project_id/remove', 'project', 'remove', array('project_id')); - $container['router']->addRoute('project/:project_id/disable', 'project', 'disable', array('project_id')); - $container['router']->addRoute('project/:project_id/enable', 'project', 'enable', array('project_id')); - - // Action routes - $container['router']->addRoute('project/:project_id/actions', 'action', 'index', array('project_id')); - $container['router']->addRoute('project/:project_id/action/:action_id/confirm', 'action', 'confirm', array('project_id', 'action_id')); - - // Column routes - $container['router']->addRoute('project/:project_id/columns', 'column', 'index', array('project_id')); - $container['router']->addRoute('project/:project_id/column/:column_id/edit', 'column', 'edit', array('project_id', 'column_id')); - $container['router']->addRoute('project/:project_id/column/:column_id/confirm', 'column', 'confirm', array('project_id', 'column_id')); - $container['router']->addRoute('project/:project_id/column/:column_id/move/:direction', 'column', 'move', array('project_id', 'column_id', 'direction')); - - // Swimlane routes - $container['router']->addRoute('project/:project_id/swimlanes', 'swimlane', 'index', array('project_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/edit', 'swimlane', 'edit', array('project_id', 'swimlane_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/confirm', 'swimlane', 'confirm', array('project_id', 'swimlane_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/disable', 'swimlane', 'disable', array('project_id', 'swimlane_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/enable', 'swimlane', 'enable', array('project_id', 'swimlane_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/up', 'swimlane', 'moveup', array('project_id', 'swimlane_id')); - $container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/down', 'swimlane', 'movedown', array('project_id', 'swimlane_id')); - - // Category routes - $container['router']->addRoute('project/:project_id/categories', 'category', 'index', array('project_id')); - $container['router']->addRoute('project/:project_id/category/:category_id/edit', 'category', 'edit', array('project_id', 'category_id')); - $container['router']->addRoute('project/:project_id/category/:category_id/confirm', 'category', 'confirm', array('project_id', 'category_id')); - - // Task routes - $container['router']->addRoute('project/:project_id/task/:task_id', 'task', 'show', array('project_id', 'task_id')); - $container['router']->addRoute('t/:task_id', 'task', 'show', array('task_id')); - $container['router']->addRoute('public/task/:task_id/:token', 'task', 'readonly', array('task_id', 'token')); - - $container['router']->addRoute('project/:project_id/task/:task_id/activity', 'activity', 'task', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/screenshot', 'file', 'screenshot', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/upload', 'file', 'create', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/comment', 'comment', 'create', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/link', 'tasklink', 'create', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/transitions', 'task', 'transitions', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/analytics', 'task', 'analytics', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/remove', 'task', 'remove', array('project_id', 'task_id')); - - $container['router']->addRoute('project/:project_id/task/:task_id/edit', 'taskmodification', 'edit', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/description', 'taskmodification', 'description', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/recurrence', 'taskmodification', 'recurrence', array('project_id', 'task_id')); - - $container['router']->addRoute('project/:project_id/task/:task_id/close', 'taskstatus', 'close', array('task_id', 'project_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/open', 'taskstatus', 'open', array('task_id', 'project_id')); - - $container['router']->addRoute('project/:project_id/task/:task_id/duplicate', 'taskduplication', 'duplicate', array('task_id', 'project_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/copy', 'taskduplication', 'copy', array('task_id', 'project_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/copy/:dst_project_id', 'taskduplication', 'copy', array('task_id', 'project_id', 'dst_project_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/move', 'taskduplication', 'move', array('task_id', 'project_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/move/:dst_project_id', 'taskduplication', 'move', array('task_id', 'project_id', 'dst_project_id')); - - // Board routes - $container['router']->addRoute('board/:project_id', 'board', 'show', array('project_id')); - $container['router']->addRoute('b/:project_id', 'board', 'show', array('project_id')); - $container['router']->addRoute('public/board/:token', 'board', 'readonly', array('token')); - - // Calendar routes - $container['router']->addRoute('calendar/:project_id', 'calendar', 'show', array('project_id')); - $container['router']->addRoute('c/:project_id', 'calendar', 'show', array('project_id')); - - // Listing routes - $container['router']->addRoute('list/:project_id', 'listing', 'show', array('project_id')); - $container['router']->addRoute('l/:project_id', 'listing', 'show', array('project_id')); - - // Gantt routes - $container['router']->addRoute('gantt/:project_id', 'gantt', 'project', array('project_id')); - $container['router']->addRoute('gantt/:project_id/sort/:sorting', 'gantt', 'project', array('project_id', 'sorting')); - - // Subtask routes - $container['router']->addRoute('project/:project_id/task/:task_id/subtask/create', 'subtask', 'create', array('project_id', 'task_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/subtask/:subtask_id/remove', 'subtask', 'confirm', array('project_id', 'task_id', 'subtask_id')); - $container['router']->addRoute('project/:project_id/task/:task_id/subtask/:subtask_id/edit', 'subtask', 'edit', array('project_id', 'task_id', 'subtask_id')); - - // Feed routes - $container['router']->addRoute('feed/project/:token', 'feed', 'project', array('token')); - $container['router']->addRoute('feed/user/:token', 'feed', 'user', array('token')); - - // Ical routes - $container['router']->addRoute('ical/project/:token', 'ical', 'project', array('token')); - $container['router']->addRoute('ical/user/:token', 'ical', 'user', array('token')); - - // Auth routes - $container['router']->addRoute('oauth/google', 'oauth', 'google'); - $container['router']->addRoute('oauth/github', 'oauth', 'github'); - $container['router']->addRoute('oauth/gitlab', 'oauth', 'gitlab'); - $container['router']->addRoute('login', 'auth', 'login'); - $container['router']->addRoute('logout', 'auth', 'logout'); + require __DIR__.'/routes.php'; } + +$container['pluginLoader']->scan(); diff --git a/sources/app/constants.php b/sources/app/constants.php index 7df1e4b..2361192 100644 --- a/sources/app/constants.php +++ b/sources/app/constants.php @@ -4,8 +4,11 @@ defined('DEBUG') or define('DEBUG', false); defined('DEBUG_FILE') or define('DEBUG_FILE', __DIR__.'/../data/debug.log'); +// Plugin directory +defined('PLUGINS_DIR') or define('PLUGINS_DIR', __DIR__.'/../plugins'); + // Application version -defined('APP_VERSION') or define('APP_VERSION', '1.0.18'); +defined('APP_VERSION') or define('APP_VERSION', '1.0.19'); // Database driver: sqlite, mysql or postgres defined('DB_DRIVER') or define('DB_DRIVER', 'sqlite'); @@ -34,8 +37,11 @@ defined('LDAP_USER_PATTERN') or define('LDAP_USER_PATTERN', ''); defined('LDAP_ACCOUNT_FULLNAME') or define('LDAP_ACCOUNT_FULLNAME', 'displayname'); defined('LDAP_ACCOUNT_EMAIL') or define('LDAP_ACCOUNT_EMAIL', 'mail'); defined('LDAP_ACCOUNT_ID') or define('LDAP_ACCOUNT_ID', ''); -defined('LDAP_USERNAME_CASE_SENSITIVE') or define('LDAP_USERNAME_CASE_SENSITIVE', false); +defined('LDAP_ACCOUNT_MEMBEROF') or define('LDAP_ACCOUNT_MEMBEROF', 'memberof'); defined('LDAP_ACCOUNT_CREATION') or define('LDAP_ACCOUNT_CREATION', true); +defined('LDAP_GROUP_ADMIN_DN') or define('LDAP_GROUP_ADMIN_DN', ''); +defined('LDAP_GROUP_PROJECT_ADMIN_DN') or define('LDAP_GROUP_PROJECT_ADMIN_DN', ''); +defined('LDAP_USERNAME_CASE_SENSITIVE') or define('LDAP_USERNAME_CASE_SENSITIVE', false); // Google authentication defined('GOOGLE_AUTH') or define('GOOGLE_AUTH', false); @@ -88,6 +94,9 @@ defined('ENABLE_HSTS') or define('ENABLE_HSTS', true); // Enable or disable "X-Frame-Options: DENY" HTTP header defined('ENABLE_XFRAME') or define('ENABLE_XFRAME', true); +// Syslog +defined('ENABLE_SYSLOG') or define('ENABLE_SYSLOG', true); + // Default files directory defined('FILES_DIR') or define('FILES_DIR', 'data/files/'); @@ -111,3 +120,10 @@ defined('BRUTEFORCE_LOCKDOWN_DURATION') or define('BRUTEFORCE_LOCKDOWN_DURATION' // Session duration in second (0 = until the browser is closed) // See http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime defined('SESSION_DURATION') or define('SESSION_DURATION', 0); + +// HTTP client proxy +defined('HTTP_PROXY_HOSTNAME') or define('HTTP_PROXY_HOSTNAME', ''); +defined('HTTP_PROXY_PORT') or define('HTTP_PROXY_PORT', '3128'); +defined('HTTP_PROXY_USERNAME') or define('HTTP_PROXY_USERNAME', ''); +defined('HTTP_PROXY_PASSWORD') or define('HTTP_PROXY_PASSWORD', ''); + diff --git a/sources/app/routes.php b/sources/app/routes.php new file mode 100644 index 0000000..159e8f6 --- /dev/null +++ b/sources/app/routes.php @@ -0,0 +1,117 @@ +addRoute('dashboard', 'app', 'index'); +$container['router']->addRoute('dashboard/:user_id', 'app', 'index', array('user_id')); +$container['router']->addRoute('dashboard/:user_id/projects', 'app', 'projects', array('user_id')); +$container['router']->addRoute('dashboard/:user_id/tasks', 'app', 'tasks', array('user_id')); +$container['router']->addRoute('dashboard/:user_id/subtasks', 'app', 'subtasks', array('user_id')); +$container['router']->addRoute('dashboard/:user_id/calendar', 'app', 'calendar', array('user_id')); +$container['router']->addRoute('dashboard/:user_id/activity', 'app', 'activity', array('user_id')); + +// Search routes +$container['router']->addRoute('search', 'search', 'index'); +$container['router']->addRoute('search/:search', 'search', 'index', array('search')); + +// Project routes +$container['router']->addRoute('projects', 'project', 'index'); +$container['router']->addRoute('project/create', 'project', 'create'); +$container['router']->addRoute('project/create/:private', 'project', 'create', array('private')); +$container['router']->addRoute('project/:project_id', 'project', 'show', array('project_id')); +$container['router']->addRoute('p/:project_id', 'project', 'show', array('project_id')); +$container['router']->addRoute('project/:project_id/share', 'project', 'share', array('project_id')); +$container['router']->addRoute('project/:project_id/edit', 'project', 'edit', array('project_id')); +$container['router']->addRoute('project/:project_id/integration', 'project', 'integration', array('project_id')); +$container['router']->addRoute('project/:project_id/users', 'project', 'users', array('project_id')); +$container['router']->addRoute('project/:project_id/duplicate', 'project', 'duplicate', array('project_id')); +$container['router']->addRoute('project/:project_id/remove', 'project', 'remove', array('project_id')); +$container['router']->addRoute('project/:project_id/disable', 'project', 'disable', array('project_id')); +$container['router']->addRoute('project/:project_id/enable', 'project', 'enable', array('project_id')); + +// Action routes +$container['router']->addRoute('project/:project_id/actions', 'action', 'index', array('project_id')); +$container['router']->addRoute('project/:project_id/action/:action_id/confirm', 'action', 'confirm', array('project_id', 'action_id')); + +// Column routes +$container['router']->addRoute('project/:project_id/columns', 'column', 'index', array('project_id')); +$container['router']->addRoute('project/:project_id/column/:column_id/edit', 'column', 'edit', array('project_id', 'column_id')); +$container['router']->addRoute('project/:project_id/column/:column_id/confirm', 'column', 'confirm', array('project_id', 'column_id')); +$container['router']->addRoute('project/:project_id/column/:column_id/move/:direction', 'column', 'move', array('project_id', 'column_id', 'direction')); + +// Swimlane routes +$container['router']->addRoute('project/:project_id/swimlanes', 'swimlane', 'index', array('project_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/edit', 'swimlane', 'edit', array('project_id', 'swimlane_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/confirm', 'swimlane', 'confirm', array('project_id', 'swimlane_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/disable', 'swimlane', 'disable', array('project_id', 'swimlane_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/enable', 'swimlane', 'enable', array('project_id', 'swimlane_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/up', 'swimlane', 'moveup', array('project_id', 'swimlane_id')); +$container['router']->addRoute('project/:project_id/swimlane/:swimlane_id/down', 'swimlane', 'movedown', array('project_id', 'swimlane_id')); + +// Category routes +$container['router']->addRoute('project/:project_id/categories', 'category', 'index', array('project_id')); +$container['router']->addRoute('project/:project_id/category/:category_id/edit', 'category', 'edit', array('project_id', 'category_id')); +$container['router']->addRoute('project/:project_id/category/:category_id/confirm', 'category', 'confirm', array('project_id', 'category_id')); + +// Task routes +$container['router']->addRoute('project/:project_id/task/:task_id', 'task', 'show', array('project_id', 'task_id')); +$container['router']->addRoute('t/:task_id', 'task', 'show', array('task_id')); +$container['router']->addRoute('public/task/:task_id/:token', 'task', 'readonly', array('task_id', 'token')); + +$container['router']->addRoute('project/:project_id/task/:task_id/activity', 'activity', 'task', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/screenshot', 'file', 'screenshot', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/upload', 'file', 'create', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/comment', 'comment', 'create', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/link', 'tasklink', 'create', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/transitions', 'task', 'transitions', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/analytics', 'task', 'analytics', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/remove', 'task', 'remove', array('project_id', 'task_id')); + +$container['router']->addRoute('project/:project_id/task/:task_id/edit', 'taskmodification', 'edit', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/description', 'taskmodification', 'description', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/recurrence', 'taskmodification', 'recurrence', array('project_id', 'task_id')); + +$container['router']->addRoute('project/:project_id/task/:task_id/close', 'taskstatus', 'close', array('task_id', 'project_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/open', 'taskstatus', 'open', array('task_id', 'project_id')); + +$container['router']->addRoute('project/:project_id/task/:task_id/duplicate', 'taskduplication', 'duplicate', array('task_id', 'project_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/copy', 'taskduplication', 'copy', array('task_id', 'project_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/copy/:dst_project_id', 'taskduplication', 'copy', array('task_id', 'project_id', 'dst_project_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/move', 'taskduplication', 'move', array('task_id', 'project_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/move/:dst_project_id', 'taskduplication', 'move', array('task_id', 'project_id', 'dst_project_id')); + +// Board routes +$container['router']->addRoute('board/:project_id', 'board', 'show', array('project_id')); +$container['router']->addRoute('b/:project_id', 'board', 'show', array('project_id')); +$container['router']->addRoute('public/board/:token', 'board', 'readonly', array('token')); + +// Calendar routes +$container['router']->addRoute('calendar/:project_id', 'calendar', 'show', array('project_id')); +$container['router']->addRoute('c/:project_id', 'calendar', 'show', array('project_id')); + +// Listing routes +$container['router']->addRoute('list/:project_id', 'listing', 'show', array('project_id')); +$container['router']->addRoute('l/:project_id', 'listing', 'show', array('project_id')); + +// Gantt routes +$container['router']->addRoute('gantt/:project_id', 'gantt', 'project', array('project_id')); +$container['router']->addRoute('gantt/:project_id/sort/:sorting', 'gantt', 'project', array('project_id', 'sorting')); + +// Subtask routes +$container['router']->addRoute('project/:project_id/task/:task_id/subtask/create', 'subtask', 'create', array('project_id', 'task_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/subtask/:subtask_id/remove', 'subtask', 'confirm', array('project_id', 'task_id', 'subtask_id')); +$container['router']->addRoute('project/:project_id/task/:task_id/subtask/:subtask_id/edit', 'subtask', 'edit', array('project_id', 'task_id', 'subtask_id')); + +// Feed routes +$container['router']->addRoute('feed/project/:token', 'feed', 'project', array('token')); +$container['router']->addRoute('feed/user/:token', 'feed', 'user', array('token')); + +// Ical routes +$container['router']->addRoute('ical/project/:token', 'ical', 'project', array('token')); +$container['router']->addRoute('ical/user/:token', 'ical', 'user', array('token')); + +// Auth routes +$container['router']->addRoute('oauth/google', 'oauth', 'google'); +$container['router']->addRoute('oauth/github', 'oauth', 'github'); +$container['router']->addRoute('oauth/gitlab', 'oauth', 'gitlab'); +$container['router']->addRoute('login', 'auth', 'login'); +$container['router']->addRoute('logout', 'auth', 'logout'); diff --git a/sources/assets/css/app.css b/sources/assets/css/app.css index befd889..c0cca79 100644 --- a/sources/assets/css/app.css +++ b/sources/assets/css/app.css @@ -15,6 +15,7 @@ * Docs & License: http://fullcalendar.io/ * (c) 2015 Adam Shaw */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-unthemed .fc-divider,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed .fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3;filter:alpha(opacity=30)}.fc-bgevent{background:#8fdf82;opacity:.3;filter:alpha(opacity=30)}.fc-nonbusiness{background:#d7d7d7}.fc-icon{display:inline-block;width:1em;height:1em;line-height:1em;font-size:1em;text-align:center;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative;margin:0 -1em}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%;left:3%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%;left:-3%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%;left:-2%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%;left:2%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-default{background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{overflow-y:scroll;overflow-x:hidden}.fc-scroller>*{position:relative;width:100%;overflow:hidden}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:3}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-h-event .fc-resizer{top:-1px;bottom:-1px;left:-1px;right:-1px;width:5px}.fc-ltr .fc-h-event .fc-start-resizer,.fc-ltr .fc-h-event .fc-start-resizer:after,.fc-ltr .fc-h-event .fc-start-resizer:before,.fc-rtl .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-end-resizer:after,.fc-rtl .fc-h-event .fc-end-resizer:before{right:auto;cursor:w-resize}.fc-ltr .fc-h-event .fc-end-resizer,.fc-ltr .fc-h-event .fc-end-resizer:after,.fc-ltr .fc-h-event .fc-end-resizer:before,.fc-rtl .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-start-resizer:after,.fc-rtl .fc-h-event .fc-start-resizer:before{left:auto;cursor:e-resize}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-day-grid-event .fc-resizer{left:-3px;right:-3px;width:7px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-toolbar{text-align:center;margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number{text-align:center}.fc-basic-view .fc-week-number span{display:inline-block;min-width:1.25em}.fc-ltr .fc-basic-view .fc-day-number{text-align:right}.fc-rtl .fc-basic-view .fc-day-number{text-align:left}.fc-day-number.fc-other-month{opacity:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-bgevent-skeleton,.fc-time-grid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-time-grid .fc-bgevent-skeleton{z-index:3}.fc-time-grid .fc-highlight-skeleton{z-index:4}.fc-time-grid .fc-content-skeleton{z-index:5}.fc-time-grid .fc-helper-skeleton{z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-time-grid .fc-bgevent-container,.fc-time-grid .fc-event-container{position:relative}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event .fc-resizer:after{content:"="}/*! - * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.c3 svg{font:10px sans-serif}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:gray;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max,.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}li,ul,ol,table,tr,td,th,p,blockquote,body{margin:0;padding:0;font-size:100%}body{margin-left:10px;margin-right:10px;padding-bottom:20px;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;text-rendering:optimizeLegibility}.page{clear:both}ul.no-bullet li{list-style-type:none;margin-left:0}.pull-right{text-align:right}hr{border:0;height:0;border-top:1px solid rgba(0,0,0,0.1);border-bottom:1px solid rgba(255,255,255,0.3)}.chosen-select{min-height:27px}.avatar{float:left;margin-right:10px}#ui-datepicker-div{font-size:.8em}#app-loading-icon{position:fixed;right:3px;bottom:3px}a{color:#36c;border:0}a:focus{outline:0;color:#df5353;text-decoration:none;border:1px dotted #aaa}a:hover{color:#333;text-decoration:none}h1,h2,h3{font-weight:normal;color:#333}h2{font-size:1.3em;margin-bottom:10px}h3{margin-top:10px;font-size:1.2em}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px;font-size:.95em}th,td{border:1px solid #eee;padding-top:.5em;padding-bottom:.5em;padding-left:3px;padding-right:3px}td{vertical-align:top}th{background:#fbfbfb;text-align:left}td li{margin-left:20px}.table-small{font-size:.8em}th a{text-decoration:none;color:#333}th a:focus,th a:hover{text-decoration:underline}.table-fixed{table-layout:fixed;white-space:nowrap}.table-fixed th{overflow:hidden}.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.table-stripped tr:nth-child(odd) td{background:#fefefe}.column-3{width:3%}.column-5{width:5%}.column-8{width:7.5%}.column-10{width:10%}.column-12{width:12%}.column-15{width:15%}.column-18{width:18%}.column-20{width:20%}.column-25{width:25%}.column-30{width:30%}.column-35{width:35%}.column-40{width:40%}.column-50{width:50%}.column-60{width:60%}.column-70{width:70%}form{margin-bottom:20px}label{cursor:pointer;display:block;margin-top:10px}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]{color:#888;border:1px solid #ccc;width:300px;max-width:95%;font-size:100%;height:25px;padding-bottom:0;font-family:sans-serif;margin-top:10px;-webkit-appearance:none;appearance:none}input[type="number"]:focus,input[type="date"]:focus,input[type="email"]:focus,input[type="password"]:focus,input[type="text"]:focus,textarea:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}input.form-numeric,input[type="number"]{width:70px}textarea{border:1px solid #ccc;width:400px;max-width:99%;height:200px;font-size:100%;font-family:sans-serif}select{max-width:95%}select:focus{outline:0}::-webkit-input-placeholder{color:#ddd;padding-top:2px}::-ms-input-placeholder{color:#ddd;padding-top:2px}::-moz-placeholder{color:#ddd;padding-top:2px}.form-actions{padding-top:20px;clear:both}input.form-error,textarea.form-error{border:2px solid #b94a48}input.form-error:focus,textarea.form-error:focus{box-shadow:none;border:2px solid #b94a48}.form-required{color:red;padding-left:5px;font-weight:bold}.form-errors{color:#b94a48;list-style-type:none}ul.form-errors li{margin-left:0}.form-help{font-size:.8em;color:brown;margin-bottom:15px}.form-inline{padding:0;margin:0;border:0}.form-inline label{display:inline}.form-inline input,.form-inline select{margin:0;margin-right:15px}.form-inline .form-required{display:none}.form-inline-group{display:inline}input.form-datetime,input.form-date{width:150px}input.form-input-large{width:400px}.form-row{margin-top:10px;margin-bottom:20px}.form-column{float:left;padding-right:50px}.form-column:first-child{padding-left:0}.form-column ul{margin-top:15px}.form-login{width:350px;margin:0 auto;margin-top:8%}.form-column li,.form-login li{margin-left:25px;line-height:25px}.form-checkbox-group label{display:inline}label+.form-tabs{margin-top:10px}.form-tabs{width:100%;max-width:800px}.form-tabs-nav{margin-bottom:8px}.form-tabs-nav li{margin-left:0;display:inline}.form-tab{margin-right:20px}.form-tab a{color:#ccc;font-weight:bold;text-decoration:none}.form-tab a:focus,.form-tab a:hover{color:#000}.form-tab-selected a{color:#333}.preview-area{border:1px dashed #000;padding-top:5px;padding-left:5px;padding-right:5px;margin-bottom:5px;display:none;overflow:auto}.btn{-webkit-appearance:none;appearance:none;display:inline-block;color:#333;border:1px solid #ccc;background:#efefef;padding:5px;padding-left:15px;padding-right:15px;font-size:.9em;cursor:pointer;border-radius:2px}a.btn{text-decoration:none;font-weight:bold}.btn-small{padding:2px;padding-left:5px;padding-right:5px}.btn-red{border-color:#b0281a;background:#d14836;color:#fff}a.btn-red:hover,.btn-red:hover,.btn-red:focus{color:#fff;background:#c53727}a.btn-blue,.btn-blue{border-color:#3079ed;background:#4d90fe;color:#fff}a.btn-blue:hover,.btn-blue:hover,a.btn-blue:focus,.btn-blue:focus{border-color:#2f5bb7;background:#357ae8}.btn-blue:disabled{color:#ccc;border:1px solid #ccc;background:#f7f7f7}#main .alert,.page .alert{margin-top:10px}.alert{padding:8px 35px 8px 14px;margin-bottom:10px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-normal{color:#333;background-color:#f0f0f0;border-color:#ddd}.alert ul{margin-top:10px;margin-bottom:10px}.alert li{margin-left:25px}.tooltip-arrow:after{background:#fff;border:1px solid #aaa;box-shadow:0 0 5px #aaa}div.ui-tooltip{min-width:200px;max-width:600px;font-size:.85em}.tooltip-arrow{width:20px;height:10px;overflow:hidden;position:absolute}.tooltip-arrow.top{top:-10px}.tooltip-arrow.bottom{bottom:-10px}.tooltip-arrow.align-left{left:10px}.tooltip-arrow.align-right{right:10px}.tooltip-arrow:after{content:"";position:absolute;width:14px;height:14px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.tooltip-arrow.bottom:after{top:-10px}.tooltip-arrow.top:after{bottom:-10px}.tooltip-arrow.align-left:after{left:0}.tooltip-arrow.align-right:after{right:0}.tooltip-large{width:550px}.ui-tooltip-content .markdown p{margin-bottom:0}.tooltip .fa-info-circle{color:#999;font-size:.95em}.ui-tooltip ul{margin-left:20px}header{margin-top:10px;padding-bottom:10px;border-bottom:1px solid #dedede}header h1{margin:0;padding:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:70%;float:left}header ul{text-align:right;font-size:.9em}header li{display:inline;padding-left:30px}header a{color:#777;text-decoration:none}nav .active a{color:#333;font-weight:bold}.username a{color:#000}.username a:hover{color:#df5353;text-decoration:underline}.logo{opacity:.3;color:#d40000}.logo span{color:#333}.logo:hover{opacity:.8}.logo:focus span,.logo:hover span{color:#d40000}.page-header{margin-bottom:20px}.page-header h2{margin:0;padding:0;font-size:1.4em;font-weight:bold;border-bottom:1px dotted #ccc}.page-header h2 a{color:#ddd}.page-header h2 a:focus,.page-header h2 a:hover{color:#333}.page-header ul{text-align:left;margin-top:5px;display:inline-block}.menu-inline li,.page-header li{display:inline;padding-right:10px;font-size:.95em}.menu-inline{margin-bottom:5px}@media only screen and (max-width:640px){.page-header-mobile li{display:block;margin-bottom:5px}}.public-board{margin-top:5px}.public-task{max-width:800px;margin:0 auto;margin-top:5px}#board-container{overflow-x:scroll}#board{table-layout:fixed}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast:active),(-ms-high-contrast:none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px}.board-rotation{min-width:250px;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-add-icon{float:left;padding:0 5px}.board-add-icon a{text-decoration:none;color:#36c;font-size:150%;line-height:70%}.board-add-icon a:focus,.board-add-icon a:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}th.board-column-header-collapsed .board-column-header-task-count{font-size:.85em}th.board-swimlane-header{width:120px}a.board-swimlane-toggle{font-size:.95em}.board-swimlane-toggle-title{font-size:.85em;display:none}.board-swimlane-title{vertical-align:top}.board-task-list{overflow:auto}.board-task-list-limit{background-color:#df5353}.draggable-item{cursor:pointer;user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:2px;border:1px solid #000;padding:2px;font-size:.85em;word-wrap:break-word}div.task-board-recent{box-shadow:2px 2px 5px rgba(0,0,0,0.25)}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-table a,.task-board a{color:#000;text-decoration:none;font-weight:bold}.task-table a:focus,.task-table a:hover,.task-board a:focus,.task-board a:hover{text-decoration:underline}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}a.task-board-collapsed-title{font-weight:normal}.task-board .dropdown{float:left;margin-right:5px;font-size:1.1em}.task-board-title{margin-top:5px;margin-bottom:5px;font-size:1.1em}.task-board-title a{font-weight:normal}.task-board-user{font-size:.8em}.task-board-current-user a{text-decoration:underline}.task-board-current-user a:focus,.task-board-current-user a:hover{text-decoration:none}a.task-board-nobody{font-weight:normal;font-style:italic;color:#444}.task-board-category-container{text-align:right}.task-board-category{font-weight:bold;font-size:.9em;color:#000;border:1px solid #555;padding:2px;padding-right:5px;padding-left:5px}.task-board-icons{text-align:right;margin-top:8px}.task-board-icons a{opacity:.5}.task-board-icons span{opacity:.5;margin-left:2px}.task-board-icons a:hover,.task-board-icons span:hover{opacity:1.0}.task-board-date{font-weight:bold;color:#000}span.task-board-date-overdue{color:#d90000;opacity:1.0}.task-score{font-weight:bold}.task-board .task-score{font-size:1.1em}.task-show-details .task-score{position:absolute;bottom:5px;right:5px;font-size:2em}.task-board-closed,.task-board-days{position:absolute;right:5px;top:5px;opacity:.5;font-size:.8em}.task-board-days:hover{opacity:1.0}.task-days-age{border:#666 1px solid;padding:1px 4px 1px 2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.task-days-incolumn{border:#666 1px solid;border-left:0;margin-left:-5px;padding:1px 2px 1px 4px;border-top-right-radius:3px;border-bottom-right-radius:3px}.board-container-compact .task-board-days{display:none}.task-show-details{position:relative;border-radius:5px;padding-bottom:10px}.task-show-details h2{font-size:1.8em;margin:0;margin-bottom:25px;padding:0;padding-left:10px;padding-right:10px}.task-show-details li{margin-left:25px;list-style-type:circle}.task-show-section{margin-top:30px;margin-bottom:20px}.task-show-files a{font-weight:bold;text-decoration:none}.task-show-files li{margin-left:25px;list-style-type:square;line-height:25px}.task-show-file-actions{font-size:.75em}.task-show-file-actions:before{content:" ["}.task-show-file-actions:after{content:"]"}.task-show-file-actions a{color:#333}.task-show-description{border-left:4px solid #333;padding-left:20px}.task-show-description-textarea{width:99%;max-width:99%;height:300px}.task-file-viewer{position:relative}.task-file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.task-time-form{margin-top:10px;margin-bottom:25px;padding:3px}.task-link-closed{text-decoration:line-through}.task-show-images{list-style-type:none}.task-show-images li img{width:100%}.task-show-images li .img_container{width:250px;height:100px;overflow:hidden}.task-show-images li{padding:10px;overflow:auto;width:250px;min-height:120px;display:inline-block;vertical-align:top}.task-show-images li p{padding:5px;font-weight:bold}.task-show-images li:hover{background:#eee}.task-show-image-actions{margin-left:5px}.task-show-file-table{width:auto}.task-show-start-link{color:#000}.task-show-start-link:hover,.task-show-start-link:focus{color:red}.flag-milestone{color:green}.comment{margin-bottom:20px}.comment:hover{background:#f7f8e0}.comment-inner{border-left:4px solid #333;padding-bottom:10px;padding-left:20px;margin-left:20px;margin-right:10px}.comment-preview{border:2px solid #000;border-radius:3px;padding:10px}.comment-preview .comment-inner{border:0;padding:0;margin:0}.comment-title{margin-bottom:8px;padding-bottom:3px;border-bottom:1px dotted #aaa}.ui-tooltip .comment-title{font-size:80%}.ui-tooltip .comment-inner{padding-bottom:0}.comment-actions{font-size:.8em;padding:0;text-align:right}.comment-actions li{display:inline;padding-left:5px;padding-right:5px;border-right:1px dotted #000}.comment-actions li:last-child{padding-right:0;border:0}.comment-username{font-weight:bold}.comment-textarea{height:200px;width:80%;max-width:800px}#comments .comment-textarea{height:80px;width:500px}.subtasks-table{font-size:.85em}.subtasks-table td{vertical-align:middle}.markdown{line-height:1.4em;font-size:1.0}.markdown h1{margin-top:5px;margin-bottom:10px;font-size:1.5em;font-weight:bold;text-decoration:underline}.markdown h2{font-size:1.2em;font-weight:bold;text-decoration:underline}.markdown h3{font-size:1.1em;text-decoration:underline}.markdown h4{font-size:1.1em;text-decoration:underline}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#444}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;font-size:1.1em;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;font-size:1.8em;margin-bottom:30px}.documentation h2{font-size:1.3em;text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px}.listing{border-radius:4px;padding:8px 35px 8px 14px;margin-bottom:20px;border:1px solid #ddd;color:#333;background-color:#fefefe;overflow:auto}.listing li{list-style-type:square;margin-left:20px;margin-bottom:3px}.listing ul{margin-top:15px;margin-bottom:15px}.activity-event{margin-bottom:20px}.activity-datetime{color:#999;font-size:.85em}.activity-content{margin-top:10px;margin-left:20px;padding-left:20px;border-left:2px solid #666}.activity-title{font-weight:bold;color:#000}.activity-description{font-size:.9em;color:#aaa;padding-top:5px}.activity-description ul{margin-top:10px}.activity-description li{margin-left:40px;list-style-type:circle;color:#555}.activity-description .markdown{margin-top:10px;color:#555}.activity-changes{margin-top:10px;font-size:.85em}.activity-changes ul{margin-left:25px}.dashboard-project-stats span{font-size:.75em;margin-right:10px;color:#999}.dashboard-project-stats strong{font-size:1.2em}.dashboard-table-link{font-weight:bold;color:#444;text-decoration:none}.dashboard-table-link:focus,.dashboard-table-link:hover{color:#999}.pagination{text-align:center}.pagination-next{margin-left:5px}.pagination-previous{margin-right:5px}#popover-container{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);overflow:auto;z-index:100}#popover-content{position:absolute;width:70%;margin:0 0 0 -35%;left:50%;top:5%;padding:15px;background:#fff;overflow:scroll;max-height:83%}#main .confirm{max-width:700px;font-size:1.1em}.sidebar-container{margin-top:10px;position:relative;clear:both}.sidebar-content{margin-left:23%;width:76%;position:absolute}.sidebar{width:20%;float:left;padding:10px;padding-top:0;border:1px solid #ddd;background:#fdfdfd;border-radius:5px}.sidebar li{list-style-type:square;margin-left:30px;line-height:1.8em}.sidebar li.active a{color:#000;font-weight:bold;text-decoration:none}.sidebar li.active a:focus,.sidebar li.active a:hover{text-decoration:underline}.sidebar-collapsed .sidebar{width:10px;padding-bottom:0;float:none}.sidebar-collapsed .sidebar-content{margin:0;margin-top:15px;width:100%}.sidebar-collapse{text-align:right}.sidebar-collapse a,.sidebar-expand a{color:#333;text-decoration:none}.sidebar-collapse a:hover,.sidebar-expand a:hover{color:#df5353}@media only screen and (max-width:1024px){.sidebar{width:25%}.sidebar-content{margin-left:30%;width:70%}}@media only screen and (max-width:767px){.sidebar{width:95%;float:none}.sidebar-content{margin:0;margin-top:15px;width:100%}}@media only screen and (max-width:1080px){div.filter-dropdowns .filters{margin-left:0}div.filter-dropdowns{display:block;margin-top:5px}}@media only screen and (max-width:1024px){li.hide-tablet,.hide-tablet{display:none}body{font-size:.85em}.form-tab{max-width:404px}.form-inline-group input[type="submit"],.form-inline-group label{display:block}.form-inline-group input[type="submit"]{margin-top:20px}td>input[type="text"]{max-width:150px}.task-time-form label{display:block}.task-time-form input[type="submit"]{margin-top:10px;display:block}.page-header .form-input-large{width:300px}}@media only screen and (max-width:1024px) and (orientation:landscape){header{padding-bottom:4px}div.chosen-container{font-size:.9em}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]{height:18px}.page-header .form-input-large{width:300px}}@media only screen and (max-width:640px){.hide-mobile{display:none}}.dropdown{display:inline;position:relative}.dropdown ul{display:none}ul.dropdown-submenu-open{display:block;position:absolute;left:0;z-index:1000;min-width:280px;list-style:none;margin:3px 0 0 1px;padding:6px 0;background-color:#fff;border:1px solid #b2b2b2;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.15)}ul.dropdown-submenu-top{bottom:0}.dropdown-submenu-open li{display:block;padding:0;padding-left:10px;padding-right:10px;margin:0;line-height:30px}.dropdown-submenu-open a{font-weight:normal}.page-header .dropdown{padding-right:10px}#screenshot-zone{position:relative;border:2px dashed #ccc;width:90%;height:250px;overflow:auto}#screenshot-inner{position:absolute;left:0;bottom:48%;width:100%;text-align:center}#screenshot-zone.screenshot-pasted{border:2px solid #333}.toolbar{font-size:.9em;padding-top:5px}.views{display:inline-block;margin-right:10px}.views li{border:1px solid #eee;padding-left:12px;padding-right:12px;padding-top:5px;padding-bottom:5px;display:inline}.menu-inline li.active a,.views li.active a{font-weight:bold;color:#000;text-decoration:none}.views li:first-child{border-right:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.views li:last-child{border-left:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.filters{display:inline-block;border:1px solid #eee;border-radius:5px;padding-left:10px;padding-right:10px;padding-top:5px;padding-bottom:5px;margin-left:10px}.filters ul{font-size:.8em}.page-header .filters ul{font-size:.9em}form.search{display:inline}div.search{margin-bottom:20px}.filter-dropdowns{display:inline-block}div.ganttview-hzheader-month,div.ganttview-hzheader-day,div.ganttview-vtheader,div.ganttview-vtheader-item-name,div.ganttview-vtheader-series,div.ganttview-grid,div.ganttview-grid-row-cell{float:left}div.ganttview-hzheader-month,div.ganttview-hzheader-day{text-align:center}div.ganttview-grid-row-cell.last,div.ganttview-hzheader-day.last,div.ganttview-hzheader-month.last{border-right:0}div.ganttview{border:1px solid #999}div.ganttview-hzheader-month{width:60px;height:20px;border-right:1px solid #d0d0d0;line-height:20px;overflow:hidden}div.ganttview-hzheader-day{width:20px;height:20px;border-right:1px solid #f0f0f0;border-top:1px solid #d0d0d0;line-height:20px;color:#777}div.ganttview-vtheader{margin-top:41px;width:400px;overflow:hidden;background-color:#fff}div.ganttview-vtheader-item{color:#666}div.ganttview-vtheader-series-name{width:400px;height:31px;line-height:31px;padding-left:3px;border-top:1px solid #d0d0d0;font-size:.9em;text-overflow:ellipsis;overflow:auto;white-space:nowrap}div.ganttview-vtheader-series-name a{color:#666;text-decoration:none}div.ganttview-vtheader-series-name a:hover{color:#333;text-decoration:underline}div.ganttview-vtheader-series-name a i{color:#000}div.ganttview-vtheader-series-name a:hover i{color:#666}div.ganttview-slide-container{overflow:auto;border-left:1px solid #999}div.ganttview-grid-row-cell{width:20px;height:31px;border-right:1px solid #f0f0f0;border-top:1px solid #f0f0f0}div.ganttview-grid-row-cell.ganttview-weekend{background-color:#fafafa}div.ganttview-blocks{margin-top:40px}div.ganttview-block-container{height:28px;padding-top:4px}div.ganttview-block{position:relative;height:25px;background-color:#e5ecf9;border:1px solid silver;border-radius:3px}.ganttview-block-movable{cursor:move}div.ganttview-block-not-defined{border-color:#000;background-color:#000}div.ganttview-block-text{position:absolute;height:12px;font-size:.7em;color:#999;padding:2px 3px}div.ganttview-block div.ui-resizable-handle.ui-resizable-s{bottom:-0} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} +.c3 svg{font:10px sans-serif}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:gray;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max,.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}li,ul,ol,table,tr,td,th,p,blockquote,body{margin:0;padding:0;font-size:100%}body{margin-left:10px;margin-right:10px;padding-bottom:20px;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;text-rendering:optimizeLegibility}.page{clear:both}ul.no-bullet li{list-style-type:none;margin-left:0}.pull-right{text-align:right}hr{border:0;height:0;border-top:1px solid rgba(0,0,0,0.1);border-bottom:1px solid rgba(255,255,255,0.3)}.chosen-select{min-height:27px}.avatar{float:left;margin-right:10px}#ui-datepicker-div{font-size:.8em}#app-loading-icon{position:fixed;right:3px;bottom:3px}.web-notification-icon{color:#36c}.web-notification-icon:focus,.web-notification-icon:hover{color:#000}a{color:#36c;border:0}a:focus{outline:0;color:#df5353;text-decoration:none;border:1px dotted #aaa}a:hover{color:#333;text-decoration:none}h1,h2,h3{font-weight:normal;color:#333}h2{font-size:1.3em;margin-bottom:10px}h3{margin-top:10px;font-size:1.2em}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px;font-size:.95em}#calendar table{margin-bottom:0}th,td{border:1px solid #eee;padding-top:.5em;padding-bottom:.5em;padding-left:3px;padding-right:3px}td{vertical-align:top}th{background:#fbfbfb;text-align:left}td li{margin-left:20px}.table-small{font-size:.8em}th a{text-decoration:none;color:#333}th a:focus,th a:hover{text-decoration:underline}.table-fixed{table-layout:fixed;white-space:nowrap}.table-fixed th{overflow:hidden}.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.table-stripped tr:nth-child(odd) td{background:#fefefe}.column-3{width:3%}.column-5{width:5%}.column-8{width:7.5%}.column-10{width:10%}.column-12{width:12%}.column-15{width:15%}.column-18{width:18%}.column-20{width:20%}.column-25{width:25%}.column-30{width:30%}.column-35{width:35%}.column-40{width:40%}.column-50{width:50%}.column-60{width:60%}.column-70{width:70%}form{margin-bottom:20px}label{cursor:pointer;display:block;margin-top:10px}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]{color:#888;border:1px solid #ccc;width:300px;max-width:95%;font-size:100%;height:25px;padding-bottom:0;font-family:sans-serif;margin-top:10px;-webkit-appearance:none;appearance:none}input[type="number"]:focus,input[type="date"]:focus,input[type="email"]:focus,input[type="password"]:focus,input[type="text"]:focus,textarea:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}input.form-numeric,input[type="number"]{width:70px}textarea{border:1px solid #ccc;width:400px;max-width:99%;height:200px;font-size:100%;font-family:sans-serif}select{max-width:95%}select:focus{outline:0}::-webkit-input-placeholder{color:#ddd;padding-top:2px}::-ms-input-placeholder{color:#ddd;padding-top:2px}::-moz-placeholder{color:#ddd;padding-top:2px}.form-actions{padding-top:20px;clear:both}input.form-error,textarea.form-error{border:2px solid #b94a48}input.form-error:focus,textarea.form-error:focus{box-shadow:none;border:2px solid #b94a48}.form-required{color:red;padding-left:5px;font-weight:bold}.form-errors{color:#b94a48;list-style-type:none}ul.form-errors li{margin-left:0}.form-help{font-size:.8em;color:brown;margin-bottom:15px}.form-inline{padding:0;margin:0;border:0}.form-inline label{display:inline}.form-inline input,.form-inline select{margin:0;margin-right:15px}.form-inline .form-required{display:none}.form-inline-group{display:inline}input.form-datetime,input.form-date{width:150px}input.form-input-large{width:400px}.form-row{margin-top:10px;margin-bottom:20px}.form-column{float:left;margin-right:3%;max-width:47%}.form-column ul{margin-top:15px}.form-login{width:350px;margin:0 auto;margin-top:8%}.form-column li,.form-login li{margin-left:25px;line-height:25px}label+.form-tabs{margin-top:10px}.form-tabs{width:100%;max-width:800px}ul.form-tabs-nav{margin-bottom:8px;margin-top:0}.form-tabs-nav li{margin-left:0;display:inline}.form-tab{margin-right:20px}.form-tab a{color:#ccc;font-weight:bold;text-decoration:none}.form-tab a:focus,.form-tab a:hover{color:#000}.form-tab-selected a{color:#333}.preview-area{border:1px dashed #000;padding-top:5px;padding-left:5px;padding-right:5px;margin-bottom:5px;display:none;overflow:auto}.btn{-webkit-appearance:none;appearance:none;display:inline-block;color:#333;border:1px solid #ccc;background:#efefef;padding:5px;padding-left:15px;padding-right:15px;font-size:.9em;cursor:pointer;border-radius:2px}a.btn{text-decoration:none;font-weight:bold}.btn-small{padding:2px;padding-left:5px;padding-right:5px}.btn-red{border-color:#b0281a;background:#d14836;color:#fff}a.btn-red:hover,.btn-red:hover,.btn-red:focus{color:#fff;background:#c53727}a.btn-blue,.btn-blue{border-color:#3079ed;background:#4d90fe;color:#fff}a.btn-blue:hover,.btn-blue:hover,a.btn-blue:focus,.btn-blue:focus{border-color:#2f5bb7;background:#357ae8}.btn-blue:disabled{color:#ccc;border:1px solid #ccc;background:#f7f7f7}#main .alert,.page .alert{margin-top:10px}.alert{padding:8px 35px 8px 14px;margin-bottom:10px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-normal{color:#333;background-color:#f0f0f0;border-color:#ddd}.alert ul{margin-top:10px;margin-bottom:10px}.alert li{margin-left:25px}.tooltip-arrow:after{background:#fff;border:1px solid #aaa;box-shadow:0 0 5px #aaa}div.ui-tooltip{min-width:200px;max-width:600px;font-size:.85em}.tooltip-arrow{width:20px;height:10px;overflow:hidden;position:absolute}.tooltip-arrow.top{top:-10px}.tooltip-arrow.bottom{bottom:-10px}.tooltip-arrow.align-left{left:10px}.tooltip-arrow.align-right{right:10px}.tooltip-arrow:after{content:"";position:absolute;width:14px;height:14px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.tooltip-arrow.bottom:after{top:-10px}.tooltip-arrow.top:after{bottom:-10px}.tooltip-arrow.align-left:after{left:0}.tooltip-arrow.align-right:after{right:0}.tooltip-large{width:550px}.ui-tooltip-content .markdown p{margin-bottom:0}.tooltip .fa-info-circle{color:#999;font-size:.95em}.ui-tooltip ul{margin-left:20px}header{margin-top:10px;padding-bottom:10px;border-bottom:1px solid #dedede}header h1{margin:0;padding:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:70%;float:left}header ul{text-align:right;font-size:.9em}header li{display:inline;padding-left:30px}header a{color:#777;text-decoration:none}nav .active a{color:#333;font-weight:bold}.username a{color:#000}.username a:hover{color:#df5353;text-decoration:underline}.logo{opacity:.3;color:#d40000}.logo span{color:#333}.logo:hover{opacity:.8}.logo:focus span,.logo:hover span{color:#d40000}.page-header{margin-bottom:20px}.page-header h2{margin:0;padding:0;font-size:1.4em;font-weight:bold;border-bottom:1px dotted #ccc}.page-header h2 a{color:#ddd}.page-header h2 a:focus,.page-header h2 a:hover{color:#333}.page-header ul{text-align:left;margin-top:5px;display:inline-block}.menu-inline li,.page-header li{display:inline;padding-right:10px;font-size:.95em}.menu-inline{margin-bottom:5px}@media only screen and (max-width:640px){.page-header-mobile li{display:block;margin-bottom:5px}}.public-board{margin-top:5px}.public-task{max-width:800px;margin:0 auto;margin-top:5px}#board-container{overflow-x:auto}#board{table-layout:fixed}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast:active),(-ms-high-contrast:none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px;min-height:150px;overflow:auto}.board-rotation{white-space:nowrap;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-column-title{cursor:pointer}.board-add-icon{float:left;padding:0 5px}.board-add-icon a{text-decoration:none;color:#36c;font-size:150%;line-height:70%}.board-add-icon a:focus,.board-add-icon a:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}th.board-column-header-collapsed .board-column-header-task-count{font-size:.85em}a.board-swimlane-toggle{font-size:.95em;text-decoration:none}a.board-swimlane-toggle:hover,a.board-swimlane-toggle:focus{color:#000;text-decoration:none;border:0}.board-task-list{overflow:auto;min-height:60px}.board-task-list-limit{background-color:#df5353}.draggable-item{cursor:pointer;user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:4px;border:1px solid #000;padding:2px;font-size:.85em;word-wrap:break-word}div.task-board-recent{box-shadow:2px 2px 3px rgba(0,0,0,0.2)}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-table a,.task-board a{color:#000;text-decoration:none;font-weight:bold}.task-table a:focus,.task-table a:hover,.task-board a:focus,.task-board a:hover{text-decoration:underline}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}a.task-board-collapsed-title{font-weight:normal}.task-board .dropdown{font-size:1.1em}.task-board-title{margin-top:5px;margin-bottom:5px;font-size:1.1em}.task-board-title a{font-weight:normal}.task-board-user{font-size:.8em}.task-board-current-user a{text-decoration:underline}.task-board-current-user a:focus,.task-board-current-user a:hover{text-decoration:none}a.task-board-nobody{font-weight:normal;font-style:italic;color:#444}.task-board-category-container{text-align:right}.task-board-category{font-weight:bold;font-size:.9em;color:#000;border:1px solid #555;padding:2px;padding-right:5px;padding-left:5px}.task-board-icons{text-align:right;margin-top:8px}.task-board-icons a{opacity:.5}.task-board-icons span{opacity:.5;margin-left:2px}.task-board-icons a:hover,.task-board-icons span:hover{opacity:1.0}.task-board-date{font-weight:bold;color:#000}span.task-board-date-overdue{color:#d90000;opacity:1.0}.task-score{font-weight:bold}.task-board .task-score{font-size:1.1em}.task-show-details .task-score{position:absolute;bottom:5px;right:5px;font-size:2em}.task-board-closed,.task-board-days{position:absolute;right:5px;top:5px;opacity:.5;font-size:.8em}.task-board-days:hover{opacity:1.0}.task-days-age{border:#666 1px solid;padding:1px 4px 1px 2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.task-days-incolumn{border:#666 1px solid;border-left:0;margin-left:-5px;padding:1px 2px 1px 4px;border-top-right-radius:3px;border-bottom-right-radius:3px}.board-container-compact .task-board-days{display:none}.task-show-details{position:relative;border-radius:5px;padding-bottom:10px}.task-show-details h2{font-size:1.8em;margin:0;margin-bottom:25px;padding:0;padding-left:10px;padding-right:10px}.task-show-details li{margin-left:25px;list-style-type:circle}.task-show-section{margin-top:30px;margin-bottom:20px}.task-show-files a{font-weight:bold;text-decoration:none}.task-show-files li{margin-left:25px;list-style-type:square;line-height:25px}.task-show-file-actions{font-size:.75em}.task-show-file-actions:before{content:" ["}.task-show-file-actions:after{content:"]"}.task-show-file-actions a{color:#333}.task-show-description{border-left:4px solid #333;padding-left:20px}.task-show-description-textarea{width:99%;max-width:99%;height:300px}.task-file-viewer{position:relative}.task-file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.task-time-form{margin-top:10px;margin-bottom:25px;padding:3px}.task-link-closed{text-decoration:line-through}.task-show-images{list-style-type:none}.task-show-images li img{width:100%}.task-show-images li .img_container{width:250px;height:100px;overflow:hidden}.task-show-images li{padding:10px;overflow:auto;width:250px;min-height:120px;display:inline-block;vertical-align:top}.task-show-images li p{padding:5px;font-weight:bold}.task-show-images li:hover{background:#eee}.task-show-image-actions{margin-left:5px}.task-show-file-table{width:auto}.task-show-start-link{color:#000}.task-show-start-link:hover,.task-show-start-link:focus{color:red}.flag-milestone{color:green}.color-picker{min-height:35px}.color-square{display:inline-block;width:30px;height:30px;margin-right:5px;margin-bottom:5px;border:1px solid #000;cursor:pointer}.color-square:hover{border-style:dotted}div.color-square-selected{border-width:2px;width:28px;height:28px;box-shadow:3px 2px 10px 0 rgba(180,180,180,0.9)}.comment{margin-bottom:20px}.comment:hover{background:#f7f8e0}.comment-inner{border-left:4px solid #333;padding-bottom:10px;padding-left:20px;margin-left:20px;margin-right:10px}.comment-preview{border:2px solid #000;border-radius:3px;padding:10px}.comment-preview .comment-inner{border:0;padding:0;margin:0}.comment-title{margin-bottom:8px;padding-bottom:3px;border-bottom:1px dotted #aaa}.ui-tooltip .comment-title{font-size:80%}.ui-tooltip .comment-inner{padding-bottom:0}.comment-actions{font-size:.8em;padding:0;text-align:right}.comment-actions li{display:inline;padding-left:5px;padding-right:5px;border-right:1px dotted #000}.comment-actions li:last-child{padding-right:0;border:0}.comment-username{font-weight:bold}.comment-textarea{height:200px;width:80%;max-width:800px}#comments .comment-textarea{height:80px;width:500px}.subtasks-table{font-size:.85em}.subtasks-table td{vertical-align:middle}.markdown{line-height:1.4em;font-size:1.0}.markdown h1{margin-top:5px;margin-bottom:10px;font-size:1.5em;font-weight:bold;text-decoration:underline}.markdown h2{font-size:1.2em;font-weight:bold;text-decoration:underline}.markdown h3{font-size:1.1em;text-decoration:underline}.markdown h4{font-size:1.1em;text-decoration:underline}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#444}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;font-size:1.1em;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;font-size:1.8em;margin-bottom:30px}.documentation h2{font-size:1.3em;text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px}.listing{border-radius:4px;padding:8px 35px 8px 14px;margin-bottom:20px;border:1px solid #ddd;color:#333;background-color:#fefefe;overflow:auto}.listing li{list-style-type:square;margin-left:20px;margin-bottom:3px}.listing ul{margin-top:15px;margin-bottom:15px}.activity-event{margin-bottom:20px}.activity-datetime{color:#999;font-size:.85em}.activity-content{margin-top:10px;margin-left:20px;padding-left:20px;border-left:2px solid #666}.activity-title{font-weight:bold;color:#000}.activity-description{font-size:.9em;color:#aaa;padding-top:5px}.activity-description ul{margin-top:10px}.activity-description li{margin-left:40px;list-style-type:circle;color:#555}.activity-description .markdown{margin-top:10px;color:#555}.activity-changes{margin-top:10px;font-size:.85em}.activity-changes ul{margin-left:25px}.dashboard-project-stats span{font-size:.75em;margin-right:10px;color:#999}.dashboard-project-stats strong{font-size:1.2em}.dashboard-table-link{font-weight:bold;color:#444;text-decoration:none}.dashboard-table-link:focus,.dashboard-table-link:hover{color:#999}.pagination{text-align:center}.pagination-next{margin-left:5px}.pagination-previous{margin-right:5px}#popover-container{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);overflow:auto;z-index:100}#popover-content{position:absolute;width:70%;margin:0 0 0 -35%;left:50%;top:1%;padding:15px;background:#fff;overflow:auto;max-height:85%}#main .confirm{max-width:700px;font-size:1.1em}.sidebar-container{margin-top:10px;position:relative;clear:both}.sidebar-content{margin-left:23%;width:76%;position:absolute}.sidebar{width:20%;float:left;padding:10px;padding-top:0;border:1px solid #ddd;background:#fdfdfd;border-radius:5px}.sidebar li{list-style-type:square;margin-left:30px;line-height:1.8em}.sidebar li.active a{color:#000;font-weight:bold;text-decoration:none}.sidebar li.active a:focus,.sidebar li.active a:hover{text-decoration:underline}.sidebar-collapsed .sidebar{width:10px;padding-bottom:0;float:none}.sidebar-collapsed .sidebar-content{margin:0;margin-top:15px;width:100%}.sidebar-collapse{text-align:right}.sidebar-collapse a,.sidebar-expand a{color:#333;text-decoration:none}.sidebar-collapse a:hover,.sidebar-expand a:hover{color:#df5353}@media only screen and (max-width:1024px){.sidebar{width:25%}.sidebar-content{margin-left:30%;width:70%}}@media only screen and (max-width:767px){.sidebar{width:95%;float:none}.sidebar-content{margin:0;margin-top:15px;width:100%}}@media only screen and (max-width:1080px){div.filter-dropdowns .filters{margin-left:0}div.filter-dropdowns{display:block;margin-top:5px}}@media only screen and (max-width:1024px){li.hide-tablet,.hide-tablet{display:none}body{font-size:.85em}.form-tab{max-width:404px}.form-inline-group input[type="submit"],.form-inline-group label{display:block}.form-inline-group input[type="submit"]{margin-top:20px}td>input[type="text"]{max-width:150px}.task-time-form label{display:block}.task-time-form input[type="submit"]{margin-top:10px;display:block}.page-header .form-input-large{width:300px}}@media only screen and (max-width:1024px) and (orientation:landscape){header{padding-bottom:4px}div.chosen-container{font-size:.9em}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]{height:18px}.page-header .form-input-large{width:300px}}@media only screen and (max-width:640px){.hide-mobile{display:none}}.dropdown{display:inline;position:relative}.dropdown ul{display:none}ul.dropdown-submenu-open{display:block;position:absolute;z-index:1000;min-width:285px;list-style:none;margin:3px 0 0 1px;padding:6px 0;background-color:#fff;border:1px solid #b2b2b2;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.15)}.dropdown-submenu-open li{display:block;margin:0;padding:0;padding-left:10px;padding-right:10px;padding-top:8px;padding-bottom:8px;font-size:.85em;border-bottom:1px solid #f8f8f8}.dropdown-submenu-open li:last-child{border:0}.dropdown-submenu-open li:hover{background:#4078c0;color:#fff}.dropdown-submenu-open li:hover a{color:#fff}.dropdown-submenu-open a{text-decoration:none;color:#333}.dropdown-submenu-open a:focus{text-decoration:underline}.page-header .dropdown{padding-right:10px}#screenshot-zone{position:relative;border:2px dashed #ccc;width:90%;height:250px;overflow:auto}#screenshot-inner{position:absolute;left:0;bottom:48%;width:100%;text-align:center}#screenshot-zone.screenshot-pasted{border:2px solid #333}.toolbar{font-size:.9em;padding-top:5px}.views{display:inline-block;margin-right:10px;font-size:.9em}.views li{border:1px solid #eee;padding-left:8px;padding-right:8px;padding-top:5px;padding-bottom:5px;display:inline}.menu-inline li.active a,.views li.active a{font-weight:bold;color:#000;text-decoration:none}.views li:first-child{border-right:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.views li:last-child{border-left:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.filters{display:inline-block;border:1px solid #eee;border-radius:5px;padding:5px;padding-right:10px;margin-left:8px}.filters ul{font-size:.8em}.page-header .filters ul{font-size:.9em}form.search{display:inline}div.search{margin-bottom:20px}.filter-dropdowns{font-size:.9em;display:inline-block}div.ganttview-hzheader-month,div.ganttview-hzheader-day,div.ganttview-vtheader,div.ganttview-vtheader-item-name,div.ganttview-vtheader-series,div.ganttview-grid,div.ganttview-grid-row-cell{float:left}div.ganttview-hzheader-month,div.ganttview-hzheader-day{text-align:center}div.ganttview-grid-row-cell.last,div.ganttview-hzheader-day.last,div.ganttview-hzheader-month.last{border-right:0}div.ganttview{border:1px solid #999}div.ganttview-hzheader-month{width:60px;height:20px;border-right:1px solid #d0d0d0;line-height:20px;overflow:hidden}div.ganttview-hzheader-day{width:20px;height:20px;border-right:1px solid #f0f0f0;border-top:1px solid #d0d0d0;line-height:20px;color:#777}div.ganttview-vtheader{margin-top:41px;width:400px;overflow:hidden;background-color:#fff}div.ganttview-vtheader-item{color:#666}div.ganttview-vtheader-series-name{width:400px;height:31px;line-height:31px;padding-left:3px;border-top:1px solid #d0d0d0;font-size:.9em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}div.ganttview-vtheader-series-name a{color:#666;text-decoration:none}div.ganttview-vtheader-series-name a:hover{color:#333;text-decoration:underline}div.ganttview-vtheader-series-name a i{color:#000}div.ganttview-vtheader-series-name a:hover i{color:#666}div.ganttview-slide-container{overflow:auto;border-left:1px solid #999}div.ganttview-grid-row-cell{width:20px;height:31px;border-right:1px solid #f0f0f0;border-top:1px solid #f0f0f0}div.ganttview-grid-row-cell.ganttview-weekend{background-color:#fafafa}div.ganttview-blocks{margin-top:40px}div.ganttview-block-container{height:28px;padding-top:4px}div.ganttview-block{position:relative;height:25px;background-color:#e5ecf9;border:1px solid silver;border-radius:3px}.ganttview-block-movable{cursor:move}div.ganttview-block-not-defined{border-color:#000;background-color:#000}div.ganttview-block-text{position:absolute;height:12px;font-size:.7em;color:#999;padding:2px 3px}div.ganttview-block div.ui-resizable-handle.ui-resizable-s{bottom:-0} \ No newline at end of file diff --git a/sources/assets/css/print.css b/sources/assets/css/print.css index db889a6..ff5570c 100644 --- a/sources/assets/css/print.css +++ b/sources/assets/css/print.css @@ -15,6 +15,7 @@ * Docs & License: http://fullcalendar.io/ * (c) 2015 Adam Shaw */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-unthemed .fc-divider,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed .fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3;filter:alpha(opacity=30)}.fc-bgevent{background:#8fdf82;opacity:.3;filter:alpha(opacity=30)}.fc-nonbusiness{background:#d7d7d7}.fc-icon{display:inline-block;width:1em;height:1em;line-height:1em;font-size:1em;text-align:center;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative;margin:0 -1em}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%;left:3%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%;left:-3%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%;left:-2%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%;left:2%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-default{background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{overflow-y:scroll;overflow-x:hidden}.fc-scroller>*{position:relative;width:100%;overflow:hidden}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:3}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-h-event .fc-resizer{top:-1px;bottom:-1px;left:-1px;right:-1px;width:5px}.fc-ltr .fc-h-event .fc-start-resizer,.fc-ltr .fc-h-event .fc-start-resizer:after,.fc-ltr .fc-h-event .fc-start-resizer:before,.fc-rtl .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-end-resizer:after,.fc-rtl .fc-h-event .fc-end-resizer:before{right:auto;cursor:w-resize}.fc-ltr .fc-h-event .fc-end-resizer,.fc-ltr .fc-h-event .fc-end-resizer:after,.fc-ltr .fc-h-event .fc-end-resizer:before,.fc-rtl .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-start-resizer:after,.fc-rtl .fc-h-event .fc-start-resizer:before{left:auto;cursor:e-resize}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-day-grid-event .fc-resizer{left:-3px;right:-3px;width:7px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-toolbar{text-align:center;margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number{text-align:center}.fc-basic-view .fc-week-number span{display:inline-block;min-width:1.25em}.fc-ltr .fc-basic-view .fc-day-number{text-align:right}.fc-rtl .fc-basic-view .fc-day-number{text-align:left}.fc-day-number.fc-other-month{opacity:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-bgevent-skeleton,.fc-time-grid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-time-grid .fc-bgevent-skeleton{z-index:3}.fc-time-grid .fc-highlight-skeleton{z-index:4}.fc-time-grid .fc-content-skeleton{z-index:5}.fc-time-grid .fc-helper-skeleton{z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-time-grid .fc-bgevent-container,.fc-time-grid .fc-event-container{position:relative}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event .fc-resizer:after{content:"="}/*! - * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.c3 svg{font:10px sans-serif}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:gray;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max,.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}header,.sidebar,.form-comment,.page-header{display:none}a{color:#36c;border:0}a:focus{outline:0;color:#df5353;text-decoration:none;border:1px dotted #aaa}a:hover{color:#333;text-decoration:none}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px;font-size:.95em}th,td{border:1px solid #eee;padding-top:.5em;padding-bottom:.5em;padding-left:3px;padding-right:3px}td{vertical-align:top}th{background:#fbfbfb;text-align:left}td li{margin-left:20px}.table-small{font-size:.8em}th a{text-decoration:none;color:#333}th a:focus,th a:hover{text-decoration:underline}.table-fixed{table-layout:fixed;white-space:nowrap}.table-fixed th{overflow:hidden}.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.table-stripped tr:nth-child(odd) td{background:#fefefe}.column-3{width:3%}.column-5{width:5%}.column-8{width:7.5%}.column-10{width:10%}.column-12{width:12%}.column-15{width:15%}.column-18{width:18%}.column-20{width:20%}.column-25{width:25%}.column-30{width:30%}.column-35{width:35%}.column-40{width:40%}.column-50{width:50%}.column-60{width:60%}.column-70{width:70%}.public-board{margin-top:5px}.public-task{max-width:800px;margin:0 auto;margin-top:5px}#board-container{overflow-x:scroll}#board{table-layout:fixed}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast:active),(-ms-high-contrast:none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px}.board-rotation{min-width:250px;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-add-icon{float:left;padding:0 5px}.board-add-icon a{text-decoration:none;color:#36c;font-size:150%;line-height:70%}.board-add-icon a:focus,.board-add-icon a:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}th.board-column-header-collapsed .board-column-header-task-count{font-size:.85em}th.board-swimlane-header{width:120px}a.board-swimlane-toggle{font-size:.95em}.board-swimlane-toggle-title{font-size:.85em;display:none}.board-swimlane-title{vertical-align:top}.board-task-list{overflow:auto}.board-task-list-limit{background-color:#df5353}.draggable-item{cursor:pointer;user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:2px;border:1px solid #000;padding:2px;font-size:.85em;word-wrap:break-word}div.task-board-recent{box-shadow:2px 2px 5px rgba(0,0,0,0.25)}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-table a,.task-board a{color:#000;text-decoration:none;font-weight:bold}.task-table a:focus,.task-table a:hover,.task-board a:focus,.task-board a:hover{text-decoration:underline}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}a.task-board-collapsed-title{font-weight:normal}.task-board .dropdown{float:left;margin-right:5px;font-size:1.1em}.task-board-title{margin-top:5px;margin-bottom:5px;font-size:1.1em}.task-board-title a{font-weight:normal}.task-board-user{font-size:.8em}.task-board-current-user a{text-decoration:underline}.task-board-current-user a:focus,.task-board-current-user a:hover{text-decoration:none}a.task-board-nobody{font-weight:normal;font-style:italic;color:#444}.task-board-category-container{text-align:right}.task-board-category{font-weight:bold;font-size:.9em;color:#000;border:1px solid #555;padding:2px;padding-right:5px;padding-left:5px}.task-board-icons{text-align:right;margin-top:8px}.task-board-icons a{opacity:.5}.task-board-icons span{opacity:.5;margin-left:2px}.task-board-icons a:hover,.task-board-icons span:hover{opacity:1.0}.task-board-date{font-weight:bold;color:#000}span.task-board-date-overdue{color:#d90000;opacity:1.0}.task-score{font-weight:bold}.task-board .task-score{font-size:1.1em}.task-show-details .task-score{position:absolute;bottom:5px;right:5px;font-size:2em}.task-board-closed,.task-board-days{position:absolute;right:5px;top:5px;opacity:.5;font-size:.8em}.task-board-days:hover{opacity:1.0}.task-days-age{border:#666 1px solid;padding:1px 4px 1px 2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.task-days-incolumn{border:#666 1px solid;border-left:0;margin-left:-5px;padding:1px 2px 1px 4px;border-top-right-radius:3px;border-bottom-right-radius:3px}.board-container-compact .task-board-days{display:none}.task-show-details{position:relative;border-radius:5px;padding-bottom:10px}.task-show-details h2{font-size:1.8em;margin:0;margin-bottom:25px;padding:0;padding-left:10px;padding-right:10px}.task-show-details li{margin-left:25px;list-style-type:circle}.task-show-section{margin-top:30px;margin-bottom:20px}.task-show-files a{font-weight:bold;text-decoration:none}.task-show-files li{margin-left:25px;list-style-type:square;line-height:25px}.task-show-file-actions{font-size:.75em}.task-show-file-actions:before{content:" ["}.task-show-file-actions:after{content:"]"}.task-show-file-actions a{color:#333}.task-show-description{border-left:4px solid #333;padding-left:20px}.task-show-description-textarea{width:99%;max-width:99%;height:300px}.task-file-viewer{position:relative}.task-file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.task-time-form{margin-top:10px;margin-bottom:25px;padding:3px}.task-link-closed{text-decoration:line-through}.task-show-images{list-style-type:none}.task-show-images li img{width:100%}.task-show-images li .img_container{width:250px;height:100px;overflow:hidden}.task-show-images li{padding:10px;overflow:auto;width:250px;min-height:120px;display:inline-block;vertical-align:top}.task-show-images li p{padding:5px;font-weight:bold}.task-show-images li:hover{background:#eee}.task-show-image-actions{margin-left:5px}.task-show-file-table{width:auto}.task-show-start-link{color:#000}.task-show-start-link:hover,.task-show-start-link:focus{color:red}.flag-milestone{color:green}.comment{margin-bottom:20px}.comment:hover{background:#f7f8e0}.comment-inner{border-left:4px solid #333;padding-bottom:10px;padding-left:20px;margin-left:20px;margin-right:10px}.comment-preview{border:2px solid #000;border-radius:3px;padding:10px}.comment-preview .comment-inner{border:0;padding:0;margin:0}.comment-title{margin-bottom:8px;padding-bottom:3px;border-bottom:1px dotted #aaa}.ui-tooltip .comment-title{font-size:80%}.ui-tooltip .comment-inner{padding-bottom:0}.comment-actions{font-size:.8em;padding:0;text-align:right}.comment-actions li{display:inline;padding-left:5px;padding-right:5px;border-right:1px dotted #000}.comment-actions li:last-child{padding-right:0;border:0}.comment-username{font-weight:bold}.comment-textarea{height:200px;width:80%;max-width:800px}#comments .comment-textarea{height:80px;width:500px}.subtasks-table{font-size:.85em}.subtasks-table td{vertical-align:middle}.markdown{line-height:1.4em;font-size:1.0}.markdown h1{margin-top:5px;margin-bottom:10px;font-size:1.5em;font-weight:bold;text-decoration:underline}.markdown h2{font-size:1.2em;font-weight:bold;text-decoration:underline}.markdown h3{font-size:1.1em;text-decoration:underline}.markdown h4{font-size:1.1em;text-decoration:underline}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#444}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;font-size:1.1em;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;font-size:1.8em;margin-bottom:30px}.documentation h2{font-size:1.3em;text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} +.c3 svg{font:10px sans-serif}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:gray;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max,.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}header,.sidebar,.form-comment,.page-header{display:none}a{color:#36c;border:0}a:focus{outline:0;color:#df5353;text-decoration:none;border:1px dotted #aaa}a:hover{color:#333;text-decoration:none}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px;font-size:.95em}#calendar table{margin-bottom:0}th,td{border:1px solid #eee;padding-top:.5em;padding-bottom:.5em;padding-left:3px;padding-right:3px}td{vertical-align:top}th{background:#fbfbfb;text-align:left}td li{margin-left:20px}.table-small{font-size:.8em}th a{text-decoration:none;color:#333}th a:focus,th a:hover{text-decoration:underline}.table-fixed{table-layout:fixed;white-space:nowrap}.table-fixed th{overflow:hidden}.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.table-stripped tr:nth-child(odd) td{background:#fefefe}.column-3{width:3%}.column-5{width:5%}.column-8{width:7.5%}.column-10{width:10%}.column-12{width:12%}.column-15{width:15%}.column-18{width:18%}.column-20{width:20%}.column-25{width:25%}.column-30{width:30%}.column-35{width:35%}.column-40{width:40%}.column-50{width:50%}.column-60{width:60%}.column-70{width:70%}.public-board{margin-top:5px}.public-task{max-width:800px;margin:0 auto;margin-top:5px}#board-container{overflow-x:auto}#board{table-layout:fixed}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast:active),(-ms-high-contrast:none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px;min-height:150px;overflow:auto}.board-rotation{white-space:nowrap;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-column-title{cursor:pointer}.board-add-icon{float:left;padding:0 5px}.board-add-icon a{text-decoration:none;color:#36c;font-size:150%;line-height:70%}.board-add-icon a:focus,.board-add-icon a:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}th.board-column-header-collapsed .board-column-header-task-count{font-size:.85em}a.board-swimlane-toggle{font-size:.95em;text-decoration:none}a.board-swimlane-toggle:hover,a.board-swimlane-toggle:focus{color:#000;text-decoration:none;border:0}.board-task-list{overflow:auto;min-height:60px}.board-task-list-limit{background-color:#df5353}.draggable-item{cursor:pointer;user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:4px;border:1px solid #000;padding:2px;font-size:.85em;word-wrap:break-word}div.task-board-recent{box-shadow:2px 2px 3px rgba(0,0,0,0.2)}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-table a,.task-board a{color:#000;text-decoration:none;font-weight:bold}.task-table a:focus,.task-table a:hover,.task-board a:focus,.task-board a:hover{text-decoration:underline}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}a.task-board-collapsed-title{font-weight:normal}.task-board .dropdown{font-size:1.1em}.task-board-title{margin-top:5px;margin-bottom:5px;font-size:1.1em}.task-board-title a{font-weight:normal}.task-board-user{font-size:.8em}.task-board-current-user a{text-decoration:underline}.task-board-current-user a:focus,.task-board-current-user a:hover{text-decoration:none}a.task-board-nobody{font-weight:normal;font-style:italic;color:#444}.task-board-category-container{text-align:right}.task-board-category{font-weight:bold;font-size:.9em;color:#000;border:1px solid #555;padding:2px;padding-right:5px;padding-left:5px}.task-board-icons{text-align:right;margin-top:8px}.task-board-icons a{opacity:.5}.task-board-icons span{opacity:.5;margin-left:2px}.task-board-icons a:hover,.task-board-icons span:hover{opacity:1.0}.task-board-date{font-weight:bold;color:#000}span.task-board-date-overdue{color:#d90000;opacity:1.0}.task-score{font-weight:bold}.task-board .task-score{font-size:1.1em}.task-show-details .task-score{position:absolute;bottom:5px;right:5px;font-size:2em}.task-board-closed,.task-board-days{position:absolute;right:5px;top:5px;opacity:.5;font-size:.8em}.task-board-days:hover{opacity:1.0}.task-days-age{border:#666 1px solid;padding:1px 4px 1px 2px;border-top-left-radius:3px;border-bottom-left-radius:3px}.task-days-incolumn{border:#666 1px solid;border-left:0;margin-left:-5px;padding:1px 2px 1px 4px;border-top-right-radius:3px;border-bottom-right-radius:3px}.board-container-compact .task-board-days{display:none}.task-show-details{position:relative;border-radius:5px;padding-bottom:10px}.task-show-details h2{font-size:1.8em;margin:0;margin-bottom:25px;padding:0;padding-left:10px;padding-right:10px}.task-show-details li{margin-left:25px;list-style-type:circle}.task-show-section{margin-top:30px;margin-bottom:20px}.task-show-files a{font-weight:bold;text-decoration:none}.task-show-files li{margin-left:25px;list-style-type:square;line-height:25px}.task-show-file-actions{font-size:.75em}.task-show-file-actions:before{content:" ["}.task-show-file-actions:after{content:"]"}.task-show-file-actions a{color:#333}.task-show-description{border-left:4px solid #333;padding-left:20px}.task-show-description-textarea{width:99%;max-width:99%;height:300px}.task-file-viewer{position:relative}.task-file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.task-time-form{margin-top:10px;margin-bottom:25px;padding:3px}.task-link-closed{text-decoration:line-through}.task-show-images{list-style-type:none}.task-show-images li img{width:100%}.task-show-images li .img_container{width:250px;height:100px;overflow:hidden}.task-show-images li{padding:10px;overflow:auto;width:250px;min-height:120px;display:inline-block;vertical-align:top}.task-show-images li p{padding:5px;font-weight:bold}.task-show-images li:hover{background:#eee}.task-show-image-actions{margin-left:5px}.task-show-file-table{width:auto}.task-show-start-link{color:#000}.task-show-start-link:hover,.task-show-start-link:focus{color:red}.flag-milestone{color:green}.color-picker{min-height:35px}.color-square{display:inline-block;width:30px;height:30px;margin-right:5px;margin-bottom:5px;border:1px solid #000;cursor:pointer}.color-square:hover{border-style:dotted}div.color-square-selected{border-width:2px;width:28px;height:28px;box-shadow:3px 2px 10px 0 rgba(180,180,180,0.9)}.comment{margin-bottom:20px}.comment:hover{background:#f7f8e0}.comment-inner{border-left:4px solid #333;padding-bottom:10px;padding-left:20px;margin-left:20px;margin-right:10px}.comment-preview{border:2px solid #000;border-radius:3px;padding:10px}.comment-preview .comment-inner{border:0;padding:0;margin:0}.comment-title{margin-bottom:8px;padding-bottom:3px;border-bottom:1px dotted #aaa}.ui-tooltip .comment-title{font-size:80%}.ui-tooltip .comment-inner{padding-bottom:0}.comment-actions{font-size:.8em;padding:0;text-align:right}.comment-actions li{display:inline;padding-left:5px;padding-right:5px;border-right:1px dotted #000}.comment-actions li:last-child{padding-right:0;border:0}.comment-username{font-weight:bold}.comment-textarea{height:200px;width:80%;max-width:800px}#comments .comment-textarea{height:80px;width:500px}.subtasks-table{font-size:.85em}.subtasks-table td{vertical-align:middle}.markdown{line-height:1.4em;font-size:1.0}.markdown h1{margin-top:5px;margin-bottom:10px;font-size:1.5em;font-weight:bold;text-decoration:underline}.markdown h2{font-size:1.2em;font-weight:bold;text-decoration:underline}.markdown h3{font-size:1.1em;text-decoration:underline}.markdown h4{font-size:1.1em;text-decoration:underline}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#444}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;font-size:1.1em;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;font-size:1.8em;margin-bottom:30px}.documentation h2{font-size:1.3em;text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px} \ No newline at end of file diff --git a/sources/assets/css/src/base.css b/sources/assets/css/src/base.css index 0077669..8b15ac1 100644 --- a/sources/assets/css/src/base.css +++ b/sources/assets/css/src/base.css @@ -52,7 +52,6 @@ hr { margin-right: 10px; } -/* datepicker */ #ui-datepicker-div { font-size: 0.8em; } @@ -62,3 +61,13 @@ hr { right: 3px; bottom: 3px; } + +.web-notification-icon { + color: #3366CC; +} + +.web-notification-icon:focus, +.web-notification-icon:hover { + color: #000; +} + diff --git a/sources/assets/css/src/board.css b/sources/assets/css/src/board.css index 2111b36..2cf7413 100644 --- a/sources/assets/css/src/board.css +++ b/sources/assets/css/src/board.css @@ -11,7 +11,7 @@ /* board table */ #board-container { - overflow-x: scroll; + overflow-x: auto; } #board { @@ -61,10 +61,12 @@ td.board-column-task-collapsed { .board-rotation-wrapper { position: relative; padding: 8px 4px; + min-height: 150px; + overflow: auto; } .board-rotation { - min-width: 250px; + white-space: nowrap; -webkit-backface-visibility: hidden; -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); @@ -77,6 +79,10 @@ td.board-column-task-collapsed { } /* column header */ +.board-column-title { + cursor: pointer; +} + .board-add-icon { float: left; padding: 0 5px; @@ -105,26 +111,22 @@ th.board-column-header-collapsed .board-column-header-task-count { } /* swimlanes */ -th.board-swimlane-header { - width: 120px; -} - a.board-swimlane-toggle { font-size: 0.95em; + text-decoration: none; } -.board-swimlane-toggle-title { - font-size: 0.85em; - display: none; -} - -.board-swimlane-title { - vertical-align: top; +a.board-swimlane-toggle:hover, +a.board-swimlane-toggle:focus { + color: #000; + text-decoration: none; + border: none; } /* board task list */ .board-task-list { overflow: auto; + min-height: 60px; } .board-task-list-limit { diff --git a/sources/assets/css/src/dropdown.css b/sources/assets/css/src/dropdown.css index 462a38a..30e5c22 100644 --- a/sources/assets/css/src/dropdown.css +++ b/sources/assets/css/src/dropdown.css @@ -10,9 +10,8 @@ ul.dropdown-submenu-open { display: block; position: absolute; - left: 0; z-index: 1000; - min-width: 280px; + min-width: 285px; list-style: none; margin: 3px 0 0 1px; padding: 6px 0; @@ -22,21 +21,38 @@ ul.dropdown-submenu-open { box-shadow: 0px 1px 3px rgba(0,0,0,0.15); } -ul.dropdown-submenu-top { - bottom: 0; -} - .dropdown-submenu-open li { display: block; + margin: 0; padding: 0; padding-left: 10px; padding-right: 10px; - margin: 0; - line-height: 30px; + padding-top: 8px; + padding-bottom: 8px; + font-size: 0.85em; + border-bottom: 1px solid #f8f8f8; +} + +.dropdown-submenu-open li:last-child { + border: none; +} + +.dropdown-submenu-open li:hover { + background: #4078C0; + color: #fff; +} + +.dropdown-submenu-open li:hover a { + color: #fff; } .dropdown-submenu-open a { - font-weight: normal; + text-decoration: none; + color: #333; +} + +.dropdown-submenu-open a:focus { + text-decoration: underline; } .page-header .dropdown { diff --git a/sources/assets/css/src/filters.css b/sources/assets/css/src/filters.css index c92b275..8f88955 100644 --- a/sources/assets/css/src/filters.css +++ b/sources/assets/css/src/filters.css @@ -6,12 +6,13 @@ .views { display: inline-block; margin-right: 10px; + font-size: 0.9em; } .views li { border: 1px solid #eee; - padding-left: 12px; - padding-right: 12px; + padding-left: 8px; + padding-right: 8px; padding-top: 5px; padding-bottom: 5px; display: inline; @@ -40,11 +41,9 @@ display: inline-block; border: 1px solid #eee; border-radius: 5px; - padding-left: 10px; + padding: 5px; padding-right: 10px; - padding-top: 5px; - padding-bottom: 5px; - margin-left: 10px; + margin-left: 8px; } .filters ul { @@ -64,5 +63,6 @@ div.search { } .filter-dropdowns { + font-size: 0.9em; display: inline-block; } diff --git a/sources/assets/css/src/form.css b/sources/assets/css/src/form.css index 56506e2..79bdf7b 100644 --- a/sources/assets/css/src/form.css +++ b/sources/assets/css/src/form.css @@ -153,11 +153,8 @@ input.form-input-large { .form-column { float: left; - padding-right: 50px; -} - -.form-column:first-child { - padding-left: 0; + margin-right: 3%; + max-width: 47%; } .form-column ul { @@ -176,10 +173,6 @@ input.form-input-large { line-height: 25px; } -.form-checkbox-group label { - display: inline; -} - /* preview tabs */ label + .form-tabs { margin-top: 10px; @@ -190,8 +183,9 @@ label + .form-tabs { max-width: 800px; } -.form-tabs-nav { +ul.form-tabs-nav { margin-bottom: 8px; + margin-top: 0; } .form-tabs-nav li { diff --git a/sources/assets/css/src/gantt.css b/sources/assets/css/src/gantt.css index 06349e8..def5bf3 100644 --- a/sources/assets/css/src/gantt.css +++ b/sources/assets/css/src/gantt.css @@ -62,7 +62,7 @@ div.ganttview-vtheader-series-name { border-top: 1px solid #d0d0d0; font-size: 0.9em; text-overflow: ellipsis; - overflow: auto; + overflow: hidden; white-space: nowrap; } diff --git a/sources/assets/css/src/popover.css b/sources/assets/css/src/popover.css index ab49942..37af5b6 100644 --- a/sources/assets/css/src/popover.css +++ b/sources/assets/css/src/popover.css @@ -15,9 +15,9 @@ width: 70%; margin: 0 0 0 -35%; left: 50%; - top: 5%; + top: 1%; padding: 15px; background: #fff; - overflow: scroll; - max-height: 83%; + overflow: auto; + max-height: 85%; } diff --git a/sources/assets/css/src/table.css b/sources/assets/css/src/table.css index 21b8ccc..51d6ecd 100644 --- a/sources/assets/css/src/table.css +++ b/sources/assets/css/src/table.css @@ -7,6 +7,10 @@ table { font-size: 0.95em; } +#calendar table { + margin-bottom: 0; +} + th, td { border: 1px solid #eee; diff --git a/sources/assets/css/src/task.css b/sources/assets/css/src/task.css index 2dfaca8..7bfb63e 100644 --- a/sources/assets/css/src/task.css +++ b/sources/assets/css/src/task.css @@ -1,7 +1,7 @@ /* task inside the board */ .task-board { position: relative; - margin-bottom: 2px; + margin-bottom: 4px; border: 1px solid #000; padding: 2px; font-size: 0.85em; @@ -9,7 +9,7 @@ } div.task-board-recent { - box-shadow: 2px 2px 5px rgba(0,0,0,0.25); + box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2); } div.task-board-status-closed { @@ -42,8 +42,6 @@ a.task-board-collapsed-title { } .task-board .dropdown { - float: left; - margin-right: 5px; font-size: 1.1em; } @@ -305,3 +303,29 @@ span.task-board-date-overdue { .flag-milestone { color: green; } + +/* color picker */ +.color-picker { + min-height: 35px; +} + +.color-square { + display: inline-block; + width: 30px; + height: 30px; + margin-right: 5px; + margin-bottom: 5px; + border: 1px solid #000; + cursor: pointer; +} + +.color-square:hover { + border-style: dotted; +} + +div.color-square-selected { + border-width: 2px; + width: 28px; + height: 28px; + box-shadow: 3px 2px 10px 0 rgba(180,180,180,0.9); +} diff --git a/sources/assets/css/vendor/font-awesome.min.css b/sources/assets/css/vendor/font-awesome.min.css index 24fcc04..ee4e978 100644 --- a/sources/assets/css/vendor/font-awesome.min.css +++ b/sources/assets/css/vendor/font-awesome.min.css @@ -1,4 +1,4 @@ /*! - * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} diff --git a/sources/assets/fonts/FontAwesome.otf b/sources/assets/fonts/FontAwesome.otf index f7936cc1e789eea5438d576d6b12de20191da09d..681bdd4d4c8dddbaeb4d4f2a1f58c38cad92afe0 100644 GIT binary patch delta 44736 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 delta 32455 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 ChtR+P diff --git a/sources/assets/fonts/fontawesome-webfont.eot b/sources/assets/fonts/fontawesome-webfont.eot index 33b2bb80055cc480e797de704925acaba4ba7d7d..a30335d748c65c0bab5880b4e6dba53f5c79206c 100644 GIT binary patch literal 68875 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

    7r8$?kb-D3z%-c} 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 F002TuuHFCu literal 60767 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%0DKehr}RFC`2XTB_?==0w^)u1m5PYii@6f)6_5Ydu zv+NIZ_(Rt}Q++LT5!n8!J4x!>sE&v_3*cXat{Zq5;17w;B6$epw}$Rg`0nFJg5D-L zYvw@(goc5TeJjM($AJAZxZHZN}RzBcP0=_>ZI6WVGU zO#Nk-YqZTa3{!84P0K~GsI#32<+_AsXU43wILwZS(8n%S9)lP!Dg$$e2$$9$E?^Nj zql4do#+a8qEP(bD2)DpP|$dp<`TZ#bY6^~7Xv_Lle)77^OsVhMOm(@ z??8O8kA%}ZWpR&2v!7qFSw@TF6d*=9YT^Rtk(n8p=CQWvt1Om=n&5uP;GiT6 zMRvbm39kbp*KB`qoVg12w52Z)T}`X41P>D|q_%K#zuhwb+BpEogY0E)KnSy#@+(m5 z20@LG@LUEvk`I|OIUV^^0_YtG9AElBS!Dsh%k^P9r0moJ25Lkm-gh#igwBDhAOj0!EF&8MxV^-m1U1MEd?H7} zL;r;tfFIT|ei3-Z@gyM=!%Ba7Pa626JRAA`V<2D<{RLRT@0o=bE)XF)nFtUL67`2L z{?_Qz_`Yy2t+I)?9&z#z__Q%L3pnhN}U z_rN#WU)kD59D4whbSYERHY01jM7id50EuI1ctl?<_IT=Y5vP>(sNNkB&U5&F&^kBhm5y{o!y!F+4wdxXoy;!4$W`?_nL(+bK_QDAMUV1O0AwZ| z6j)s}9YEZbY-C^Y)9Ej`aS&~{sXCG2SS3ce$EY;Yv-c8TlrD$C85ATlLZpGP_YWfi z`RQ?z1@zIfa{yqfsUDMEPpwuX%XHdO+ASb3EPi1fBPocvfgsC0xa^CG2SWBPWQ&GS zpCXPti8b>WkYbf#Vg%A?&_UwUsUQE_t4GX?7QqUpKJ2Iw#%)Q4Ft(`9Ja&Yk{C@38 z@%T`)#wWy(kKfEH;ZBQ(m*Iq&L=<)4D7tNO{SsA4Fp4D?(Ex6nQS&f3TK|atgj`fE z2|OX0(&(ZqxJd~IANX&dvX?U14_<~h2(lP6k^H8ep;2HW6oPo?U%v{M>|{sU~;p zLTv$OTx3H^4zNUn4wUfo>j{CEvTC@C+cw+cW*ABH6u@!M2EdBL?1GbL_#e;7YDBas zic?MTazk(khXSyPeDom_I~wkLv?Wr8<%egEfM!*M9^kl$>zsVzaP}S!gcD3;Czy#58RTm?`p)RTS8I<-sC3+*n{A)P*rU!@Npj`e{x9xsif2v zTW`{q3p^?A!Mk60Q{(FLt(&TVe9z z0-!PiOV02JcNeq?AbJaI+B9xC;LB=}Ho0vH(@;Qe0zq~-8ckOa!(u@Wou`p_TR|QT z38H`lJE$G{q1egUX@&v$x7wNLWD#j*!D58GLv^bT+jpdKBrK#SsQsWK(+RO40VA^w z0nA7MN1Y1Fc#5JkwD5TtHG1t;lo=i)U+kFG?1Jh11h9382!marrRE2eZh;JGh`wNO zQA_~n?%97HOKLA^#oG(5*bgSllS%rOc(S%Yj00cYR;!D9G_90{pfq7D4I*$k?byOV zR|epi%oIJ{ou`5zS!-_dnxOa{uNv)(luMo^5TCOItq}2}sxCztLEzBGS)Mf6dzaw< z!GweAgvFYJu&mH(Vl9HJBV%=Jz~~i%nDGIF9ncTET-AQ=fv{L11&K_;ei!iht(!De;ym|y7ksL|^5Ko~B-vSh80++s?unD}bZaYa@ zPH4M$&fw;xEGN3_H1vHW><%-+dg7dfW)F8$bB+h7sThoOtteO(v{&-+iK}r$%G))# z*Nhx^!ZMj1VeG?EkWg+0CYQSX1t96fV9^3c+9C393LU&CHsFCa1q99$`zTMsEWwLc zxsw1|A?k8-m8HCrk6;K7dhNDJN3R9iws%6vTq_}PtR2CZ8TG;ltZ4I}sU+^s8`P3F5QxrypG1-{ zGlr^7$Wsy(lo=xfC~BpKfg<2z4OEeEF@~x{Pi7O#CvqMJy+f+}=CB_$&IuEslB@s# J000000038FvZ??8 diff --git a/sources/assets/fonts/fontawesome-webfont.svg b/sources/assets/fonts/fontawesome-webfont.svg index 1ee89d4..6fd19ab 100644 --- a/sources/assets/fonts/fontawesome-webfont.svg +++ b/sources/assets/fonts/fontawesome-webfont.svg @@ -399,7 +399,7 @@ - + @@ -411,8 +411,8 @@ - - + + @@ -459,7 +459,7 @@ - + @@ -483,13 +483,13 @@ - + - + @@ -523,7 +523,7 @@ - + @@ -531,18 +531,18 @@ - + - + - + - + @@ -556,10 +556,85 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sources/assets/fonts/fontawesome-webfont.ttf b/sources/assets/fonts/fontawesome-webfont.ttf index ed9372f8ea0fbaa04f42630a48887e4b38945345..d7994e13086b1ac1a216bd754c93e1bccd65f237 100644 GIT binary patch delta 19019 zcmbt+2Vhi1`uLkSuWZTomTZ#EmTXDeBwG^*VH1)7Nr2Fi8X)u*I;Y56DT*`;N~9?# z>WLzX4fPPBXTiolV0QPNB2^oIYh@ zlk&r_4pHdGMtB~XK7EQXQGHP{6AJEwg6!#Y7A=$27$?B}L5h;UHhbRWi5HhF@1#&i z92z-4XX3JE`tNiGMN^~$``n3hrUc8@d;s_NP!wLJymf&cD~_! zPY7F11me+9&i( z^l#B;kO!qB;Xq?La?1slqApQ9A)l5?qny-0YCIrm<~h696O9B2LXcz|IY1{A39uvs zsW}?*IC+oPU@@8lk&wsbFu{S+0!(oe-`f%pFOu}(>YX+W}|wNBa4F2CeBf8oYDYo zT-0D{Vv;s6aT09^Y1~Gki#BG7ID|@sIzSPRHwtqa{CD&L(nciupzG!vKdw@R&xTbh zR?Frd&1JQs=r8vd#0t=mWcq1YUT)U>ZIQ=OL6*HhD6kiqUe+;X+veHw^UCa2_S~Mw z&T(m3D0uanKrPTJG|F+gx!jg4zaKyg>|JT!+_J2J%uil>K6I0p%j(6SxdHaFTw6eu zX1Vc+CvHqjRTZOuURhy#2rEcZ=fJIAQ;oUX zmmz)%{pr=n(MI%>c%&$QEGiKV;z7Lbs-6yLZ$S4N1)Ab6Q5=Gm>ZPisd7vGz*fa>k z2FgQDPqZ9IBR!Eh8j(Kb$ZRotjj+Es-sti=c@9gvDrzW4WLLq|us`U{BSmL^nuleg zH0w?4Fr{L-OP?)gJ*(DCd$M_II8})-!wlN$AKCEv{Pm+pH|go2NGYB$XW}z#K_)%I zDHP3`k8d2dOssNP4dNpjtHWk0X>0zX#7$egGbXgu^yVj1P2zHEL$edt#zR9_#G z!IfU(F1Ba5gN|jnHZ)7gnD%4`r29=h!v=9Wr!dTwDKI_pOT=;thi`WOo;9h)6uB0e z6mrFmEm}ECFIdeq%Tx-~T+#)iT67&q4!|HSqeXj>S}8WttlWSME;ICJL0@!8xUl3( zQ3v`hM{|8b_vVAmPzcK;U^W30A-f=~LuQjvO*{Q`sGNpV1;I(u3&BZ3*@4Hyk8QPj z^y-*eFRolMX8XtAe7t=OB#YnKfmVneYQ0{an1&W0Uc4x75-+lGk5z0WrHB)6+40We zWbHHpwF0e>+G&p?z8iu%F!N!wgS&!XPpZ##`0*CAQG+;VA>yyaH0t$)dZS1n3q}7e z&L3}(%l&ezV#B~|aUZxhS-$sUX$*t@?I1qcps+#<@{NNo4@Mfxz`e=xy&wN}Ocd2} zb}#y?@FPX>ab_J=N>vaBWaOn$5TqTZB=vhC7e~3A*>tp=jz$=>B?#vMYz=cJa&(Q( z(mfCS9D_mpOr9<;P$*s$Ka;v$ohrU~>QCY~cN;W!pT2cF((lu*mL4F_i;97Y0;t^) z>!!7Mk)C4+K^qF`!HaEVn%Yi?C-$M-$JYFPy)xyNpSC0mUrct>`Q24B)pFlHw0Ja4 zPC6#e#6b$MKvr5Jfa2vP1l)$9l8ZqCzU|7I0m7l%uEHkVwU&~}<_AWa4>+Dgb{=?l z_erXRv-G-C!lA?0oeb^Nb>{)|Si2C|KMwKQokG#dA(|xi}R{6@8q12NtSs4D>IISp_&J^6pb<` z1}9##j4U4UXGF6G8JDI`=jFvm&q$WfjGaz=Pk+3;+{@(fKQ+{4me&ztNS z^UC_Bs&&d-IbyW=DmKI8qz9?xvXoI_1&@q+t1H8zc39Ju3R#BABK{&DVq=8#45NLZ zD^1nMrebkPP*ZDD=PFHRt?l9=+Yq_Kkdf}otWu@9+?rsNk-wzwX~-_{Ths6fnGR!> z&X~sj-#>vsi{#(43r4k!fWHW@agqV$){OG=rW=r6Yy;DKeeBMsBco6~+$nPt(H%&(#8!rZj9oFW=;A8OWTDHU>a zW~N-BHmWmaDH$+rn*Ow+I_$|4${jklB2CZgF@sp7=+Eg`G z)BX%b@9z=ruaaq0GBsWy{?D*=3IkTBYSikCR9$FAX|v1jpcQlun*!}H478Xk^XTlo zeL3M8IbEEpft8ezBG1t3RdPj!%_PH5W~SMNCihL524+d_njR{xU%U&$B-_uAMk>ZDQfX zwT+Ey6QfIK-FEw5-a}qgdVKvyEfWiHZr|C<2fR2XbHcdB8c)igZQ}k%#givrUb(QU z%2AjHKmvgW*oka$*$s6;pGD0oEcU{ZeuJmXuGl#`xM;%E!3|}>EG?$BwotIP=ddWT zVeoKjCUtWSl||)Iy{S5C8nqOj*clF#X)`F*5xti75TzQ@%SyH(0MZ}`gJ3`iG9VfX zMvlKMp!iWZMB5pt58%*>0nRp%P$EP|By!5-JCB`1I#6UC!1r}<{y72>CP&;SzWc@M z)nA|x8iGP3mzdM7GmFo5>(L9eTDw+@Zkk!=$^`MHzgnN^8jK!96OSGh9}vfj4;(%E zp(NI#f=_oXWZ)XSTS7L*41B#?_Ss4Ye|JaF;FX#_S>|vy0EKEGXbK$u}66$Ktn^e~q$sB?rJCI_T09i(9gYYIX^Fsuu^Om4u$1$R)*#KJvt zz~+VzNfF7IWUz6?cn2lM0mV2=q4*^#eh~^e_;n;x5lTCu7LF${+Aq^o>5K82LlPHY^lH`za9B_yIPR5;};_ZMl z3%?E+EsOzvG$j>4Z2}@dIT=k7m_X8`0qGu+Bpo^+NB(H|CE!E;5CwP1P6-LFXoWf| z6-KPPnxVlBXK|3F%QIAGqpzgI$HsgmBIJZPx>*x=Aut5l#l~cDiLbMRDnuSNZM1XU4=t>5Nc4!Ps0>3vnR=noi6U=z@%+;&u zNvmhhL}PY}=O0*lV&}M>Ftg=IO=rw|;ipyNM^A|-o&<}?K2&haFE7kPqplt&^3u=c zy!_3}@Xblo=AaM6SH<(t!il91Aob3jV*UDG9%+0~{N$y_#lJl^WzSj6T{9kowA3ic ze?nw55GvWt-@cF~Ad?Gb3UHT1r=DndgjT&X-BmG9cs{REmJb-{T<)}KJh;*i4OMun+f)NpDJF}gV53#8$7 zVEqO;56%W>(lY4Kfs%dsrX1uMOLrB9SUsGa5hd+G;Se#hgR6>RuP@+Qfjd$cVSi&v zK+mar`{+g@-n6$$LQbQvw^}rjEc(_oY561*`j*@zdRG<}Ru(dMj@z_(_2y0EY8Et2 zXY}=YW_r_tnhxssN|{(9MzduD>r=b{7byU!N2tU2OE^XTbg7{Ku4fp0hpI4q@{VYUI!-ltEtu#Y4uSLt%I4B z%&XlLL*+OuIAG6$;Q{u!8k-!jjKR(mim>sIckTK(NtGBGedFbOR-#g3-GDn6)^t)e z3-26YuviS_j_JN*<6?(6Z{|#Kp4f3^(4Yt21&jYK#9k>&2xXbV)8|*OKL50k$vb=w z{@U9lhwL69IduN-#+Zj3MvEh&Bja+x0Dm(s;rfBKby9Nty}WAvhWgX>8|GL2_hYFn z@73OCT}c2V{H9i0CY$}X~~uB<7JcX7I0tFuROL+FP5yuADyLJh?|oL0LM069kUdu9uaqt> z5*}csLH$+CR!F4*uUZZdD*~)+SVd`N&*{!|d(#Hh9Im+`5g#^Ne7An%WF^b3pAho* zW8!t;__(4zm3~1SYTHXPZG|rJxVJY^cGGgQ(X-h(7f7-FW?zMjuJp%m3=UvXJm8EJ z^LI2|2$qWVsf7*Ai-#d!|EX=0H=+qEP2g+oUc8OK5sRr&a8C$B6i!Ifz+g)VMaV;J z1VEUukbKl#MM^JIBSL&tJWfhqUPR&wfD$Cufzadrv6c49v6b6Av2dLg#XT|lDQASQ zXQ7Og+n-&#Fw0<>ym3a0tX_Td;6y{&oNO^3+%j`uVB=(qA&ZSy`V&Gkt@T$z=G-Of zykOIq~xh zeV$g^J7CnKMqBoo#FA8VxURrWs}qtMN?X46&zn7@KN^}B0n@;{YqJUIOGDLukN9?c zV{w?ZEw1(`wjA4{%UIPgbBpeWEi)5Mqt=^-Tj)3Y)~bc5!(XY`rf3LUq9C(cC9|5` z=0HroOC80!UuAV+U#0p;tZruA%r|=HP3@!%!44cldZJmA-Pk1!_CoH<(hHdfZ<7B*1VRYbmn4M|H#hP76Y9cJg|G|< zY)un5BBgZ*n^@Y}7Vr#pWh0ExYi>4Owxqd1j5jokUnV|pXx_6FJ(Qam(zIDt(cHkb zj!XQ-8|$pFdazcf2xj3}XDj4o{eb@QF}@NurU+z-)s^F6PZw)ds8=fZ{1NPKjw&hc z{ON%s;!f}^H0-~lxxv14PyDvYgQnRVnlHAZ$)IDXLLRH#>g{rI=@GWPortg zbdRsJTRr^!Du4RxlJ$x(FN%-D)~q0rQ^34TM!{lm!TFZlmS!sqscU^*-lO24fqg3R zFCM$D$^sa2IK9%EhE;51EST(2@SqTWmJWh7Nr_`jVrpa`7giQ|5|7Z2d5SK^gJ`*@xqQYw zN~KMk$J3N6b=*3|$c57ei^I^^!P90BSF9apOBY?{0^o)7>Lw)jJ;f372B|UB1Zpyv zU?n2|4&NgO0+8Po7OpxNk|zZ0U@tlQBqm1~UH8H8TQ+C_cIoK)5%XP3PGzVz$qJ8} zUF_J@l7^Dxkx?6g!=pAb>t3^Ba&2K~e&6)W@hdaNYNrd8i9nJs-aDgj&n@5Bk)3>5 zI3PqyjK3YJ4@oRB-GrJOC!NSCEAjOr=R$0BbWmNmk?s*46yHAUBwcM9$=^2q#G*Ok zow315rZ}U;MZ0EhX$Li5y!?~6V^Sn@Qz5Fq0FhE4sv*#IVK;U2`mjz~N-**);E`Z# zHt7f%zzwK@Kn1f!T7?!TSl`KUX(k~nQW2cI1``Qg&QryP3uP`nr3eKLAPaQ!>SA&u&s1c_2QQtQFU$KXrKWYRppar zx5+9~tyWa}p?H@()=?q*b!uMkH-JUe#g3>eePF)L$gfroH*D1P%MA~f<=4FbzQ3m2 zFCH&;tf&j)KUjM2-ame<_{50WTLciu=|u(pnOnxx=FcaLS?pl@N3(6axA!haLyT5` zsX@&49Q#h#WM436MmEc$J8xkVvsoU)B})Qp}I9ikNhvoOv{Y&g9S*R za+^va9|-9tqx_^ofmO^YxpAXPkJ}cj^qt2fU?E?xTCCO^6rH_QN`)?kt`|od4CwL1 z(L#*Zq7kt8cs+0`foPGGj9{~v zqr`e8c>Q1-Av?qIAM0JNb{#!D;5NF(O+=5|I$fhwpYY2=w0-#L?hgzHqrhHax{u@ zx{Vkx$pfhxDb6C5x~dVdzc->dSXdQ@wp_%*WlMhapNoR8iRdx$?G3zQ;@__c2&u1^l^d8C2T!%#}<#-UavdIM_z z2rV3j7NG7Zbn$nVAF)241WQ~tpk@GPfg23!rBpSbI)(z|uZ}zHc9XJ_Aqc{K!Bhw9 z5CVVQ#1oZ_2Zl;gE*O9aB9{{^dLUv2kjG)?12)7Bo8K75&5<~IylFn?EP_3nj>b_)-k z-p#Dsy=dWXxa<5v{PFP3$CfWYcJpEUxF~)oz9KF@wsp+NdymqC#q;7ypr8h=V33es zE}y$i{B`@9GYy49l*8=}U$5CN{<>|hygVPxxfkvDvJI`H)06#2Y0`aUJn3})d?X>! zx@b3ayc?YscJDsDTlAq7NVELo_K%k{%6W6gY&*7i;RpAPPw=D|W&-+Un4l1Bd1;6E z>(=JUB{!M>;GR5xE0XPasRhcL<~PGqX}Ux)J0!+updieTvQyy@TujC*VK)%$qo%<# z4MLn0KJtcg;lG@j!XP0y&yZsk=EbTPijVGvsE1tf413Fwh^R3Q~xwaPIf`M z(Wcg08MVu54yL79^=g~M?&DH`HBUvr6g&{d-R+C_gW(^d7(Im`iGoEOqKYgqbj}Fe z5DrSXg=<6z71BgBrL`VAr#0KJGY^~b1LIbY8@Cz-71=$r6rSZPm!zj>^~_e7eSL=B z5!_U4Hp|Vu%!d~YfUDeWJ{;OOtdFnnA@S!!hfoTA|sB$*D`iX_Epv@Qb8!2=mTmR*YWzFY%QppAug=y>_e+qhBd>p?lob#h~cF zEWYgW7guMadmU_iOhw}2Q)27s+ip9JVo%Y0Y;4DI2U_h46jwXMw^77VT^w|Z%N>9W z0%Yz3UNDU;JQgCX!2uEWP+l;;hdkglQqvYQWr+}LCq!6)luJKB8l)86K50ZX*xGaDw6p!<5V&S&}z3Rt{W? za67`qqGY->#GVngfjkR0g|G*s79z+NN`gO}-S9dEXriFX8_m68f41B^4B3U}9BEdM zGXTKj<%@4!KLLxo`DLp&jHlO4#~Epis%Pz~Ray`UIHc`Y`{olU)u4h6LC?QGt6HIC ztJHI7M>?ZQGa3i9t=7;gsHf@M``stKDN6Uetyv`sB~z*%E_?#o(o5p;PXyr;QOP`X++XZgx8T;d=<_oh{2%HDd6)@xJ>XY)>bA84ye zGlO>97*(bZ*ZqC92B(nz`t>>b1Tt$=I73QG^EMmQV=Gm2O600o-RCP)Xo9<{-&azv z(Ek-o=v%rDC*hixFF-gFe}eE@66k4$*HUs}T8K-`?Sc7-WXqA6iDD0&8CthlPXk|Y zqX_NI4wxnOfp0$d(V1ll>n`!?>H^~jP4z! zoFbOA@893PU*IVE##_Jl%KvmXdh~%O#My}%cifXH_HtZA!bzlzZV?ZQrxHWgsOfpD zQ12xifb4GvtS(&y?VD!bk{ktg%Il%6D2mI8wINFO2}E@gM#fvb9JukyiC2JEGjQa2 zZKxdlda!U{K}2Z5%TNY0tws#KP5hTwJ-dg#=Dul4n!9dCz&IFs_=CsAuP;%k z;MY}X7^+5jqM2P0abQxYubBS6hY7yPw#C49N_#kir;f*rSnru&Jh;q zN@!h<3=T~iPk zx^|dN zCKOZ^xVOG1ifhWo4$K`j@U-}u#y7jDXW1L4#q%HSaHhK7`uK*Khwiy)V3qkI|)kSz^{nxm{d}A5?3UCuM>(OjwnW|!3CU;xK(mK5}eF%vV8+MS%`Dj z5F{=zSmERV2e)Ff=bYq$2TEK7v!L&DaMqAHkOGGzuxH$!b+6ZyWJADgs@}lRL0jnr z@mx_=6>|oKASrtKm{!cAjkyD&H`Uv7dpTVuh2A*4tYAQC(4|Aiz`qn5Ub1A(teq2X zFv!0j^Z4|tA~ux(wx21g`VdW?Qczn{oMNp^uR64Q_mP2~oR}&_X%PyG?M+W6*Araj z6cd4Cp^#b!`@9&$E8z6BsT4$8SUs?J8RDLXA`L1f8y(6}6uhF~zs6w1AW7J$h9lk2 zhJ%thL$bHQa9swlLvlQ{5wPJvIfg3$p-Vsv@ifSNI(_T|lFlD4$OTTqF zi!ML@v}n|wBdbtoeSCi(qJ8})tnD{exNAf{x)tfY^+kCVVUsBm z%PSh-HW+im6;cKzAH@b%-@dS4QFTob`4#l8DVE9Hk&@!9tfGqYiabqp#;t=J<|Dbr zX`%b>d*B9ZmNlnG&zwNteu3^^&7xa@zzmfRj=Zm7*QUc-Swsn7Gjd1Zy$XqH7*>Sz z5*NgKN8G?g;R7#ufrTAHWx?&33rr>%&QE3}i=4qkc~)Z*K2Xkr{hXZCKyEiUt%3Vs z6Bv>}m5zeRNR2s-#;j45-?H_KB}>15_TeU{jNt@@ifx^Z)}U>N(0xjs(HYd~<)%U% z*yOGGhCIZnWpXg)V}!Vw0snGwb-LT5R{g^_&|pxiJxkZ#xoUcO$*7x`ZI~P|IY)A) zvQU{`{49U;iv3fY9-LT_mT0W0>_5z=?m2x$G}5kz zFd>SLUEh>c{h9%5K;b2WCP7wRUO6z_5<`+1ZGP{gzFH;@aS5#iF*>H!cT$^8$091U z3-Za4BtG0+e=KAs9wDlWgkFe7lSt^^{67^gB(>vWMv^y`4jxRtSoHGC$v2d`?++f7 zciKtQ&K7tb>35z=?>Uj$VjJntaHT&Za3vpALXF+rT4_mk26BN&DXa>yE!oRSl=Bq=x(NJ3N*BCTFYl4nO!D*^uoovO2RUp>}~ z;Lh+^ISOKT*PtiV5LBB?I+EpZP1->iB4wvgMk<^15xs1|Gt)xXdueVGYLYZ?k(W#& zG*wydu|fmA?m~~Ee6T8w5|7aonT5NL>NE6vP^%^}pY%@OpqNFy_?iq zN?ucS!z}$x;xTR#pp#UdN$iU>A_o}jCF>`=p+#Pn>qe~Wgo1j&RLE;-K@vd6eV|Zm z%<#3hO5MgJ^k~YL(RmO71prqZBTw2}eHk02n&f43=2MuMjTzwjp{yS1c`T#jq!fH? z#jPH}dI`#*KB?5&O0;6J9b8>9;EKu6K)_jYBqGl1X2H%PMR7(zKeVv!2&-dtZulTb z`G01Z^@(_DYT~}ceG0Wf2e&lb($neb_Ks9K*3k$?!L~#j`-{=h9yi+gOO#SjUbw(2 zji58aJ))FwtJ>C~IL%y8btq0S7upldg%cfMFuH8dqI9rcFWak({Pf2Aycb&Q-aFet zO8@|R<%|5{L*j|Y^-q*2FudxiF|&>v)NX50Q6KN<#2x#P_wmOG=F(oj3Ufc(Aca{7!A4am?V}vpt+_{aK_xE3V%MqmVt>M=dkyHXj~r5vJ_@PNKJ*q1gX{ zrNV(qts+rpI{2bAB&9Tnhv0yct|X6cK;FcD@i<Jp)7%!rRTx#VG zvUL*E;1C!Vu?K^I#lwFUAP2eGq9>z;tPp`xJ!|HkP>6@bXa2QmQvRrZ!}W6pq(183 zF?_-zOTIZ;5u7$frn<2-whRsJ!0l(niQ-_y?*g5ItDj_Q@vW1|Z&@$?eZ<8-{&Dzv zE4p1NBU6zy)leYNViL1UB1jQ7IAEo5R6E7=I&~^>>#0)$>cz&}DfBSC6y=DYCT+-sI2%6!ek}yevNlZcV`Ua;#5UdMwF>(I~ zqb?^2H-P|1D1yT(taHF?v|ZH*9s=HwQkRuBYgSrTUCM;8JuGgqr=fkW%6`RbRyWog z6{`NI^Gp&xH3(`tU(-sVMG&b(G7n-7V zZuP>O`^9DAN_7h2M~zU!%T|nnMXTZ|xFJ0~Q`z~K5ukzMUhoIHe5btK19moCVtOFzOcq1YDoFp8>3vFul>9%98QzQu6}S={6)&>tel zi721^7a^n?$xGEp+A{bBl-_doWh5I*>X9Eogw*5V|A&w~`9XP%qy!GyZ6eRP7p}CE ztas@ml#_uNyV@~#^^@N6)bq$_C)mJKcXuyIs3ew3uK4N=h^&_wTX~d%=_HcV1*>n7{n#WE)K2>;p*W+LAZPz@Apnd#3upWXDF{keSy`n}+J@xq_gfBxp+ zz=LnUT>tV*hw2aAbLjZtrw$)IEVh=k9(<+tl^w4fdv)ropZ#UnYh|w;dENH<{jY!c zX8xO_-+bzb`pBJc9erE-_S$!tcUHdh$-A$;C(JymKDzGc`M*~E_3pp6zd!whln-`& zSoz`SAJu%c_n7h6z+=m$&(j}UKi=~3*-yrP^4X{6PisG2`{`%L&BuHEZOGpqJK1z{ z-^mN7%1_;T>Wx#seqQwXwlAz-)O@kJEwwG)_Q~Iu{QdNoRbSr!57|Fv{-gb$H~y>S zU$32B@D=k_>zVvBkAB_M^!5E;pa15CZv)@%`}XIv&EM63x9fZR_mjRq`GfC=b?3^? z{rcnD^Yr;`KiPk3_-WHmr+*Ioyzb}Izs&t*%P+@&xo}~@fBwKyfGt8VYkBN1=!0|_ zy$;w5V&v32l!CrHnLmLkE4`y-%WLRc6gsf-bu=G^7gJLxJNQKxQ?nrrz>#K$kgQ_x zl?Fhh?E$%fR9*zRFv#>%;M3exV;cV;%w(7+` zoP%?59?r)F*pCZw5iZ679K<0U#t|IFCAbv#z&&vp?uFs4WE{g4xDxllRk#}0;J&yY z?vHD69j?a%@IX8WH{ii|2p)=uVThl^Bk?GF10IbnWAIo!4v)tZa3h|GC*jGs2~WXO z4;*?2W$OfHLO4`JF2&>$AeSJygvcdKE)jBxl1mA>l)@!UAi@M9Od!GpB1|B{1R_iz z!UQ5rAi@M9LLedpB0?Y{1R??uLO4P|A_OEtKq3SrQp!vX00>+NNHjol1SCp2i4q8S z+aE3jB1#~lq>~cTNeO`{A)S;Eh!O%(LLf>ALA6P6aieM2;d?`p|0X^R|?RPB7lw*L5Gnd=rB?Y a{Y8oiTrq(w))2tr5G>B&2kvjAsQ&|VPX)FB delta 3717 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 b%7NbA42BxTcoSrlSuMv%Lh(uG6hi(FwBy){ diff --git a/sources/assets/fonts/fontawesome-webfont.woff b/sources/assets/fonts/fontawesome-webfont.woff index 8b280b98fa2fa261aa4b0f8fd061f772073ef83e..6fd4ede0f30f170eecb4156beb7235bf01fff00b 100644 GIT binary patch delta 61681 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 kgu|{=z_EPdwI%aS;AX3)Hq)$ delta 51819 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 diff --git a/sources/assets/fonts/fontawesome-webfont.woff2 b/sources/assets/fonts/fontawesome-webfont.woff2 index 3311d585145b1cc1b9581e914acbb32d8542b4f5..5560193ccc5d768df40766ba54491f1822ed683c 100644 GIT binary patch literal 64464 zcmV)4K+3;&Pew8T0RR910Q=AY4gdfE0vpr-0Q+$O1OWyB00000000000000000000 z0000#Mn+Uk92y=5U;u?`5eN#0*<6N{SOGQyBm62nVk>KX+wfW(Hek zvyp+(?)D*}+YmVX&(<`Z!i+@NrNIkT9jIaB0KojcX7>O8|Nq%XMaE3R(ryC)Kvh-$ zU)TtXtU;}Nq=b9uDJj@AW62eX%`$1Hntbp{o=%*VFKp~;#HbSWI^EoF@Q}N5qQgP! zXe3uW@<7Kk8y+0!#-n5DD^^Z)ywHbqdfzz6!f3GQI>kDq%MF`XHqXMmk(Fg9TU6mJ z5M(qrZjoUQHivF(b8Wk0(6O0pX^++qmrIy;kEUaaX2bR~0w&v*wz3D>u*oLFhHYMk z-h+bnPojwtd+Pcva?Kg$=$o?syro@!Lu(dOP4U%LW=Old_&$q9xu3I&{GCVKrQk^4IQ4Tt)tA5Wvg*01hHrVb#Mm_>WXRGR z`?Q33zOE|X`%F|-caNkR-DFfQz|-!WSGoy06FETJ>?j)q2?0eyOca%{Fo;x8K(Kpe zfjxC|MlW=8n{F;#yLMf_?N{#it6%^3;$6@)y-(Q#iE7)eqauutrbx~vq5pnA-JH2W z&=!ieLg8~8Fs9a%(Lb(-HLavOmXgCbgA^D7D5-{%jCaS&+2yqLG5p-|0rLPrSS7{I zK^$C!%Qymtr@8%GQrp;I)QBCUMu@~l)Q(X#Xc5@aqe4pIPEeVGl72)HhLxxo2+A4t zzlC5VGYg~s{~P*OXU!~EXYTsUdnyK}$f~v>8`A>m{gr^zj8huR>CuTm0ZTlAHgzZOuaN*4oL6!laS-dWDyakH zs#JCF_4=&#_eKsl2@}V##?&zb+h&a8n3w8QjP`w1^QMu*7T+*WRC!&AFn^4|9O z&w^?irPg>e>A^Y10q8(C&<%70oev2*|7TNMSw7MxEI2NMT}Hve&-MVQDpNhKlVXF|8J0=f+Lyon_s*X;b!*R=x%!LBDS{B9Ok8&dYw&Kw zc5w|oBU6n%veZl%Yj`8|*~#K-=>~)l8JrjL$N>Pi`7c$gD?kx8 zvm75Do_$Yg$5|gCfSKnCuySH(Y?`Wdexg^xOLy=&8d%l+{9~huiig{pHWfz!sFaif>vSC_%Q#!SdK8sA=~xto)AG=_bawA2T}60= zF*|eArIaQV!SZ}8#zk3B2n+P?e{Y$qzlAx8+LsGuH(Q#4q}SzkoQq{0>Ka98g{r8o zAFush2DVupQrUGRtz!#8LpAaC9-kXzP6t-|o~=5ih!FUK4-&|^L~V@B97roNBIj~! zN%B9)Y5ZT5-u0%|Of@Pb1l6_BZLIhH_=#=(|6<8j?asmA5@hjbO-Ft%ZLg%CY?=ah6y*p#&C14+Q97E~OU2J0)`#BGSJdHGkq!Sv? zjEBs>e_EvZ6&-W!7{opt#MRFIn%#nO?AoWMY0?4*Jt#GPE>hGFyJvCcN@{(-88l9CiBokU_O zEoWapTlnwa=k}S+lbM4~rI1NP0v?B8m=GqI31R|d8oH(`vLp&T#}NFj-&?=4erx^4 z`nB~dc&+@O_}#SeB>q$PiJB_+DE0Y&(m%b3f^Q#P$0Y55`)Oh6kW#F#N>2dTABoLy zej|Kxp-WLO*uP4i2gQWBl3_`{cH4r%pg0siUJQzDWl|N>kyk7^O)0hTVo>b!F5)D6 zX%jA+G*-5*9T5SX#+m8{tTGpaPj&}-UA$i1&EvH1uc0-gW$nD zaFoO?(kSV@TOhYv(Ed~nBD8KK1OfCsF=FkR9ngcv#6 zg`r}sL>#FtyPVe8bHNbs6lC?XOY>?@A?+c-(^F(+jgl;&etH9WVu{I++aI{9u-XbV zk<&s(N|)py# z{=Ok$Z>Ls8g-Eu~?5ds!_A?G5hx1vp6t1%NskL=Fn<<4qaUnN5eot4u0|pfFl56Hi z&K;jOUwy>^Ryk$`DAN%Ji>nlGb@Xayx41i8)q=W4^=c?63NMhARDvxTL3Ve&NFkyl zOeWLWb~SrPJdOpKiJ~oc4xa%UKFpA12Q*`msC_;^UwHI)liQYgtFYyGOcWCBVGbrH z1-H*ye{=nMyU9m;e0-1(1{)QLgUpsywV~7{D~_*e_?fw?_77eHYH%O>#hVsd6LH-z zL%W?&%4^H`TZ8`FeC8{d_pH{P}i3orrTQwhMW9E#f)3&KJKQN(TI1U06-J~Hb zX5Ww*42*{O`P$uY@EHWI8u8JSXLz#~>=k`UP^b%!QX6f5Owt_vIsi=SE8C*ooW8f0 zIzrHNtHXX>H~C$XUoqb&ZL}+n#D3x1JnDtYJUoiP0AoOy0ghym zDP+wYZ)K6~iuIx@GB+%kA+$+2zt18%Ae43$h9f@30#T}K<6#*D2fXwTQ;~inVz50z zJ^tBz=E?rJ6gg$p5a9V9w`C!SWF7GHuHk}~aK+XD*QAykGzFCIXw+yCP>(!foiA@@ zgx=@9h^WL@hu6iC1wxMNVdBTI23mK=^(bGFd?dIPSJWZfY{dN}vp8-YaxEzI17mrl z^~vM(171E*5{vEmD7N_svoR!FUSt%mi8<*z6RG^adK34LSt*iAZj61?AsPGJvJ;#S ztBX6~-*Jd(tEaD~}_t-Ej8QnL8dK{j!2J$GWwb__8#a=gxR)E%P zj4~;;K}bX#>1&Myzdy++x>|A7Xwi;_p6h-d5C@|g6=oyLO=QS0j)aLS3hLjY&?(N5 zDpiEUR;nmpYST?i)n(0_hqUUUb3L(XspX1@xngi!-9&4*UmsRQ7o99-vQDhKVi8kW zF@+(klDt@UdA8gPsI0{a1@HX zM+M}sZ4&}%jkZNLOpQp|!2}_z(MS)vOI@u8TISnCtjmIH#!4nfqFr4vxdFmpEQi^^ zj3X7%GzQ14li|SS#x-fWiCAfx6)`JG5JZ70{lFITn=OU<{h8D%%3i;$(-?7Q=2Gf% z36Z75SfZ-1--e`beW%-7-9mMTp>*b&*I#}_0@fm>(C#ur#xnEF(tWheu~Q&W zc+RQnbi$c~&p4tW=tL|LXk%inF!jte)2vdd9@<#WTls)!T>w|>ppMoq$P@U#H9hT(tvD5l?_1rgVyTa4yJJI+6Yw2FtU=Qb&fDh z?YnLh1iM^S>+w32u9Md_HgS7nf3Zl5YBIlm``~a%vTbT;z19<8y@u`Da0o|{)?#?B z^%?Ila`!AYp8<)5pTlZ(9ll!h$}gJPvGJ8b9t3z#n~Kz7!f3Q>XtQJ%CX=MQ+@K&g zU`~qCwWVgWJP%IUMwj;4Iw-5i-Fbkh;83-7>CM5cb+ndcD%n|; z52ZR;59GUJ`AqxvH8=4&jaYkYvJBh%f$^tGLZ)46?<{GDY{va|pd9 zW(~_FJojQou#Dqb%8-ypiZfrkmbN8Zra8at{hY0{+0AX;x24P21clE5ks{=Lw|39UH^_0&&WyiG+FCWIj}hu5Ep- z+T^Usw9*&DecV(lkDc*~x3;mq@f@zYqcBtz5K~!#)V&DzZO-|LiXhba{qN&^+7;d% zUF`Bi8QVvy8Ahq)U#Y!}86=c)zUak>NzKDoo!eY-qkE_4&&x@j8}Y^k4P=i94|=4p zS76(BG`>~%o~63YX9GMDWFl2iNl6Sw~3zEEKK0uT@il>87A<6sD>|5q@Jxmi#B}Q%hM6 zQ+d1q^)SF%#;95Ir2@*E*?tCAD@HswJi2=I9ES{vDb(+ZgtwOjJtJGaw!>GRO{KWn z#2)ZI6-#KJCXuymv{pSSfZ}U-%5kNqvAdJ0(}%saV>EDIbA@J~O*m{8oGzIcFsE^q z#pa;zk@Ct{32Q8js}SY6x#958>}&~^KZv3+Ba|_^^o7{*^fc*{PA@;RMJ^ZisoOi! zu5?~+-4_&;%18_#IGtF>UfDKvL$@A{Ol0y|JFuF@70rN1Ls=7Gc(RN*cw=GYV4E=Z zbcsOhtlvO<;N*QC*-{_CiqCIW@NFfUS?Th>cR$3J2gP^HItkVD)-J^m^Q>N#Wm?RZ zE$$xmtVdSHW} zdIOa&y@NT!gWkvp$}VdzrOtc879s&8+Nx$IVFok zatt|u&X(ntC&X`y`?I95)!<;D1J=$T{L+g{>>mApnVa78Mpy%iV{H`;=8Bv;Q*&pd)hSMvz1VV`N9p^6ri>D?yehdiP-xbHvclBJ} zvkpc_s7$*HF_IXkql?((qLMo`#C3ojW+=C^Y;V3!I1KM-rjtvOV%Qy?zgj|u@PfU) zc?UyI@IXKd_l}vP!Vi8hHWx05spb_sR8vkHy~AfMc30N{0{;fg+8ucy(0{-QLF14F z-iMjh7{pbE8tcP2Mvyy%r2Jbr4sTub*3e>Jstyb&4#wItH!jax_s$ zI@C zE33P#VX-aXZvg72IV+52)}GDVP{zcEf!2Xd+HCf}&7)Jnl`QFf@cX9p7)AgFjzlDL z9uP}yg@)BObVuwY4Sqk?{S<;%iVCg0a5mFCwlf)|{q-X*PE%Z*H4u}{!O+l{BZ!dh z$iM*E0I~FZR9tTy;4nj}jPvJlB*LAJ2scHG|4<_3b`=B7NkHP(kWx194gJ0r z9q73{k2e^i-sulXMlX9JET5IGy+javq}K#2y42dnOLJHk!iGN25J#7l=T`sfd($ALWRZnag1x;lDR_#)q%!7*VRkT>#Gbq>_2@zux(OEX zA_|*-eh^mq=Z8^B@A5;0OiHp&#r0P9Qrawx((+4VjwJE>hSsylgjtk0g62|i2Azu5 zO{7QRsXY)6wvZouQwoZUCsAOO-4}ka33;20G&~qe22R|x;%OQg!Gt4bseU6WlL`)X z&83VJuom*RhOe54mKBt(zX}sO2p?liU3Bvg%^g9eM|q9IeEsvGql1|BABnO$f}q(8 z_>8DmmePN{5kIRpD%V6a-;}B<-wc}6AG5$*DWc60-s?*IDWbbds1=HvTL~BDK(cuE z-Q?4?4YqWTb^wgh%ylu-I4hU6&kA^mIrX*adn~5L2_pJ**W0(Vh1{ts6bEa zi9Ezm9Km9O)kg|hAC{ruhiZhh#LQH$_ z^tDjq34m^KOxlY=n=z?cqu)Nbvwdv!(|sPPv5V> zM|LWE$kl7J=1sD}o(P`H`ho`3o&mq)$kAkg5tSV+A7x!*BF`a3I(|zL=RAgwT!pEy z=siwEr{sC>pVryeE|GV8LCzZR?EM@)zzJXXgLuLWg;+!b&*4xe9EPnTRE2P&P0#Kg zyq2^A)b;O2Hpt5LVYQ^^5d|gGal{R!Lm|M@`YOM~G=)DeDp~zv-c`LDh{lyt9Lr1~ zJJWMm-HYTo?JA#E>ZU9LLXN_WQL**-VAQHK?s{O`@7U828{d1_%SD}fPZ^CcZP(6l zCK`LYnx%&EsGh4cdj% z`+?BA&nSZHKB9Y;>+nnUA*c5o%JtaYWTBHY_g}}em?J2UO7O9il0X1w@*v~>Z>?n2 zrJL?|x{ey`+=j%r*njYEcP@oS(SdN3;YZvyLs!AnA^5My3uJD7{)`m2 zN6`kks?sRU8&6B@{L=~j#hY2XRAAw;z46m<@*`1Ywe0Y)6FEa-V5!d$)11MdO&~Pqo9FUKVq`$Gb>?;3l>0I%R~^UVrx5-!9CDMOCEVU&h*z>D z$}!$u4NvFBgLBiHsZA4qn(juqKoW9=~ODVcb%#Te6M7n1P8X{ z<4D4Vu^>B?gL8<)263E4{GRi)HV!3&sxAehra}}SUZ0tBd=(4qZqqW7hBAgOm+=B_AP5fMSDfJ^L-iy7x0Ic#dvcb1``lCw>y z$Ckqw%w)64S4F~n#yDKL0%k#PyCDBq@B#$4a)!{PM}AuvPHaC?<1%r;ZTCogT7wT< zTPr>&(##2Y0?@f+J65R5D0zhtTvFK!n?lpVqPxQ^7kV6_7a{N~kCR+RWflTc+(MyM z`(8Lts9a3ykZpTfWHfqOOa>*rTPtliqWR+y(VQ;3*VJS2I4uQ>_6M5hI89rN_&v!@ z?WbTA${qH?v6tk%uWXCtqz5>xAi)FF#n&uLINVGRgoJQVL>^>}vCRONUJ?hgP?2+p zF5_SqqD#S46buh>C%|MI{KQcxSv^c>lupOfw8<^RY`wgm;L_>e2t{Zy(59M-%-A6a zQ*Mi3Ta7?>_^6!>rh&M?TH`GjAEcZVnThAIR%Hj7^`>ZWicjGqh$SRAVJC$?WIW=l z{^mVSE&j7flL{5jyb_cO`>GZ!BnpbCkRuZlh}!uYM5d&OUGz!`#HS80V0Ri=9cw>? zJ4oES;Kq5Y&>#Q-jU(D_cm{VPQW5@Iwg$Py>MjbC7gSR#SbEQ>NYi&8#4MuW(~oq# z{a0!WUDy25Wumynz;FdA0j$8{yyLJUH$-dXD2g@>Xt2%UXt8^kE5>2fYgLB1lev!^ z15JRxg}>=#L!Ua{I8)*{rs-i7nhaz(YS_hdPX?Cd2YT+CZYjl^<_Q>I^xA^eF;LrV zS)|U@vQO)X4HY)c{=2tcYU1!coA0*Z3fg|vzaP6`X+?{Tu2i<~XJVx*#)RL0w{;NWxUFKhd54dG&CBQ1X5a_6r<2`DSEYj4jLIXOb2{Fet@b=7nsRvSsurgF!0 zg}%O4H`=1n)82TCLEcDk=r+hhr@O%*m;GtI$=24ffXUqBTLEm%HtT$A&!=ymx0P%7h;tlp@r=)}@{9EW1cX!dO zJajluO>FfFt`~oFbZ+qqjX0@DF+esCYh8cdvx`RLJ-xilP(Rpk zRq;v;REAPc$~0hRDDF(j3W<^;c7|fP`D!83)A=6=sywO3svfnXQTZ^Hz( z`w<9WQzD#Ssz2Qj7n#TaFjI$;GRa??T%j<|kGNN!@91V@OwT+hA8Dx;N= z7q*dA%q45>jWSHP^%KcwkOnuagEe^Dnv?nP{sF$kow-QLT*X1j;~?^?-$`li7q)wqR*c z3TAz3rZm)gB7q)>32RIgze1AXqZC@p&`WQQM8ieI9d<}O86=$0M@){PgEJ*YQxB}d zJ}E-83XR21p^6sZ_8>*ZL1I(%#k6fRN>HEz)D@{VnvNQ5Vf2#Sd(P4ZC1YO=hrISZBluvP@f z75olgIL00vXwuHT*wxSnHqICXFv?y;E)3pJXY+rAQ(m-ny_(j zk3dJ~6L16fz}&T&dZF=As3Q&B_Q8qRW({Q&r)kJB;*q=SB3o=Y!PFPVhCF0W`5Sfm z9=U2VG$wWW4xiHFVkolIlQq)5U+6?|=MAo6sn=7#vU+!s$gZeheN3U;@h0}+b1;L_ z7CQpSu67%uAF+9X#5uachz#+hJT^ikX^Muk)D@Og9$7a}w!hTW`KGFpDdyi^TcCX7`yH%|)1sc8?*V5Jy&kX|>`SqFa7SRm z)2nKMhv#WzET`X_R8?EZZjNb;A2_X*;BSe_KrLUr5KU)=vdL$RC+R=SFSl(hZF)PD z^_-}x@;dMK-knNk*qDOmEvi(j(s>`#Wc7bZRJ8e(R_83VLkVGwb8BI{^qWCc{1_oO+-yyxJYC?!5nT81O`10-Rc(9o#pH0U_W$|a zYhj2W0tjG$xgy?|gjo+#0w@$3XC01d^z0bKy_X4QabG&{5oGeSN2^w{dUfx-(-&wA zJ}5A;r>9z4{*E(&q3R8~p}_zF1QEm#$HUJB>4?z#omfMEp}#*oBzh+63O9Z$AhZhcsXN4kqmR>t@=*)-rn!U|f zGDev-dW`Hv(7wqAY4Un{!=p)D79CgkgJb)-^6owj`gZ!o z$F(l~#k+slVYE7lK;la%Q&=;>rBx|&7u+eP9qchXwgb=2G`l^dUSzY#H&1hLlro6WV#7!yH_XOxC;3kRhb}FTmAEOIrTD zW7!HM8x<%^sE68?VaFS0!{WL4EKfeLOQobG`Ywt7?9zl_DO|=9?EDFHb-zMmg;NY` zDxF;M0c*$40KIF#ZFpwnO_p&p*<7&wQp=BeoAh4nlSto5#6Lm8g|UoSs+nfU`ntN&+rf>X}XieWBckSD21M%6G zgOf7OQIA)ktWli6I;HrcH8Ff%?^Mn(dM~9r+cT!}dDssnM$)Og>*TGgro(i`ZSw&k zw!G$EpHv5Kj4R$YV%Sx+8N+pO4xz&WAjl@|goc4ZK~_Co6&k}`Fb4~@dbbmtk_%?b z7*V)@qp0#*1Wg_+m8;^Xp2Gp$v{@f@I#d6mD;t~c+cN~!v6={tBQYIf9TD_Vh=;Fa zkV7PY3{y-1VhoUBVOqU4BmPb5Rmzwtw)Zr$3#|Bu}d`&$PET7QRtMsS7OaqSc2{wQDP zZ@czHxS$DNpCF*wEWb(z=6?zvIhP3?`YhG81*y=Aq^un-C!me*bpfloME!a5*lMbpp>;v(TQBIyGtW~AVNLyvk)cs-4%8WfG z8?@fJ<9{AFP{JDvWHE@QXbOcH{(n<#Z{XP3k%_ZYi%z?jhnxrDK)o89FLnmZH5|KK zM+;#Y7KLGMl6zBqf(8;d>rU!@AdtJzByPp#`ksb0xM@6^Nqr-Hs_zEnIQM*SoIbf- z!`|0=W2lpJ#vCE)GnS16pV1`dGQ5QDJ6k@miJhHdp<>Kk>-v!?l2JtkjSoKeKJABK z*GO@jk>y=wb46Y8tywSvkhcCkEqu+Z$07Z1E+b;ULS{ z4zVoC@K|J9B4 zW^S$VRLprH{0+Y8v*H&?Lvawb$d3P|?9U|*D z)V7YsFbnI!AMHEPT}E@X?wn>79YQJ1^4K0(Z3(IPa~#C8Uvz>%J{r`?W!7W4E^!=@ z8ePwwHxP|rQrYdA3aVnX{o*}W+&43Zov)c#oj#YrTXO0aj z8kW7Kq?kfC^da3YJ8PuV&Ow4dL`0uTcSbrjWypcvXFSZX;UP;CUT>iCOV_P=n)=L|8E0lrLnTC%b{AE zuiCw(Dq0hUbFcp_^0wg^Qbu`);wmPizHe(4Qls=bS5%^9z zSPV2hkGtvGGq$IZC;h15qmu>Ed^J?6VpyBbvxd_?aLDoVw~tj!Qms|SD?9kOxuQoC zqpd_1d4_8gH4&wkFDiSM@trZLEY8*jpMy$m+W{6B&7>Zgbw4^J`OJat2%WJz!6rk_ zjE58Y^=ie}Qd#VeK0TNv2?Sv6z?+T3RO-Cji~X2<+}UeQ7fuFrKyF~YG5owldy;pq zM+d|U@)mMaS|cx;GRifQfa^#(w!RH37kxfql4H#^tk#j`=Z=|VwJlMiFDG4Q_xP3P z*SSA>KYbxV;XZmZG`?wqw`7C4{poSLhNQ54%TMWrH<0IeERv%yvM#S#WWI;EGsg_D z;@5CcB5QQ**LKeDYYnWTs7mL{I6X#xjUa+e-?gX&J|=(AYRqX4k2fnhToJ@@CKtDH z!$;@Na!1QgjHPbZk?JhRY`YE^dxIL&V8!toKJ4Y5*p8I?W`b{{=QwL-X0rb`@+kXO z6$=jP4K{0pW-ICs(^Pf=V);bqzAcz}|5LNFO`)b&eu@-vEY~gLI}vXfLu%VS_5YCs zfz`EJh?YD;`|hoU(>`^fWNeS`aaXa$_$^`e({cKj5?2vJ+i+ntL%Y{6^GNj(MeIY5)q~f zYW+c_s^ULxbEPOwxT+od0+r!V_Q5l{C!NFd@4G0my^rgcT~kT)b4%d@!_(|I7C6!^ zdF(4LE7WXY|1c`~A!;RCO@o@4p}nS;i8yyKHak%xuVc%itDtO&pLL?0<&tt{DVYUa zqt1cSicVm^#eoymsR0E+cgx&RAm>=!omT^tjC4rV)|?7b2}mrmhfj{tlFKl3Kpl_D z6Xh7l!^68RET=d9D>x;mPE>p$TKVS(r}yn2ixoVGbc2p>UxF{ODd0pIwDN{xVk+yr zOIj*>X9D`0MHi_m3+Nle*c_{^8&vXe|GZks)nmxa93WT#dpuiFX&w{k00Ux%2ws#= zrB|@_$belfyxMgNxRdB+-d0=i)msx0Nr{{f(ahyrBz@s(M-XxJYb-DmZAt(@KwvqoWEgIMh~Soqer_3KVv8ub zTU%gtgWY*2YX%b)>D*hXm>mN7x;# z2j3$b;M}expJBBr2+C-u3JriW*i6Q6R3AB(CVAEO7RTI|eJF=A7(S@J*K5xqK^902 z4MW*{3h!^nS3rkpIg0ECfb2;$ztg=tw_H#%C$k8jQ=+{-KESHfgQ zzlGTcM%ls0L7t;EXdJ}*_F!IM93qqKnL{F%dKzC*!odZ*AaJ4Ttx3h?6Mxk%jGy%; z{P+fr=WqGIX1&H@uugY{XrC!`#k2F(8FU}8V86XEy$y~DO-ntQL&}uEIdh$7XcWm-5mX!x zM}wUn`;<}(urPhr#=A0x92_z6nAM*cm4}@_U&bnZgK6M6H_u>GXO-hv5{G62BO?xu z@~zSs*U?+2hk9T#p`pV=MtjaM)&#G4UUF>4FMo{UY$JOOW2cLpFXl&XkK!A~m6&wd zF#|EK4i7a10BEwIr=9K)ns%E4ttn92OiU77NV|WUSfxkGspsk*SPe|xi8R=KWAlP0 z(M(93qWCxa4`o}|j=E&7lXY^V**hwSOOgK2HJ9%&O`r@F@J+lt4mMd^5G1fi&$an@ zOl%cq*rF<PsS#4d4dN<$7;_H3c26?*8fr^jt}-owK1@u5;d z0fo?RGN(+RXrm)G++EZtuSV)6hg)uF40aKp;AxttC@IGC4U5mRslGBP+h9CKd`1qq z{3j?SG}#(WP0jW7tr#x$0c|$=5(ERGD8ziN%w$@ zEFJ{g2F1HlWqtG{N}Qpj&erU7gD0JykkuZ3M)J6qQ7G_fgVI^CwQ@eWDP3= zVH7mPj#N|XP&*LV_>)XYa#7YCO$LKvI@RAlotq{HnAd0bg{91_yNk$N3v4=?)x;Cw z(&S`Gaiz+7dV1Ylda_~o{r32YF2PM2LTLms>TC}9s0N?bt9?fdImBAA96NSR_?k@p zo;)lAa+1)(<6-YM}pQFOlGPVy0X|FP&vlT&vDsy;^@Ci)8b#Z~tA+=1g8%J8L~IgPMmBDEXq= zjCuuJ_z0@Q5M^7Kn?@W?ckR>%dlW3edPpUd`-?MMG-~b8!;5Kl&Ko{6->m!GZ2Gd|*uI0wz+Lo4tMMKRfi6!R!MuyoRlR~m@T28ydb@+&>@~H4LW5G~VXQcRyL^Q^u$oWBPIFhP zm5U!siAzFLe2V@&VJ~-Rvc?wYZtyixHAmtG(x-#f!lCpEbyT<>fbPkV0?OVfVob#e zaTgLgLy7~I__K$G zJ(7Y4!bE!H6z>z4G>$#vwP2qn@;t?boB`Y767H6-fj+?M!>h+FEEBhlg<>-#;+&K2 znzXfD`8zF1zAH6RsL)2Vm8FX$WMkQ*tKO3WD|U108UTbU@1a`!Ue`fbx*RaxXOJRU zN*kDZI>jAU7(9%<`kf8_g%K2!y6hWOBRq7Ie8d%OjSf*mGt3vHT9ngMJ!(m&p58OR z!jiIHC*A{(ND#ey1LrhGUNi>F8zMF7Mb&4jIuw_3u zAeNzP>pbU@@<|tB7ze~kUp>JorwgHZreW4%KAU(>Pm@M0cdbe!s?;$nweKx$tx0?UyWh6Br`q1w$py~<{_n0ZOt znsVG?nax&Zqzv7&1`e7bdK!PoI#ZX0_obxgM3-MfCF*8g(`$C=5KnY&;sfY;xwu1W z=I~HIrYZn*5b-X1>Tjhuk{URCa4G7!qpRvgluxfv=2hl%gFeCN_Ayn5pW`qk?pO|c z=rv{|&g5f)k8Mo`@|?8sCa0V_?Ik$(=0BO+U<-CQ7~XLzD=rmhHis+91GkT|q)&qJ zuv^4EHmVFEHyU5bi-tz&NvT&^^vj$tgw<%<7`9ASOiM&|3O!7@GGQVP0Ya*_*9$ix(1%qzRXpTl7WYImmp_riMYMZcTcp9(JChcJ&NH|QsF?231 zc{oR9Sy7|(;kt)lk~A=()Mv;Wy4zq&0@Wp{AFUS2PuqZe5N43#gc*Z06fl|E>A@Z) zohp**0_EzZye&3ew+-6UkqQ|TzwcIa|E=t$e2!PzpvuvEz9p$U!Ja`ue99cIX# z&oE~OJ=ya6i!gP;Zh(FcpOpH()2|hBzw$>TO0vz=NorFE7@L1gd=Zg5_$jGKtz~xG zA8`(JG1A5Vm{ABPTU{L)dQY@sqKf+e;K+gZo*aae51~UnUWrw-%fUeO6K!WIw&m*5 z>~5lQf4oC?Sem@RV0zU4>caf^I5mS(!bZsOx+4)p&8x}tf0Qa2EP5)+2P9^-TCXg7 zG%MB0ga#Jyv2mBP2<$k#4`p<4^nr~&vG+?l5$JM{AG5pc(MVGLeDc=h6xJIm{k#Ri zPEtWN(s#uSr6Yt|cpFmmAeWnZa!zGN#~mWN{O4jj=?kz1JdG7h#HkZkqxY?zp;<)6 z#ETba@OrQSD!F^wrv!YHr!3Y~tQVO;?5u3GpYyO$pAQ_CCg1V0as;5}o<<`dW>yo8 z-KOYZMc+A3_|=U*xY6WOyR_Za2)mzSy-o>Z9~BNIQ#y1>EL3g-S}dE7L0vNZzy^bH zNB}e(I=@iN38pPh+pn z+J{FD*mR0bP)<7s_4Z*`ir|cJSG+(Wlw%1LfP0zpoLU?1ct1l_Eag4{nwgJ%JYHzn)5)u zb`YboN(F_-UhRJw)+frb&1TgrQI~0~hgZW&YVtvJCDGGr6-;6ax5qysz;&NGbuGtS zxUHB3KZ?aszZT}VQ8lCGjbkzgH1Ad zKY~~Rhh(pZwi@!OTvp0N3+$lM(Y^AZ35-%S`~S5b7o|@{^s<;b>Z{1wB0-|KF3!Ag z2Ab*BRH~tw9+!eTngGXP#Pe%FjD2wz8Fs$7}RC;HxQynPE^25TBdXGbDch z{#PW$P4UgMS1*pu9Fjlv!+1@Jo$SpWZY!@Ja=z_hWOlK8cCsr1TCUL8Z|gj;fA)iw zfn1P3b>>2G@tM*YHa#^zeez$nOdPB+UYzBLz28)Kb>&oqKFD;~dT30!2!nWKl#ioZ z&u8N!y9#noB|X9pRl=y-(Rp+RXFTT73zz;k^!q4^?UP?&;Y?jDXQB&@h5m1eFg4O5nV+)kl5sXNDxQst)XG6kV(H zh!2Rg_@Srq8EY2wuwK@OY5?fpQ$MZOGM`#J%fZ?>#;#RDm?D`%4x52Yhh~Ru48T z8H;^My}opQ-|}K&_rd$tg2qo9ii;mTU0my^qz1&PjDB~B?qYwzE`k_VjDGGFlycv> zqh~9Y20gzFaEi%U^;cn@?qT31Kk$bbdMh{}Lf>`T#Y|(9D&_OqjB`0sDVBCAD8$9R zTx7{r$;{;(tw;6Q8P4qEv)NtWari+<^Z|6>IYTw;F+BV$kME5?Pe`;131~ z8BJc#dVV%BpviR@i4z)@V!fzEebr$uE3YTr(5N}RnzRcQyoq=VR+jMf4f=bd)Q7!u zBOU!C7tboY`6jRQ-HEm|mGpQOZ}@05A#@&_(gKzo}VXa{KffAG-3vS5p@H699fF=;iKeqsE$U3 z?-cq-W+P8D=@7poT)zQe&aOo_lUVWiF%UiGWyLoh`eoWXbP9fX>0Xv{82sYbfAz_q zKeTd(MIX~JF1&*6Pzu>zZob@_`M&i65dv%XXwV|UNPKebwF|%j;C3*j6j*76UOvt7 zWV~J2acvjw!z7)k2O`?wDj_oizfW>Jqyc2h?9q0|X#Hz)_+x)s)SqMe0 zAzFCn{9MDMa_6*o@2+0g^rQo(Am!TQeTc(qzY&_bM@oM(Wt?pSjhQ3BcpN-1{z9o_ zibH)cf;HYW<~58{fAZEq36{#|?*uK!a3DN0ExUd~hg=mC71y@G<|8+uT!gpWmhF#h zXHYKlbxb>-Uvh{nKUAkWecK&QyV_$fu0P=udbWyh^QNBc)6VsmeT1OCzz!Km zG&wPB4jwO+0QDuEXLBdE`^RsbVGbY@v`YmO<_G__4BS za9>1Xhc+yN9dTLQ-ORSYn@(sfAQl8cq6U=eJB`828Ev=HG9R@tCsNW7; zoN*2qwF*Fx0jpHUz0}$%Uj&f9=%_i0%SNj?oU@VOHPcAxwLYZKkkrECGG=-qTQx08 zC-@Qz!wP><=86MMN?zi2IP+Jj2jtyT_i30l+k*`rJ1x+rM5O4Wz97mbEwTpLCDBp(_dHUW2Xb%P*ij8q)(3eM@q zKjKy<9Dy22RObANDfvO;uE)q5;+^LHU5WP#qI$eUUm6VF#Wr8|2fJDSJAwPR`+7`~ z;urDeC-lBM{?=IAaAke(drzMBdT&RQReGHI?8eYc{V>s@3VecPXeI@D$eIC1#kGE@ zJ%n;X^ibp>I4o?=*ba6QFyZY>6K0z36C7V4P8B;$_JQn>t5C*;`>rq*JbUCz9*zgbhox zC2^Q`wLSkRXN}N^8+4}$CwPVLX_xOoW#_GEktI%-@cs!rjSl7o+DL6yfG1_${@^09 z{NAH9p1R0!UjDdcR}HzFCNRf69Xlt^zf^e8l-n^36Lu%!-o=na9GG0$a3?MzP7oug zf@w|EMP=x1v;i3O3Pfcx34!R6_1CcUcQ0?-P`qIiXt-`!zk~&maBo4Z(cpKZZdWS2 zW!1MYB5siN^CqUkhPrim^6o|am@Qi|yLHPW8hTTT`0ev$v)Q}A9Nf%ZY{PA4M5B)( zr<1j-C~R$b?8p;W-KxhIryU0fiz=61lp0NBQ=O2RXk5ORaRiQ%GN#mzi=C^;;qLxT zON@mMxC*leUshO0Rat#znLGeDdcJiZ6(&~Me1$HNQuc5D`h!xdb@0aXByd06%0l{r z*~oTFYHv{6EiTF~nN;E!BG?aGn5E*!r_?aS`(dzZV|Icw1Ta9LMj@4G=2h*(=J(dp zhFM2LkRS%oXVIro1($S8`3aHgXXC$6WD@NmMhxAg9IHLNpHx^r8|>%tX8bw)84N#x zKLwVa}g6vIX5{2IuTKvLM_V3e>ej-s~5R;Lm zn;)(`iwm4MapMAljo&8~#wRC-+B=TZQ7uMf7s5sBPR4Sv{?rX;5*$+6H6lK8ji;p$2eh$yNaf@%*wAL9rT@_B-RxPKFAE4))ptqKFgY1?~|hDmY8yReQ9 z%10g&eCeI&x8+LLtLXs9JpV|UTKn>gQZKS6c$XL6fWv2T>#GVXrc6_%LWY>SyS0rA z!xOGIWKzvad>)`J(!Em_||3)8_sp~P2n!JnrDG%wJt)q$%0{_!bcVBdxNJ=EVzZ0@wt(>8JZTc@5}S_ zg~nY`32CSdX2(l&e)C5}P(>YVSc8gb1@eo7lw9<~bwp;QadoolkcqD)&Pz3*r6&GR zxk%K-q%of;vzIECdY=`q%q3rA<2ohfUyAxDiyBxk8z=XPGU3OYk8Dp z9QMkGL12WAf2*-tF-7`12VzGYsqF|RCp*Qi6|Be0iQqs7hhnS@Vf2$Ld||)1r=?Cm zjvi5UF-pWIEH095IxUK2@2y|eo~Sq*M})a1{Td$Hg4Epc;ER!fa1qfbB?GEw^J~K$ zZ}eyg{2OMz_9&^1y%e*rWh8lnQ%5VhN0rDou}Ny*YK@Fau{J>6%b&Yf6A+Zh1FlAE z{Cu9?yjFUj8FEdC5BrB|n&aqUKURn`Y+^lF6{mkZ({VxnmB8S;xZ@bht`YKY>n-tZ zx(M(BTg>Va9qc}@m?MR9Cudr-${JaP$7)R5X2)ooO*zeEBl=xM9}JNAOuw-j@f+n! zNiCQEsAhWEQ;`XXt(BkJH7uVwAGMnUtO}5n3Nol+R_rhvsBW%AJAEfnRmAJfb>@-d z20d(ekzlAYf_S<98|!Tq!wNfa)6jPLyG`C81ViHg^-a5M6xBbZ(I#U%HO@Q>9iX6Y zH4ibZ`gPo-)4O+nG=NqPlpiJ?ShP{eA)FsjR4q@?@QhlArt-P2#`Fu5#ASPN@ zy|!4r@qSV0*FS1Esm(#xrGrFAkPc!5v9W~%P(Lmb?xdycm&$uO6jvQLuARD zt6kAEq=6Xrguv56vOUg1EjcXS`2mQP+7keL?;#AU-p zDfd^HRowBQ_dC73e%Qlx49!@;eX&NDM!iMtV?IX}-3lB~t3m|xpip6K?=&IPavLlQ zV{DQeNTdfW?(w@7v_ei%E!Ny{Zx)+{4h_y=iB^;B|JYug0^>uVN%b~{FG4sSA@h=4 zg{DQVaMMjbhw;J>n8-VOV#^&4I_8l@76q4`33q%d5#5YXoX%7ha9#{?{m_X{E(?Gw zfu<^^1`+9)e?3sSn)kCs8dSavAIoAo8&wz+1cichg?%2ew@-hI_%n*?Rp*8UiP_V_ zD447OS8!zF&gJM{7X46AQ+8GLtZBG`GAxzmFx8y1GTFO0a8!k!*)KGM^=Dm|>xxr5 zDk_vV3{UMg;yP&3%_E3fNA<+z@n{p$Lhiw-ev|B!X<0g}nOEfDK^VU1h1$1 zpV4zESv#(R?GV%;&PF&Nj`VfPJvyX*OSbjuk$C6a38q%&M!Yx;U=lH#zQ+)dva zA?>mK`XtdM@av>Y9Sw6R=v70$xfOn0F#%^CynSc%ksyq>BBLioebp%X-k3&8^_0^* z68p~ZlG#6O1EnJx%vX4S6Z3{HrCwA29WrW#WrLF_+7qd~(c8%qZ_%~45NMy<#qzBF zWbNvmyAuxCH7Z|bWVvXdb<1@>|MQ=7)6L3b`xX^N;=slQV-Xig5T-c5%45aty{#V` zjn#|F$9j$M*+qCvr$;0wu2Mya;0`#h_l5sc?^7I~3I7`n9ML+u)8uZ0{2oTBXP_Yp z5vDk!SHWckWg1M(0Lp*HHE9R3nj%|hjwJqk8<3ILEa zm+rk%yW>=))0=nsryZ{JM594cX$a0ZJ&Di^)8U&JC4_KQtixt43!))Id)!jpmY@Q} z?r6UJYZex!a4;_=Q9!&7xSO%{3!?d-r&{a@;m~uYDr@ip?!YYbSZd_!H3SX0o2}Nw zvHEG#t4$T{>Y|-c?&TFwrDIs?Iak#YcT0>;*--(YG7X+Q{%lu!X%!`g@8OX4|HEAI zWh(oQsuk~yPu8-pF=me`XCv4}CMZ+At*Td^sMz_0W}PH_EsSomMV@GL)CtC>0_p1@jN;i}=0t^wd$J?V{^p6G^C-oac~Ib*@mCHgH- z=RgI)Cbv6r&tZ9Y_>+iL<23=fE~f$aFez&L4UNo!c$D$TBHuH?pC)}yCY?bv(83E! z_F~sr$tlZ1f$dk|&jR!=Y_BtizT0Z2axqsu7D3<5op_@A09DcrXC{-^8T{dz)XgTG zqzz|1&fY0eIE`H>2G(qL%S&4T)z<&5&m@enBDMk)fU>5Ik-nov$#;&f!wpclQvmpr z(?ZN&U>c&6{K@m4iB$O6i0@=&@e~S026Ex50wsX!3@s#f4s#dIHOjBLBBKcswJG%` z`L^Ro11Ms&q~K2>2Yk8qCn=Xi6m{;ZSHzQI(RN zYW4yB!`--@dyrGif|P48a!$5w;Iua7XDHLF<@3`ZxEGWe?ItgPgTTrQI&+UX)Un5O zxk|nbS7@tDmpSd16l+eLM-S51#>xI6PPHR49}1Q# zsJtvZY&hDa^LR21ZhM(immtm+R++u*6~A{ClRSi#(AJ4prnbcAO9*NB@WPX*DY0#A zKrX367#_sbvN)AUY3v~}3fg2n7{S2# zajo-^(SX^AnlR;1L9*!!$zNBDde)VwB|WbX3>q#4k!xIp_LPf9HCX;T;;YH}j_n6c zb=$*WCOS&U;(|_|Xzek_PdgbC*UVyWI@JYSaT!=S8b7qmaOmF)@)TrtAjKr{wlZti zOaXhz4Q>ciZWxH?9wjDQEPgs|jm=ZrYO`;kAXYx%bvI$HOQZ8pRuQth+xJdF9GDa7 z=}1_N>JAgqJ&PcuVqT(EvMdc%glP}4NmRaL`S^y|{mVJV?ADy}ytNsJmQfBllw3yt zh0(8}>FJVZN577y?pO};uF=qQL&P5z%AbquM(OdWwAWjzjIhKAO2F4~M=`SIO2Nv! zH|3&=<0dx*)v;t*omeo*M18wYr-=o$;$6vR$qocM(#%GOqqck56oq-3I@|8x>JvFG zn?O|Ho*k}{F`00y41rMYcy1tdoE|Pu93Ij+;=(=&`29F|Dw3w|IId8j^2;HWXCp;f9C4eo&5Xh4~JNAd0?u9M+ z!WQQOk?;<9mo`WFJ(jqxs>(ghXGwtan5TqNs-Gox|L2rB?_hyDPzq=#49F4cOT57i z7)L|ht_SXmKJ)Ik)VrmlEMvkr06o~w<)IA@}Q;@J@+93oh2^8Xprm@TdN0~_uoSuJL?T; zX7~iYX~BKxe+1qV|KR}}6HcH94&X9t9W(l8did(Bp(}HRh6lkTYz8Nl;w7QOFqHIi z@ky*Mp8nnl>ke^qDy;5$dj$UrKxnFHMc?l++f()djmlpyG|kmf;Pa8?n9yU4(n!z< zhs!jA*grrLr+EmGASB^1byk~TL6qDdOg+}Uf6tRtSSqDIz{GkqCiQ&}7*~H36Vo?q z$~`p>CEd_Sd!ODL7qFNl;3aOc;#{YN=-B==umAk>jEsZdzoCsRXY7PL zzd@0B1q;@*RzcYYZ=*#gykBs^4TjZWy$$G( zx-FzuRQ&~F#mJV|U_?{S4lc=n_mx+eR|Oxy5l91c_h_ub8>Kh)%Xu2s!V^pn&Md6u z){9f1eM1T2i)^~a?=)ShY)=f_-LDd-LqB6Z2!J(QO8QHq{wev3Rhj39?}Ttyufn^X z|3sm~pz~s8ewy?Te$&80Yj>}!?k7A13FB&G{l`w4D87&_Ekx03Au)km)TWNzP7n5 z{rNf23+LykA%mXE1kM_0L}tx_Mfaft9>@@kGOp}7ywY%RW^Hv%*ZvUC6CN!kO~EXu%_XzvsaF*wFw{P zF{KKlN#wQe{S-YcXm0P6STj@aWSS$VJ8OM(oamvy6x^L0e2tjK267cLo_|&897t5~ zsn_dhyF)t8R3%@Uu%=h@c1k|N>Bks2efq*6z9I#pnThzNn3Fe&li;s+h%(us*uvRMPsK`u4xt)k<>;)6*^fj|ZX zzC>wV+1O&IDt2-r5S*r4Wd{STD^XtnokvdtU?`ucqXA?qN7X@{^c~$*c;B@x37tkc zQ)~i(J(XkBnec3g_ob$FqEc9#o-QUrYPPXT;Hkg_tg;1t77-cV*^a9N9{l%1>4({s zhQ^3oT?e>zV|ISZbNvqS3SQk1z$ z&#LZQsPa7DhwotN)q#)}wljaL??j`53AX)1x744nJ8x2@$>1PeZ28m_TI#x1)fd)# z!*xPx4!fG0EzAfK=h*ma_}j$^mf5XXrh+uo@XfIa5(_i9+3aeP0n$r9rE(Ml=roM8 zo*8K>>(L-gd;$8|+^jI!d7%_?-qb>dB#wteiRK0xM#lhU(`?EaFGl=8rP_X2AluZ~ zoMe1@y0vvYfO`rG00dzx>yA!i2Z-(d|1=b*I?fpYSd}oHM^`H40`(c_^HakwV?<$i zxRCKTTe=_o&_fg(s5icH#kk&sAXZmzJa9ze-&MR{Mt}2*AsfmJE4*1RlT55!IU%_Y zfH=v7tiJH()iOg2*{?SR^r5a|g+Cg$9SO4SiIw$Fmf{Q)Lkgf3@C2>RiheegtRV0F z3@G1r2p4&W{><97BctL+w7>QoGqw_#hg@-9^OajVR_oL5tSmb6LA&!*k?A7_pJsei zds%zoI&H?T#){kmI<4VZNUGuR^&^~9U+FG?r`kAX{BU)hSh9hp+1}H+MxTCZWudUt z>O#3TeGIE{$!EN6?fQ7ccmO~o2%dFXIw%$0v>x>FC^o7;qa^W3${9OyI6l8x*5%tJ zbNe*x7)3_o)9X&lz18u@5D%%spl#2hT=_8H9nZ3+kih~e3Mn~>91H^(ro|}<5Q5)b z(E9l;MRR~>W}0xH}H#+TZRw*=JH4UBtujOz3E4nIbD5 zTKfk2T3fI4YXh0;? zWsm%lZ2#u3@9mFIRy&;^no;nXu|vMHRlUBrMcBD#-~_>YoG#Wn(4$jYn6nhSiXkB5 zpppU-Y4t_wbTdl|b1{r3V9Rl&Coka1<-z`kLNZspTpCoNu+6T~$LTaekFFCAI_ukV zVJKY<*6NSc?bh`jGFk|r>yLL+`GR^viG2b85pc&sd!6WII9=tU!=q9sN2Qx$A{D?3 zk3`263JB1dE)K$vsi~E-{TL1*8L%lp{@WZw)!bj9!tn5;^WO}lfkpoqt=fC5YQ66g z`-QHn?89*Fesv}%k@Et25jF6(cC2X3v(YQg#jVLU%{9)J&PfC^UA4`-$LScP7bh=F zfle*e8BoZgVB-KSlZ>q1{S^L&Xo7I}W>s)>7+;nSp{yrGUZ@v$407`B+19t*fJ8mJ z>RPKL2#`_0o2=k(l7Lcak}7eS2wDRLS^hDG;lr4&MPfH(P1M<88!-4raU&knfVI;R zt$QUzH}&a!S=+!pfoHAk^hB48h7bi;yJ>+SQbQUtT!?xi{Om93+YVg)VZ0rG7LMxD zvoqdjJP4?Z@3LkoP%+>E=gFp1f#16U18VG_Wmv{y{ty*rfUV1@9FT(n2Rn&<;?7tA z&<8{!0A>t@d^1o0*a*U&8_3${lFe^gLwq5oI7pMrL0}Dah5`t3feq%cgf+P+ISkGi zW(=?=YZY!eXp|~TTjYv=dzZtR+RIlGI0o)idhR>e6xYDfU%nJf=QXfxMEavrV9yoE z$UlxveL@OB8=i%5mH1Vw7I<%F8*1LWt7wsNZ+8UQorP1RS=nOZi5*D;5BZ)FoCYB~!`;xNuP3%G`#G>9BuS0eHsW+IEV19TI@nM1N;z zbb}(Y1s4C&qEEcfvAq+{ZFIi+3{v%HyCy%^KfdJij@f1ZQjdlb$f6(Cuo4SL7_1gM zP)@0|{ZhCYGI&aJ3VaGQo@qnCo!A%~ZVDmVn6m=kpaac9AdzsujuA!{);sNu2-O0&rZ?KEqE26|^g zSDEdR-g>x(9#M8e-DOW4tZ_g_;jw8b4P1u+k+u^V=Pfr`lFHHcT_7?05DHiUj8sfO zc0)Yqy?~{a$@MAmWQP{8E}_`8@(kWHDdYk| zqnkbpHkefjwlJ_`JI;+#t8IflNL7^V{_$G|0ERUL`&gx^pk?qR0cHJKk#GrU9ZV4H z&)XP8%a$mgZcq8KmNHS^tWA{1AE-Q5_s4WEP|f102wIv-73x7qeJ&xHVTXqR zA=4a)s%bwkBwZtF7;-LGZX)+E=)4qmw-?`DoShUJ8O=xE38b$xbkc+Pv`Fpx;j^mT zDquS#=6@_Y-QC-2ckHOejr2o^FrEScE)oq5sd^hX$45IX z@8;q+SF(TNK+&qyH*dxziZIM3TcNM7nP+O6r>RvHUK$z_kYI%(T7|Hm_DtLNV#{l;XK_eRAHzy>nk$7uLZO z@Ej|J*Mg)AGvkR*ib(^BRBZHH0>r_7xqz<_9?1i6Fj<7u$vE362M(1X|HNv;=Mh$C zJ6CP^9L+1N&c(=toq+BT%Kl@VGyphbX<0LuHJk7!7&dxZM}%bJ)~)i(pFc;FJ3-LM zo_J0`$2=c6%%1j^PU-QOVvOk>Fo-s04^A%P#)H8V| ztkeZO0k7|`$B$KT*RV{CSp@|yeo1C#tUro{{DI;Q+j~T{H>Gs#*4X4P=*-K^mh4;_ zvrQ17W*~41cQv9bozULh0@ye#UfuFbqR|*jo5jg%1JOm3YDjBM^EGsFT(J zW@;`J_oFxL9k600?p?wyQYebJlOO@+%`I|}D($&_IxH1$-Y6_Pu#OIZ`U*=$K@J8W z@PEsr2fkgN7i%1FGA7HV%1O<~s#hj8N%;<7*T6`Yi zSbRsbwO3e}6o|3hoSNT_K$*2(Yn@rSFf+lonm3f|P7a`oHMB|E%n{kxW9uf9Z5IT~ zhr2H+!P}b#bMH9)5fL37_n?9u9T5@h?i3Xj&Q)Qi@%@xX4OAk#dCztG8wM!`x~#Nc zUyiIZB-zqi25EP{xXa1gC@R^Q$GNL9=DI{2u0^?<$FXeT+ZhmOR67Z~-J!C`#H!^q17H);AU zxn~*`gZBJdN$qX-Hk5BaxI}T9zkle)wV=4`rkqyVI3LVq-A@+jzm<>5+j%R!0 za`7%93FKDmav&B=@zch3_y-RXs+%B1JGDfoN#mp;(IHN$u80_Q0t@=L#mlP}U~ap! z9De=`|D{kxAXB*S?Xzm1{Q9vAefL;>f(nj(%Px1$&Cn>^gFnu0Jb18?J+3#DR9~OO zc01)5=+gH54x4dDukD%3!0`+ioCUaFjA~Ev%bYA?aN=zQd5PCLR(wzc$;LN-DVT6d z8PcKE2mSI7F#GT|@Tc3!a=%Ewb#KmT!xyA7g~*T&WrNEUk@|~%t!?A8rOpQ58YWwU zoy&qGYj>|Y@hGfink9Q*H(q&gTcuxFhG^dbj|>1ae3Fqk78qJ>LJR9}+Q{EpkF_rU z#b9344B90casbmKP87^Bnl{Ws0N@SNq8-tvAmdQ*A&}&dL!!xu2!&$ksF;pQb7^Gg zNt*s2Fi~&{z9N;%8N|n{CjR`H*v6%8kRoyhm3c})B>utOp3mKdq7S~V8yp&nh?o=s zv;p;aDHn!dsc1MLmtYtIl^w~zLPRHfvJ)AYIMmw5g*GXz$&RFWHxLi$2$!3UJ82t6 zBLU?Zs3!%eG}4A4>BsTNH?+Alu-(G-UKlx=cFQG%A8z8HjLU{9e@n9GOynZbMbHz% zp#o68lIRve*Y`K~9oXiT7I}!81s{vi#{B$1Pwo4Y2i{SpAGK@N@KQ9ofPC!4}3m~%qZ}*mXhEj`_(l0n5bZG2lb?vc zVEXcTugA;4dT{Mkm3-4s_wI|YF2=JRwZMyb(1gX<$3zB8UxZ)FXM8rjlvcZK_Co-` zq_R-qo@ady#rZ3kFHb}`ZOxTFB6OLoh7rIG4;PxzZ?2~Y2uLHsfjuO4{AN3esDN^> zmyZizWoEK8%2<1OQtAEs<9xfQC_Dc6;Nbq|6Pqtz-mEy`?0iD8GCk3}KPyWr<=ta_ zHwS-i^!~({$oSZl1s?vuLpB}o%mgZNih3U}^!#~_mW^rNP${m|Xoq^EsvK3Z#&Fa7W*XSDuWHv#yUB zck#zTwC3A`)hJeIDJ>e12>(1Q8?BeEzE$1hIGXsq$*ZbaeY0LRDm(ipR{})yq-ZCY z8gX9eJkEdIr9LLkI@!8C%m$>q%hJ^M{9V%RyQ967NSl+4%cz+K|H?mbqR%&3% zWnOw{QtG&ECB3aX+E>KUtl7_MO+!+Q6nN12kNKYkx8<$1i!(&kGnzb%ERYa_mOi^D z7#!og6-K(sNl3?K@svRK+|+7%QtA3`EkLQEn!uLBe zt(CQZjfUeZiteVj*;bCHh9;%+QZ5IkvQ$cgPtNFQ?z~reQWZ@^6Swnq>`bIfnuXR@ zPyZ6A%xv+qDbb$}P;lig2F7tlUdgH*>j628r_939orEg7(OUs zb{>GPCv(YR@92C4f%Ls>P99oK%za4|5UXA;v(9`n;!wSDx)P%K zXNPdugnz`LSoVf{U7i>N8o@X`;#u$HDHac$%?3s=?E;W}aS9Nt2rRa;yLkjwJiN_s zNQ$FicI@BZ)<$`N4eXE$EhP{>1QfEb2UqEGpo-L+wK}-e9yUA$Qs+%5~*wa3&=Aj_W#9bM$iOxHd;HJsp*VwvGsC#gH?7U}zzFygO4r)?Hh{dkLw0 z@#jfPB#8btw43mc-|t_7GWOJB1D24W1#M#Te}H`eV&=|! zz*lWQzP5pAYo3a8>i0I+RheOeUVHHv**KwXFXIu_=ZtsszwI?VtixhZljIAqv%B|S(uKb$e zfS#`k91l9BstbDM6^ITu$7mFpI$QGvwiZn9fOhOZsC7UJ!PO2OJuArcOJXJ3Ie+;r zlGKt$Q+gR9kjMywmy(v|N{ZY?PPa>BCHZAyx}(u{h%78kvdKyE?;FQUj~SRAp--oc z`T7+CQ25F-XXN2X%un0QZEAdk3mC+eb*$bs5+`>FP2&tmDFA$7LwU9*lbrxLIzT7| z06%XXj@22M4-_~TFWLQDR5c;S65}Fu4_6BJ#aY+{@cjfxQ|kkX)O6q8Uf*<^a|!9D za5<#g+F~t_?$oe;s(8@STXI)45P%fPFQ$>PylH>`X`bc_ZdDrx889GH>5vf5F8`}i zZeXr3Em;h=ZwUuae7JYSvv7y?QlBH^`R=Y<(3S>=RH!{;q8K+YUkMdCslWn;YIRgB zBdlg9e(yQ+N_xk!V;!qfvI;RN{`9ikkVJF9``e#p8>4wL`Ee&_m;e7^{jz~f-%1KH`X=-H$%t3ohhYnY$%zL<*drVI#@AoUcE1P!4W3%J_3n>uvZ7=d&&v(x+dn8#lGri4&@( zauP7IUb7?Lc2Di14NZcQsSWoU!Olp%)Jzr|Bw~=XoCg?w`UeZcio!9dt$q}J>R!5Y zp~pjWU^;IoY(>23z~f>=@9qhp4H^`ljia0SZmS|9pw>{8AgL9wcC!6D^8 zYQewSU+j=jaC(EjU3@HXy8cyHxImA8I7C(O)0G;RTmLg#OZ%p#1C8e7jgI7PyJHmM zvXs1TKrsiT5c#^$g<|E+vKCvu-KbTkNGy1;vUOT9RmW|D{UR)XZy(ZNR;@jV)AMKsk-2=c8LFcAW65nK7PWTYqtq-g1*mUd6|8Hqrl<5jS z_0WeSP?rvi3J>N5PK%EN5?P4y_pxIV2{|6+%i~|*p1eEbR_E z6A{y!)9Odud5W`h%gtbJ_;+_onR(Kw&ISM99a+%&(aI6bRaZhgxW@S;R z6?E+UZYyx2Y4aWAz*r0z^BV?a?Ibp-%>z-@6djVfk@D+bgX&hVEEwdKAGN|iLt>T= zfn9-_js&?(I?6J$P>=+n4|TIsNN!tBtTJdNRGn0`*9ix9=mJg_Kpa1c?}Y!`oIW?$ zb(hZhW+`>woAN<``mGLF$v10qIo`+Em9bGLHQPFP2Kg`wd3F%w7$p+dIOhJ|2Q3Fl z{df>_)?@0^|I`}6zerM*_*ra5Iu~1jWqr6`j#T$Y#;(rhdy}1pJL7>l3flcV=m*#` zKh-qS1;S)loj$D=gQOA{xSYL}*a9<l<{~3RwZKHl3 z-_e{05~p9yYva6d{+Kopnwd z8F|#>f)g^^f7`lRq+C0&iE{ia?<;+_TqyBEaZhSP@Iwy|;PLzv)0PFytf<-Y9YQT~nY(S|{U=0Qe1OpgM zP-5jIXnVFS08U1LWYp6vaj%Y!s~BRZaSVjo^4agHrk_)eJbJx(9NK6(7}gB4|@u-s0*Tm`tdW*JOz5#E#uGarkZ ze*d`WWJZ@s;#TA}43j0*ZKi?#`T^dxcHy?vC1?S710X?Q{`j?P<9xeW-v4v9GVLX> zGVK-J$3OBIcKq=xS9jU+$GW@5Prlr^Yn*TMH){h7E@!oSQ&A?Qw#Z_%3;3)Pi`;25Lm+>R2?TJ3hdy{bGHn zxi7YFpf=PJA1laQO^pcW7i~+3UfIaFqG0&r-S+T{Ta9DHO z{m`dX%}NN&49jr4J}Tw8Ul42vHSL@4vY7@7$wnC*PtgIr!zD#baTyy|yUIl_L592T z?hM0rdEiU}k2hsfDguCNM{ui|(fc$=#z!mHudnRP$nYLCD=Awy`RK{ehO&~xq;V_c zRV2JWDLF!!o!>v4pBEnP-D>_(%a4lUYd?y`qcoD9MCl$M|CFB~t+X2NW3{EF+Su!2 zaYhq^dM&cK(Sud0VPBm;h>R8B&U8Vl;t`2C3R~IH|@&y9_7^?u%4tsvC z>1eID(4Puo^7;M4%^y?6CYLdI3Q*`|ev}QH86{u~+~3&}E)$q;y1=qz|3F2CR>l%( zHJ)N$Gc+i9V`$ob1PW1^-^r>nA~OoyfQ_zJ#PT6&cxO}oQ1YqPDETWDC?Xp9B7tH6 zSZ(y_(7lCTsR;+#4Q)+OR)vkgvdD4RA`)H~WD~YG3UCRn3fm(K^qi!4DRVtL zeRqq3A4XIXuDlP_spa+n1ZFNM1;;Gf1+iOAXwe#QIpn7QEjZcy7(dAMS{2-c3ZB7j zVT(Of?u#+ZxZG&F(y2eR+|AkYb&)1%hyj>B5GtnIOl5#>gY>$q=HcLKE0i8?>V73v zZlV83G_|p;gxA1MV+s-B>z(+DfH41jav^14royv|$qNe#$5vTKu2&s1Yt?5p9RgR{ z!N8MpV0mcN7h06+_0G0jI(Gb^kk>YmO7p2ZJ zLCvyr=UD&y;?@0WB!eS9ZP8s1Il~jk@n_rxf`8ex6aD0P%K$@!RO%Mk1|u*CUwQhp z9IggygU*UMy9lhSJRgAPQz0y(U|eMKA*u7=2cA{dgR$BSM)B*WUVU9^$6LFpMZ+!+ zNrRPsnBOYPCkH0lNSi(8ee?W-YmcwY`7}~ib>VqqZ{C4`rj+;w_jXZk-Lo&3W62UkIU#4xL7iaD`17_OZ5t4`bMM#l7B7!NBvu_Laqep zBlVuH78ldZ*d@*N3p((t^DjEdy1JSJ^8DQW{tYQ{b?$A#?1;5W@>xajT7EQ`6gzVL z?)KrW8=Gf4-sJ}=q92vgE3naI9}eFqSXUAyFG*W(n}HlZl=ZL40DCG#Ss~ZBMcBxk z7$Og*k4R0^A{dyB$PFVw*H^dqDv&{f2p%_5M=Rh2hw6j4>Nr|)-nE!e^Tg56?ADkh zV_h;%c$MH$y310-dhZ{@X3)h)RV1aQb5M;#UXUP1;NzkmoM`ZPbKtmxoEhX1VN-e1 z$TxmHSklG&7kf-6htDTL% zWiip&?%6?_ST-a(FEF1F&-P6UAv}9g>bv@z*o*pw!p(sfIcoj5i9D$!za+51-gjT& zJ==&!1&{6)-+fpBETdSeaj|T0r808p447hEe!j|Wjk3N`H6kED<~|nPvvshqJcwyV z&sBo_u{#{#lj1qFlP76&6xa*!3GsIJ%+qlIpA35;Q5g{0A00n01t?OD##A^h`X*(0 ztQq;rVhhcFhwMxJT;QxuakCM^aY^&N9$QWdB$BvQiSzAwe|4mHNtu=2Y!Jb9g6$f2 zZL5<#>2TLarmc~)s-X#?BYftLGa6eE!9a6n2cJ0-AF6+E`*6iTXoNOL#pI?7GLiu7 z^qOa3&ysxrd0v_htj$PMgk`60%}AC1;pnfh$x~NFhw8+_ooqJ+sQ0tBc32-cbW-Y< z?GQS5W7)JJSwsUtw#WS@p`UG3zgR^5i=?)pmQQPv0k%2v&9x)rrl<{7jpo zLHoT7P&5Jv1M>?suh@LLV;$R=Uh&DkBWM`Lt*VtJRD=D01Jmzk4+A)4*&EiVs#-w zfLuQyK5HCH@4oqNWl8VlW<|6QF~v6CQ#~3|SFojBY#Mwu*rB7dO3s^6JTy$Z+I!0G zibUT0u0z;sWSQr$+mo%$8%^;`^`k|h_nuIw;Njx|j;j>YUO%clL`UDLHXq!m&1N!9 zQvW3M-46K0Uq;VR&$eGALA#)qBCB}U;Y@Ecoy!g~tHFTaQluO`hB6D=e!VBH6p98) zMlCYmU8#$J;CB>$Y%nt-7}|>NB7i^ftoU}7<0iRW2BMp#Qf1=Z!4g}9u#nDh9$ae- z9^)A(u2#(DiMUfJn<=g+Z>~zQvg*%EY*5#!S|JXM@q~|A!g+8C!QtTlOkL-RRaTMD z1~&gf=>jcJrT2UEr>Blk8BK!Ew#+4g_g)@gxVtZJ*S>R6NMZEtmn%Px_>uu8i7t^y zgF6=ZaF*3v(#c`rlWe)Tz9^!@qnjW=>dLc35feQVhB2$YUj+y>Rw;@wWUkFFSqu#4 zmHE8$b?WYR;#@s%$b8P^MY5BH@L&jk{;FVWJ-+XJcx8d%i`gY>Gh(;*l^o=s5D*~Y zn!x0*k^}$~n5k!H=t?+3O9)z>08XRYd!6vej2@6*O-!}Urnig8l6+owVQOP- ze-|qb{Beja8tKCUWjXO8M3nf-pd=&M6hluPEX`=W64Kk6Bc;+C!q37V_uXCK9dQ31 zCsEDz{dO0Nt2SByFoQi_CPL)I2b9r=EgCV9J2(BnMuzxPZ%b&1G_9>?(qyTOmz->y zMnAgW32+jLCSCA-j{N?3>hpp8qr+zC%^!G9^+z1{!TU{U+(6$y2R5VI!uorXoMpk8 zer4_hd@=@XFKGi%0N<>KD3EagTh^ga&4$oX^2-IjQ3M1h{=XtKPKRz7jKPvjB3y2l z$Vq-f)npC7)8vB8mGG?tG(&(-!Li16Y3Yu-wOT6gdn=qtD1LUUi~tn|#j>97(9p8+ z@nwLMcuj!?kR;?95DPG7hw$-*7?Y|$4+I##wE3P@MRN}DT<8x;bIHee&%#Vf31gc)b^(W<_9qT$-NSzpfL^f>ztCPPo2!qg`X zFvhE65QM8f7n~x5Lx3VdmQr}uWti;QP1GX9rgg(Y2{?}7=%kRbTg63{9E@`(RS=Mf zkkI!6Fn~=&vwTNnl8)0&v=qq+Cn;b#u}WQkj>>yD{j7dY|J2l6V2#+A*Gi4Rg+SaK zAN?*(O~oi+@=!oD{QU!dotH+X`;b61a&P|VKT1%*-&uGYk?*ICIZojl2ZI+ zjheR`lq&>VOxjmobrOdp39{l!{-rAq_G0`Y$5=xgljfXhLn;NkeYH?939*D>o#}?PE++Jhb&kokyquqUM`mm+G;4DWJS zPLJCW=U}-r!w)xZR_%t*Vynm%W!>I5Z>@S-G)mc~vy$KHTaXRGz75ykw+?b*Q>tBZ zi#JCX#&`2J^|o+jv74ic9-nP>GDp%n1Q3+CW=s*RIG88;Qa9YNY*D&}5ay@a4O$gG zRfOX$3+>mOkzR;o6et*|--!}cUZWj>@tvFf?phaa=?V;hGh-pQsseXg;FSImNWZ>f zS$C=De}d4fYwBx#S#KD#B5MZ#7ODTiZTfcg#O1nQmq5;aw`Ung@<=!6f=tVdz4A1ZGdy4E+?MKT`@-U>Ws+UH z&t|Kz@>9NLZgH*+<7Eq%eSG{BaEONZsP^AEW0$1|_n+IXHofS?tx~_Pi^twn^*Shp zeDUIQ2G%#$9=AB8Z_xcnH*eIlP{0>XbUN4Vp`M854^#8h&i2>_`G2U=Jmmd*(^K_x z#8cDPt~&}KyPTkSOZ^dUfN-7&_%E9+Fn_c` zaAsHV3@_bM@F(Zmn^C^b7FBQ;EkfDq_%mf$|NLFZgJdsvbk5^|nBHku7$A;6=(=>9 zaC|<_eXVVP8f-j|w6pn;3wWra;tft(ZIm2Lu3A$kK(JQBsK5RmBaU?uyZ-(bWf23& z2I}h10HkeUvLWMdi+&{_Un{wly)@RRF5FDeXOw}mVmsCZFg&$E!)OHQ9 zT~2R`vO#^Miz6eW^tnlaSrU8)s`H=R5><((ug=YSI$Txgq9dD^RkQdiEe@Qt{fw+e ze&0-<%-10)U&=d@)!`dOKs6yhTL+>&qnZa)wCw~h_r%a(!46kh+zlJ63)2mkR1K5n z-s+9P%{iJ8AVr>Smp+4U#J~~m++_yMGh3z>y}&Ye$wzm8fEx6xiQTe!)Q8$LTvC5#JEc?MIRr`*^-{hXScFr?J-^NKpFGW@-h!UAIg!rcofZ`7q)7e)oaZB0P`Pah~weXQA?g5_^$(vFZk#02kDw@bCAc_;re@%K021Sd( zw!hp^dKu;9Z5vQd@nE3sfvvOjNl!4o9)!Q-$hhBX^d z+CBgyA~Vx1yO>VRl@2)M<{I()xA|#PQc_ukhuuv~48*9xYK7>>k8$F-Mk5DQ^xNZT zdu?GMz+!{4H&+5;BHtJrUQy$h9`@!ajWhz1X6(pnmM^Y~Z43?je%R#j_pk*DIDm_Q zct_H1*ay%?3g}R3MW3vaj@D*V(M^XKjmoFl3Q_L(U9A^_z|3PcG%_?P9iGwxviIqC z?yrJ&?{^7QxMW9`X&K~Q<{0ed6XxVjvXsDY2Q5kX-aefxv z__;w>S`i}|KOVoD!f*j4Eq|teM{8NY7bX=V_upo9=5T~0IA|9flYY;dR|m>@a<>zJ z$Mx0a1rU}<1ADa_N8+^ql*(zly2_~}&E1hW>G!D@kWa1lGsnxw{vVlj{e$1w<6JMR zxV1|+&sp!PU}7_|FU|_iaID&PW3hP|P*7gF54jDo|H9pM+lU!#P_Qw0Bft_GlaT;& zE0-lG=603R3^)6MEmJS2MB0S_*TYUH762dei?8aw8L6o_zfvfCU1DNYZ|~Nt1OYN( zB?4OEhl_#Ek1H?xl#wBf|FdBT-I-fvV7gyYA-xOZkZN21G&Zwy2>oY+Fg_!rBv8no z2oREhtne?T@P)CgZ?qpL@c};Zw`^e3up90{`%|N46O3qdDCe4!t)=mm1RT_|jp=~^ z25y_^ahpchv z&8~3^L)79GYQoK%3r((Ap?+TH_$=y=YjB2sFTV|<&(kn|?oW<NRqF4sUz3L0c^@#l}9fpk{izW4pqxe3Ztqn)Ia` zeNu(mcMLSzOrHiQBBI+v zP;KSOAW(o3KgLH76* zoxHLVZeVFr-ZrJjYUU6q1XX0Cf61MGjIjJLM&H5L@0nUB8A#YOcVak2Ci#vMq=#17 zT5s_M2E(MyX>|WjvrhErQP-H%6Vqkblc>qnCH}(uKrKU1;XFMJH03+Ocy)llHRob; zeLjDYpI9OO+8u;5ft2o`7~H4^19>h?Z%*gr;3x4pTXJq~g-Mohqsg3` z3)s7#V(9&u5y ze=(vC424(Nl@D8Wn@Cv&DoHuB39ErDum2|L`@VizM+TrTIvgx!l?@=(7G$dcW%1@a z03Tf6uzzAfu76E@k2a}w$O#Ney_rtGzfX!k8UtfRfXw2|`kX~zC~W!6{FbNmA8L#D zL4q7M#Rp8;^NAq^;6pp3Lr4Ih4BSb2GCKO?UNSlBZO*epLV2j@p#MVd5X>RseL>S~ z7oJ^;k4jqs5LTVLNA~ap8A`SQW%8)dC*^dbYeTy7?^Xcz4k1)Gl*4a-D~~Th?pZkt z0b`K8HgC#nUi!tApkkhH2j6PO{#y-qY|f|Thcnmw!LJjZPtKRV9Nu&o5MCb0!B{`$ zj}&kV>cdfiIEIk#+6K98d?3KH6klf*0vR3KPJX%PMQM~NTcUssz}|@fC7}Eq%(K!! z=bkL}G5=?Fq<)VA=%8nzF?l>ru%b*JE@nx%Y5EZUrs#uj2%*ZaFj7Q$y$ zaez29ybVNGqJ(Q5qKQgEojavZM{Fi=noDy^twqrQYC~IB_S{i6jmVT^K7wBN!12yD z;S7}1{qkUJL}@92B;kQ=q_l5$VJx63FO9$km*027*rJurczD}u&__9jNu;rl&SiJC ztwjN%BCko|jV)vczLu(I!e%0*^NqzK*Fq<1Pl_{5h`@sw40bX;q-cPXdDzX-%u@70 zwDBKHx5JrV515lkPJ3p!oO5BkW?taA>@DGe%60*phK~bT>RB56;lGZ}XRqV%G2i#t zXx9n?H+Ld1=uv$?KX5HNdgnYkYJ$((yb|He?#+DOL|v;Fn-}L2&N|IG9Z^M2$fjj) zy%a{NZV6PL^I>mM2I_xEZejbJ3){~Vm5J<TO*#B4#{O93PZAQjqMQoEMNuiTfB=_t4IU4u%TjI(@45GrbdcB%M=qnfkJ} zJd7KS^FHtGYqCnCg(t8H8C0euW?xR^=5&!beShT6$g}AZIfv+ucZQt49TY9OEsefD z`x~MB=a|UhLzq`OcsMrlGNJgRdCS&==$D{J{+o%AOhk4~uXUz1JdD{z&$f%omzo@q z?AGiTN<`WN>fP%7T9HJ!KSJ|If}e`TJX_7~PAH~=tZeLlZUmg-v-G6mhc%H<0VaG!>N8XpVD3pRBH zB@OpMXW~|`Za^L;JF?3)1*oGAw222G=pz zwb2>$!#M;OjWYz7rLYzSav5&XehZ~rz# zd&<7>Egb{^=ncJaAVqHn1^^sw=l-G~MB8J_o5ZbwpEm{w1f8R& zfl;0y;W!vnOaUot^QZDz#@Lg5tKmhy=GOLu&i&)dT>6OQD4VP7zq(ppuj`cw-qb7% z5!yxoiBQqX&Jb~v;qIfwE$3_zxHx3>N+ONuNnqLS{daVi(a<1Q%V4}Yu*JTHw2M?@ zzlBsSJcjC>@2fQB;P zzMQ}Db6c7!!Xs1dHFg@ckK8i92njDdSDMCn7ghrnL*fSv38wL;wWBX;17)-YQySC8 zd+Wn5ghvUq+=DOdAKAT@ZU5IKEc;_EBGXF9khAq(*O_O**~t4+w1)a83!g$hlY)Ob z==W?;qWQ-%eu1!6_gb}Y4*1iU<@67+zxbW8{xm_hShWy;%c@$Mg zca5I#F@1En`qC(y9e&0>E$zM$6jcv?35Kb6>%~Y=={_D9n-G;G{E8D))s*T$%Itj^p)^{Q=v9P{RzkC(f6l6sN`L8eIP<5F^jQT0LO{6h!2>*R z-_9}HUeIYkI$>rWf!A|#GW8<-mX=Kc?&Z;W6Z~|L80hdK(!Bz`<*%x5H-gII&-wpWAOxw+sj8~^#nVgG$a#Gdtl z=?saIJq$)uj^bnzJ=XVD-*7+bzKbyzeU!25!ASfWJ;7Y|41d8mY7$>`Yi@=+s{+4- zF_)PWJBRXp4QDIYSGsYqHy2fEZkG?qK0?{w`Vo_Yrsf|BnJ}tFxwB zpnMZ69&91p`{O`egHz^CZ$Cbro|C8Xw)O-YprIrZi>t}D$qC7I_p-OhH0g#;Dpoj_ zBceA_%4gDEya%;=JHj1KT>($1n$=NU4w}C)=a-%85>1p*XeSuky! zMKxN3vU|V!Q1oD4JAFz-M-WPiY4`%D4wxpk@9FO3|C4{X{b_J^$J-tB_ z*=I$})S!T@D;6mZVLmY&*bF!Y)ZP zlKN}}ZQQu;nPuN0%FQe!@=hS6+V34$a)J8M+^F=xLIyBgR^_8I06Fbg>CcPBWmTq% z)@jPM$%-S^Stc5M;V|;%d^9>7>^(2F3w51eoaTLZ{OUVb5;j7Owy+)=f{Z=VL(Hd2 zX&5>G54z2&>jdnfaIS^6xyX}(=Nj=Yl^J9{JblZYBZ}|aS9AQ20L7_UKQ9=~^jTU3 zJxlK-Vz21EV_6J22a03YMY?AS_<8n$UE&Q;5j2@rMJ-9s&5yl-h%SLiZ8!FB+?<3& z&e-%k#^{nzQGcT)HVx){KWQAaWa_jWFZgqJ?pF&)0hT^O-2Sls>plPmblcBq02uj~ zZcy16-MN~k{O!>2Z*4&X{2#uF`6h@ZF-wuLKCuH6T}gGKB&9bd`(E|k`psSZlV7+a z%;3dOQ{LwtqCdL6ED9U^)%%YXAOJ*kE=>O$8DZ11t?Z7NP%D;lkN*1NA@Ozp9-z%% z7#il^AQ#)UxnVo#93@050`He>z1v@VVN->)@2{~BS3f;BH#9>gOlX9C{-Ur zWLx5Mi0HM()2}#o&NEePa3~597AbSC>eZfUPE54UkDJhG*g* zE!!0B^dgC%B7aR5u%wopNTs!+-myn!jlxHpG`77;3@rNyfn0_GESJihJFVDfNF2?iK7=~HI6wiLn{8@@$N?I{l$D{HD#!ph6uE`3W~KK&1M z4QPdOG{!28p;u@dDcVxz1#}0kR2355!)YN* zrfQ`i5jYvCvDf>BDm= z$2e#VOpBHjre0Gid7*~&tq%#wo*8BsAwZuHW!>Zx8|9N=8qbOVn}|gHZs*pdnsBd} zc{Ns5gw;+U`axrHVr5ONCy7R9#jcb@aa3lo>XvFYg{qMDfLj3xP9z$C3<%XVg+A>0 zFqi@#hhoRBTjqz$Rq1NHoZ+Du0xUdy^IC6|tu-mybUWOw#m0lcBzfIJ&wW64NNlcF;OeQ|i%n z-@@K{$2smr(}|^8+hl3mi=^9K#SyMrp3Vnfc;9;wa1hz}*y=v#SJM-uG<-9&?$zE`2=ce%&)t+>}&ijMF%o%znIN zD96w*ME+AA3M9|{8=_SQrzKM60{ymT5_wU2o|lsQ-gh%M&v&}o7QHjbD}3df#yA(T z!Rp9hFW>MJYdN|8Yq_JiAdNccZRk1)$P9nc%A^XCsczVA3w8+|3X zAYBB{lP5p1j+@Jy_N(?5m~eA*1G)JZ%T+_5g$Rv4Az{xp24n_`0T9n&vnT659$niv z`iM7}Yg=HeepvFYe4;}?j#d}Z~oiee(`(S<~v4v z?pW#1cB~UTe{BjV60fOKmdj}s-ElQR3X?r-=%2;Fhe}lW#I13bn@AC0vYdlqDir`2 zkcc-X0?Pn^okQN)Be+27`f#!aDE(%FwzPo>29j_zW#rJujE`2 z>Cd5Zv(MtsOb821cg;kyi&7_>Mvd{PZNbH@f4sh*&(3jDQ@UlvvW+Wa+QN!yZ;?pF zS{^-A94Cw~?)~)=yfxBVOxe^I2c!hb7x~wL@8+r$>I@g$2?fLzrOW?6v3c_Ua-xp@ zb8QU}H9YQwvBN}8&Z4jraZVzmPEMHUtHwtn$z(Uj?T3XBFL*ey!^E~aC*S_Z-gKSV zZ=Z=Vj?Q68BtDLckMX2l+e_!pkB8Sw$$jddbz~=@kyH?PVD#$M!1rR03qnf9ua7^T zAGDVIB;*O1a+QBoLmrDi1z#RlbpKeQ8i#Oy-|lSv4`x*q@33QTP-mWHKdeak%!6^% z-QmkRxozF29ox2#hg(O8S+&G^akAV1H{RhmVn}3p@l<(Hq#fpn^L9+lXq~pKRI4c~ zQRC5b7-phW;c+?*8^;&)%=U z_gctJ7)NwR7=?4+KkuIZ_GQP)(*eCxatnO?o^L4RxX>ynT%sFyD-x-txSqs z4Is!88^hzcj9u7ycdmuR7#`nWMdNj=-Nzd-G@L3gI=LR!aNG4dP1v|K*J}QUNSM&^ zh}`rr(}Np*O8B5MjkPu|HCtf>!rku|nT&C7Z|f_>K602xJym7Xaj+ zSVGTxrPQ$I&jDtZZ?hn^{FwC!1)`ouW zQw8zm(qM1e^B)WL)tqaa>+v^EU<$kmWp~e`c2jZATLbGgC1GKj(D!cl6?Df7_q`dh zrfTCv`>{FIcBP+AER<<0eH)#(1LDUwh9*ZwpYTI>c&_{~&VmS(Al zLT_jKRurI1hm|J5rFy#~43TJV+~o6u8WkQRGamREE?S8% z$)c9#-$$ZQfTB0M3f;#AG(nptKV{IsT>{#4OP9B|9UZ)Mf!@qke>>2?7I-gSpLHxe znEc3LAp2CJ7cVl!0rF5-@is zADf#AjmLEjbd_F?nR5ray+3dwA}O+bf?rMR+SVg}gU6|^X*2ri45764Sx zv}ms*8N+TujD_?mt@=#dDP0Y!w3;o!=L)5b*(SL!NsTFZO`=h*^MVB-^4#fmkh#ZKCrOxxZ4xJU<~ScSXkJ3R9&q;`r<`75txzk>wTY#oOKOy%8yY6E9=X6 zYZX5&s=5nK=sna?l`3URkz{R{I;x6$H?QkrR-sNG!j&`a-wP}l;*W8m!tb$RhX$gH zZ*Sdsqf&M|I7a1^9~8!$s4G)}>I&Z4`m&51RaBKaOtQA6NC|7DCB}j3z=8Cszv66$ zC2?A4B;??n2?4076=%D!gt@f?y9mM@c!2aq+7k4YsC?|dp{`Ux1diUyNpw;?>H11< z3&5Y}pFXKdc1UiH^fU$NdUVnY-7G5W*~1;4F0MkO_O<91Ohg5pT+VY8)zq4Dy;XKFoFrx%IEw?dxQltE(=z<~&@+T@v6N zp>T^rDud@2rmN$VQzH&PJl;^6Yfcu+!X<0XF>OQh&Bp1umd^Fl9oK?SbZ?Zqc&{k6 zsQuqhBFHljRfPiS&&Zd1dq?%TaD+Ge`*ZEKEX13-gKnA(q&wJ#DpzNAcw^6Lz+(i||T@YwSiqM=VUok6BoN zsLgIur6p4(uO&N5;`hrZzpdqETK}YgHS9Zws#&Y*S=ARb6dgtzdV0ltHZndZMkfqZ zr{s?Jm}kd+8@YXZZSQh_4c)p)7+ew<(cyPptL{>&|CVO1UUhNRsC{*2R{SRkAn-3n z6l16DSr7i)o`X=dQWJ10OGd!Hx`BicS!$nGu0s@^b3D`BF13^y(a@vM1>=rp9|P0S zQjE@S3xARPPY_oojZTB49`|)8_&=JN`Mo6Sxc`3x{Tg_i1fp_vT7E#(WrQCDo z64WND>{WsP>H7DpwT~(`p-1%8Sk1UNktejW>II&}pU8AyF_>*Eg~nK|J%o@V+_m=9PCFcvG|wm+3pD4BPs7(>F-zh zjSsthXA@`y)7!O_X4{+f4T$omzyhRKRij)LHh*=JnfSwgr@xV#YX>KdB*mvC3j zHPnr+9eox5wR&f%rOClO%-6oARyw(F?n^_X)7gL6KeH-LI>cPew-JLXAIksAUq9BD zGuYozifz69OKpaLlCQhCi_9vM5v%UleBteIW@Eo-7M-4lYBHdor5Lcv>X59_F@XGkW@laheSEn5H`)z547RZ-g|*DBM* zQv~6bY_CTooQbxYbFCZSVK?M%6dQjK80*SAo&oAtF*O4i~ZtiF&`H`&Aaz72$T? z2q(}i*FzmN7D%UuCJn!4xRK4sHei3(tZ#C9NLt`g5TAZPM8H5Tp;G)BN|}Dl#z(+7 zP&Pr7ejvUen0g&v=M(b7v!|p3G7y*~L`!oW^QV;gUQ>J$d72<9uq_D7-r&2}(Z=Ru zcl=!524w-QKzz*l6fqnN_s>Gh@{?w|lpBP&2!mFmsQ&GDZAn2Q18PuhRl|8+qK$j{ z(N9$Et&HFp#`#wal;tD?w^U?d@(em zE<_J1j&wLSXvdCD{N6rh+i0RNj{Zabju@(Us9k&#Rz*&htnpn0`{DRe=|jlP%v1Sb z%Mnn<7X8$^ff=V6x4Hwro7mtsjvuId?s5AzSwW0oecrDBPQ5fS+Z<}2eCjQHMgU3O z=g#Ng()gVh;TxykMtW$x=J}l5(v04+r4*Cs6~yaygoiP?HOSg?5h=5?mG4)}Ho6>M zyzzDa-s86yhXR^XTSaqxXR<@KCMF<`#SKkQICAT!O(DSjqWJzC)zdJ?MWeN|+4P;; zYTsi>*=~J+b9X0x8Rx|JD{r9|jo>gxt3!l_Y;Ok54aa8DlpacDCe97{Xa!1|zn6Nh zJYTo@-J9*uCCFhAn6lIS-K(udD-I`c4>HQ9H&&)71H#6gkM7%QJGBWtZDJZPK-SHy zZs^KR|06_xT*z1XDTTgVrHJdHcH@iq8o5R-DsdCkZtbnEompMKCN1^Zi-l_ip-N7q zfE}O^2QVUNtb!M%MpWb$TDNT#;IIw2+p04OZ`dAp>Qt=Vc7kY!|FrgYW6gE}@>&bF zHwXka)8@@3t2{w|x7F&7fSC3KlxR_1-N*ab7niV%KT|XEXM=e)FD@)H6o26hp7gt0xsVYf;yR~&uWXROP$^CHW5~{Z@L*_GTKD+F=M&{x1nmU1A_+%C9phin6 z>d5`_dfO^UJ-OH|+grQp=Hdgj0bt3g2mweG>8|j~vdgh)27-y;him&^E*}mb{OzAM z4dAQD7T$oRUC*2AU);m@ADnr_Kc;7{1N6RQ#p>D?a=gp;E zzd;d}@GX)0M~uN4zW<)u_&1RcqaVJGaYzs<7dH9}<4|6o0}=z=EDq%_T-Yd7IwZVy z{4#H1D2ambErFt#?oWpc55paUDh3N11>yIcgnUpPyXD*lXZe0{F2=mMl6MJS?$ zTQio9iBdvU@XZLkhiN1tZbc-1tz5dHi|E(N#C17)uVnpaR)5!-t9{NfH#c9Dr*&NA zNA?P;WPwPZphV(bCkgRowKL!EA^mST%!!VX!ZNh?4F9WZoL=UZ4Y^r6Mj`tWgLxWW zLw{#Owbj+j-rK&~8v6Iv~D2D{7H%ml=t6e zX`MZL?6b8#m)>HHu+!bh7UJoRtA?Za20Ahl{))vW{IZOnY=haRjC2Y6>}@=XZ*4*H zAAl@%O^fuu!*4R;rg@PoxxX7oFGy9K&Pf?c9`h!i z9=lCE@M8orY2WyND=NzyM96s(Sf+J@-4jw5b0T*CLSf6w!i|RZFHg< z?CebJA%qrU%$YEVt_@>x=&f@%pu4{s^WVYeK@P-vAo96LL5jq)yoY1mxkdt;P$*rW z(`!x>9EpWQN5ba;%QR+VfS@L{qIYXdbxdWAYZ0CGjKBs`s{K9uq=DE`DTz3V>3+6s zTnZ5i@CzZJnBzkJU@#?y8i*kMpj0CeNdz*?z`?L~D{Rib1bvgKyS*tv|1=G2Wk+!w zo}e0_20um`8e?^rK39_wTyMXmi>+z%4Gr^+4Y8(z{2(g!13-?Adf?b@n$jpow7s)* zI`|XVGJeA6kFEm7mMx5evCyuwmhQIHD5Eio+Rba;`Q(q^MIsuPwj8TCxTZBsyaN(h zb8sql*>>e3(O1T}6}&$_u8Y_;MjVTaAG3S(aR+`@4~=!%by+5mkJzISNHq>S5X8<& z2$j%?I6lrTq=Uq`Ob0pjn#1rBER4(mbXXFi-r&0nLzllna$`R|^AomP4qy8i!KruH z05HJ@cJ+2x1`9tu%Z-J68@fztmAG`fm5VE!|0W2Kr+PDs&35xO{6Cr1Y7Jd*u%@gL)Cgp0g6S-XOL%11D&^h)E6Wf|%Y6ZPMv-BxaL6_f ztS)F`l#Xcz9LPQtH4k&p>u<3b?O2<+Ao<>EDu5N8^LTmV3D0B5h2v`k4WM35H} zRS=6{!yBi|N2oC87FJ>X$AYWJS4b%;3r-VM<=LPlU?ib(OR7A=WU)^X2In!bAw!tE^La+IPUb??}!|+GZZjC$U zf{*Q3LHcY?8lWuR;)X?S7=?2@=>$TQ0R!xNs2%aj@?EQy3gMS9aet; zVTuFui{U^MmEqxDEgvi`RR??sxQGYY?);J;bf+r8L~z0~)n0pBR_156R?m$;uA@u# zqW78&mhS3eRQ;{3U3(P+R4`i`F!6r+=QiryvmFOT0p84M6=gpD;)LoDLLp2g1C|kl zeeuwRsfzisWbx`u&LdB?tgfZkoQM7nQuApVk^)B|XTj-%>4;)-j`ey0kLzD3D6U;6Z-PBO%O&3U zL~|Lk@KW;{&3&dgSC;i`zpJIXxjC-HboLvvegJ-`tR+zVA&t7{owwXnom_0^ZP>YV z4Je}cIGcY#JU=OZj_3)`dcqZK@krTsPxy=Q3Q;P3xL~z$0O{R(DCX_g$M!ntK@CRB zCDX%4I+A*QKs@Q5dXeXPlL$zy+noIR?H(wv{A*J=I`(m{kkZ1>P zoMHu()p}QbjCS?P(3i4Xb;yV8GcYrI) zB_c)Pz|k6I>A=h&4=X8tmzZfYco=YsfZ*kL9I{a0SN)AnYeE-Nh|v&?Q&&|oCsNws zwi}Cte!2R&y5z;;Pjag$a6X?M+?iEFCvOR}UN>_n;G;y$@8U-R z^bycAP%2>5KP=p5dYjg%hF3pNwyiyaE>JfD28a|<-FZ>iT#$#-nwCTanr#@9H7lia zqBwAq=w1Od2h@g&9oIF{DkqA-6|=;c9x6x#Tct%p0VbSU6mETtpSiOwbX0aIB;4rc z?PhV&+q={@Zf8gKth>eBO8ZaFni(=(5*F-?_j*RN3QbOf=&*md!qpOCM(0V_<4H7~kuQ&so0ajxpot z60t7uP5Mk}8vb6_LXZXd$`j)vbnl^4c_c$m|0g zA`_;UYP+?D+lhdhS(>*=`as5Q17YYYzOBzH@Pm{%(2xk-<&}iq&RJ-H4EIw*n|b}L zN#!&96xvti;pF$^U9EHE%%Qlm0&05@V&f$@x-hF$X4OnZd+)8rKd}l zIAE_DB4I?@%lY%=Gptf^t%panxa+cH!4?G_iMwrGXyA9jzYl?qTcj~ch>WLZ)GgUI zDui|B~uA%L}oOcmM72-F7qZ`cYv z@Q6?7SEx^7h#viS5+WjiBXA2^?Su9+^I{{*P*l>qd7wl?Gwqw%QsC6)w|X}O2~O4K z?Y#3^;U2#vsU3LDLg@hSvYh)4v0c8^MFy}e^dQAgTW zAGf2%&gYdbrkPod*?3vN>f3tWroL^Zv3h|-50JbSsB8jZUCy0eY;rlxiN^DgiFx@@5AzxJ!W;K2o5ARTR>igS=6 zYJfuj5cA}FY+&qi5D#pBXN}C@sDWnAyhyn|7_mMu(D0#uP8KQE*JqIScDHu$$LVgg z-%Mad=UlUMl929;P^p4t99}RUs^=n(M4s#1>m2KkzHzKKqr7~?j}a+cZT*o)nq0|p zP{XzQ_E*Q0oP^32*gq6iD^ z%;p2ZbEOPut_;bhdOKPp4kT1KYSDcw#dy^Svh|o*Kj;56Gy1td=voAH~dLuDf5ou!0 z!}Pk$kQ{mRLB;iJmS3$rfchcuAJF}da3~52!$J*euDAA<1iAE0y7y3$FJzW?vx=ll zt18pEH8U)k1xs?oV5(mD>9`LPt@M(D@6{Lf)Z8oW$!|IOdr9(_;@Y>db!>0M=@;?K zcah|-=#!>Cn#$Ur41O$eNXJM+z0P7^CU0Svr9yZTwNL&|PF9N6>G!&Bek;+gZne?< zQn7ETCTY1*-HQ!wAf{ct3XGrUp`igl%X}uo*Qz2tUs_T1Qi*5tG0lpU?_M!@IS&Pa zO{~eA_kwc|dQC>E9>bpZcw7->BD;(*s)3hv>n&C97|%E5w2;#pQyS7&A5! z#$UWbxH90)FzmcWvI;tmn!LV&+!QGCcn;-ZYD>Rv9j?amnH3CGH zZ{mqcVo|L=%U}J0^TFoc!@PPoN{h*4%VfqY<`}8xs=;!<>S_9!I9k|AY6wlF)ki<< zb4^R*Y}=k}4H}H4DFE6$Y+G zMy@F^w+o`__)(5%AfBpXbI3?%wDE5-s}Gl78S6h>#@)r=8YwT%A;D9- zf_HzL4B~~IM4lVKNSb>rpD-e6qwP`bQI9ON#H%PG7lHfD#1qQzUf6D~|S)VQA)`;I*{2 z?amWNy(b5vS1--(-DcCbA^1qD-wBUmrGm;>}+gQq1#l>9o6tsB)9$D<~S>D`x_fHtynla8<3(n zx0j2}9eC4qChbf7Prfu-;V=akF9kILY3WP`eS$C5Ia^37uGmKAv&1QIWWg`1$)eE)~p@5*#&%2tkHh4%)?0M%FsvWMa` zE8VImVJzxjVTC@%8#W1qM5Qlbdq#f7CRJf+#6ovL&NZQ!%k8TwQ@c1d!;9DH#`t1D zGh=P@nb7L2K6BcjCXUjLTD~~jJ*#OFU!Y=KT>`4bt#zA?vh8Y|jGyF}%R!Eo}`Cs~FIisLGy2 z^t}j@PZGWO;nKR(*W=G#>(5wk>w-2#U_9U}<->U_C;q}cS0d^*&&G%VdxWyEboZ+N zPh<&k{{0HSPKrA>g@eJ!`NC=+NII; zMe3K^M^MtnmYG1;6wlF0#GLn%sv0TrU~8{IcmZAQ9Z%pKXR(YNfDNk^2jM2|M}8;% zXZSeUn;eab-U<88-vpH98ppnOY5v-3qvhdy|FmXb8EWRHC94+!lTZgNWJT3IEetV0 zk(%Vay}EyCPSNvZWlEEOLWYwxiihz*BcL)N<)ybxxRbRi_tt;VP>acZxNukOK` z-Xz4nD=1bf{wNyb@J_tINj=6tN&%Dvh#++Fr6Y58BTt%`NXkM443)dszVlvCef>vJ zZ(+SpZN(FLzMTw`!SWqx2V-sumu7HwpZ+lRV3Nc^+wA5#wpNEPcav_XRelR7rstr} zk7JAa3x{x>@d+yIS@fvzjfEb-jDx?b!6}G(&w1L!5$F@W|HdEND}g(4#C4}UJG)$m zwr}yh=`n!0fP5C77!0lGw7-^;z<$zbxy4r1z!(r_D|)-HCu84g=Eju1LU#&AAT)&D z7XhvaSg1+#V7d#Pc&!`5`KK91t_r6!%9jregiwQPYYLu$S!4r=vGT{|vk_fbEj8lx zxoT;a!($vV-q`+*pi?)uB~*S{r@`AGiC088(U%yUW{xN}=bu1-F>somXgf;ZrrSsF z-S*oKJOYVINQ_h0zB^^Bky{bjd*ALnarOYvhn141hB@9HRe=YA>hN~iLc_P?<72iH z3w<#wV>bBW`8Mlke5nJR)8qX#w|&)cFeDnIAA#C%x2{{evm=7C-SGHP{Em)3{;UI(wAZ#hoR+@? z5xABTOs=J0Yywz^YzrRSs-^mPXiF8)B6xjYQ$SUtw4knX^ShfO_6vPq>UX}s)tj{u1ojJtL1xzi`Q^ql zd*KN!_Jg_WGwqMN`!p4MUEwTkt?^$-qrrXAYWgMdQ zR>$*pr)})gz^z*qpWp)PDv>GHYTt_!A-&eKw-lo?6H{8V5tamD~U@$<{P^ac+ zESa5R9pMB73>;^>vo3u<`(eUH^;UTnA4HFh#ObJmZrSm)Ze?7~a!lc&2N--0|c3nZ#Wkf3m39+@v|^q~mha zi7>eK$SJOs9jC`4JQw?%GrGv!yGxb4_U>Qpux4K4o28ht3;43*oRx}GAJ!C{;{JOG)i`}xKxh^fy# z!!md8uiN_jSHt1@Pa0syb$6*t%nsKU@9)9P;19>$jgW0{hit{TMZ+Lf&sz1{8BX4{f(Z)X=DH*H0fx9fho~t?CzApto9DAir$M{3=p`UI?PUbWn1ykNCI9Ckio}H!)mGptS!2j8 zdJdF}-wYYpO|@LB8uiUrgjX`j@Z$@A^Hk`lGT5ke(f2Bb+`fY^k_yUok}?vaDoUpK zK;r>7q}9v6)@`6vG1HAt@{HPUsB<5JKplyuaAQ?CShf1vFo2~3W?V|W`Vp-mbO_W; zS&z&2o!y5P@dg1Lj9*CaYhp)|N|W1($*>kRqw2*GDayza3M!r( zV{4`?&RbM1Wi$MHC3YL>v?4b-o}4&oxRED#i0|PobkS)owa`Dw`SKS3A&YI{CtHS5 zuv%^JsNcnLtp%eEGOI+7z&q zADY%V)-XVdX~IOs98y@4a6)$%3sXBW7`IQ?IP-WSJSD?KlI@Xxz>~?xX=#hsO;tD4 zjP=)bq{py~==T?bCl>2MZj{;z1V#~<3jT3&h@Yb>R7XA_EOmkQl!dUFYQetG4TKN~ z)NwC}!zoVH7K>7Z$$?OA!A6zCvsH5mZhlMWGbG99+(E}SlTP0FfggH0i2rc#y~!au z7)e-Z%2J;~5#7b5S)HUSooe<>u`n|7nv&TM@*xrJ;joN2T_Mcm`a$+29c&FFeceY; z0KrLzU;HlDu8nxs@Ou|DojFDjKVMZjo~CCj+Tn>fzQ?3rMg06dd=r+8B28}gC zIxaFu>QrrC)Z{XT&wcPf7Ml}$KW;l1{f)V#2NelL>n_HGgto`(&>vA9z=t#<`TafX zOWlN#eg8QWi#a`}qGPQ&H9>QIj`6!}Je#1Urn+&MxVJU%)a&6J=cJ?ScJ@645RV># zR{eTPTnRyZ{+!uQv9ezo4}z^4>@vD`&^(3mRxb{OWUGsE?%WS$Lr0$QO2kt2#QWCH zq4;dweyiYR_$dvfF<%nd49F5h%l9TFYWL23ko-kkviX6iJmN)<-+$GEXXTb5$7Rf5 zlI;AaHOjW9taekLQ|$she@3K^lo48@?DU zf@r37fiKz5Fu!hib%ayrR+0RDu2K@c((k5P-onAucx>~2Rk(B@rCpDrYec?W>76ct ztzX*xUMTRbbZh~|Qnrzlz&JeYpwm5aw2*5ARj;9)VXg|}@L!HW#eECbKWK>fx5C=ZMIOCb(`RxMM~NUT?5{ukf3PseaAVrAKx z^WSa6uG(z*Rw&}aU9hQSnW1zZy3R)z!vSweTsYij;dAQWrW@jND)_8*bfg~p+A7QP zbFGuWC5nEhCt;DBe3gEHocBIOpssT2cKhk#aGFQ*=?AWDpSQJ>j~oolWgup`d0!jQ zZkC5db7T|yThGw?))RDyI)|2ZQeVQ~rI7+JQW>mVJRs$rD5d=L8R?WOr(C6BXNV<~ z93@1Z&<&@hkvfgNV=^^m()FH8An@=Df5EI%zJqgr66NFzw?>)yr?SVT9Bou7Pe68b z)K2D;&Dq>15;*%*U{C;!v6VAyFmaQjY<5=u^{CeV1?^)0SR@Y@IK+A6s>_zB z$R-8Ib++mZQus|cz}fGENdA-Mz%{$T_ve9A0s&I4V-l&TF{GXFOU)GJv*Wv~ZLaAQmT^grN!6}FfsU$*A zeHTee1VE=AePk6Z9GsloQD+nuc98vSbg=LR)?-a>ss9n)<==}*Q2A%fBmM#o!P_Ct z%ZGF2>+_88VXFAo|4jIU|0lOyrEh;eqyBj5(0BudqqZNrq5~|tPZVCG)3!+aW!f~%H=U5@vc@MmnOF--GMulEx4 zY2*=XofNujekyYJ-}D$JSz1O37JZ{M$Id$*AG;=W3Pc|hpzuXxhRXxBolV6yr_Fn2 zc^P^XoZ{F#VU!fhNR0cFmm7F0C?w=of`HxbVd2;2=kFILeGoQ6*<=N|uYS6k7CRM( zNO2y47L#7of$Thdx8vqA_*5rO--l#1KkOhG{F`MqrzxgF4_z*2G>NW(*+7t1eA(ni z#hCWAgI#$v#TN|;K~{I#($Hvxm(*{E{(KA?rl7B;Ml=6tksbRBA`TB2ri zB_9b)tOuzC*bw((1l0qJ+S@n*$|Bo*`1|%tt$O^|$51(IEe}(HCjD+s(`_`o;QN`44 z`To$6^x1SgRz;4vYwy^t%lLX8%gf2k(o&fY1KLyD@m{>^4S^7jhQzY2s4){GKbV_W z*dkHAsj1IYD|Q!lXkKsB03dyS^&TE50CjS0>dLmg@83{gPM71iog(KzO5TLDFRPgi z4@Xp`pr@nM z>wj+ad;{H9#@I+SloOgdD3JKrW10?Jg;cb{8Q3KCk(jY==j@-eULkGS2Km0bE(5OR z(xw^#>H<8=iah6MpY~cfBaAhh2LiWPBHafKo3qU{ygs=8IFny7adA%D-eb!QPPURrI z-#^7yQLMUMy>d$oNIegeFNx+`+uE*$0Fe!RaV*BT1bGH^3!QLal>dA~(@k~7(mG(M z38TEJfdGhG&o_txtx^J`vK@~xAQeF2Fc;x~1b{I_{+=T`^7k1adHkBWBm^i4FI5(X_{3m0;O_(m%&5g@6S3sA%~bMqsA6BjbpJyHwVx?kkSrDmkSUYh5>@_`zX-IeS z2KBPv#*pY#<__Wbx-0D;3EPnB#oOj0w@qg^;_aG!dAsROY2kjI z*8X5UJ^Q=R>P5R`fR+%r1UKWd!5iztbWz!dB7!jP$^{2%R(kV;^!upWC|3w)S(TWv}rL!-=RuxLtHzPf~^DcD4Mp0@jJLA3@H5`_3n#%dP zLW-hF-nJnUazfd-x!KrkAT?4^tkf?fL2&2uS5@IMIBhxEA}#ON35Q2JweeO+)$tC( z-q1|MKKedO87&!e>D=Qisf+0?`w!rxYn@3_?*`P#8!RI4(;4YIhyXLb${Dtih8v=2 zYJ8zc-V2gWcJ-mRz!1w#I-F+m#2?-yb%`w0x{c+g;zy{?H#An$q;`#;dVT%zjY8OmR#^&d=>lXgr1C3k_44;W3WPK6nipyNB zEuyRQ3qpl{`aAsQ+Nl@Wo%gxis0NuCpbZ7=YCCTAtNOnsesbo8t+CX~2w4E`IA;v9r{YHn z3?+ZazM`KaWdFMFVSafDu%K+fkL4++s_&bJhM9NM^ev{%p_UDu%_Uwk92Gv-2w(nd zO*#!;Vb^KoPBmzcuz@!lolj;kWPIKR~5=XmELnYY)*%$ZgO=!pLIa6jym| z{=4TFcVRzvW*w4*p2TlRpf;sEGWqVN{XtQmd=im{Pj%CdrkCVX8lO|rb_a!loU#>mFBvWxC#Sli`oIEVbYF@a!?z|BK+0sfyRZoT^M2c=!sqs=&aac&A|;pO5f6L76OOPfE(}PQqVRM=e94Had!Ar|dJV&y`#Qq*8Jgh_=%>E7Kfy}J5%!GW+=43lSMMpEVm|cmMN-xn` zIw2E5z^KvZ@*K$G=A@Zd#er&f3b-2BI#3P)&VIB(_YXlQ=78rv4#edfxxx!~ zTPLJ71I^E-9a`PrgtL8<-yovZJTTgcFjrd2SM!J^GfBKS4|%%y6DzCDP`NK5U_cn2 z4Ss$BnHj~$=(so%$(dLuZKes9`m&5Ze_2ezqEGa2_*6vJKDwpFu8TDI2 z1}*okCFZ-0lgVSfV`z*E`6qndbMR@)Vs|Dw?Ey*@P;F{FUnb~)+~Q(Pi6w`B;#rb}7h|CL&>s`=hz&uAcPHFmu{3IKovZ zG-VOmU8j3P3%^RA^4jr0#4?>Jt8>Wlg~|g(e5@?7ph^zs^rXr+d$`)`M7EHCPS1dA z7xUv%y7%w)&CZAD#EV}3zYs3JE>N=lrHGqVWQx-fH zEr17RZal~|ksH34za)abTFq;K;*zk2rB!FZF1gKZl7~r`e;eP-`%YA&+JP(q8h{5b zf>#AaLQt&9e55y_uqx55NnAuRqz^g2 z@G5j}4!hrnCl-{~+xL>uls`Vb0fr3x!EV>ywJ)Zbq+P8PCBsA{jSoOqmtS9J_>_Hx zKy}yCQO;l|rS zL}KSil2;D0M&sF_<{essGp$J6;2z_R7huq$b6uZBgK<3k){Wj>=cfBJ&hv7ZS_LTe z)%13z@#zbe5J(VK3$*b39lhA8a96Tv78WqQCuRkU0s&K)XF5#!4%qy6wAy)Uc>>$e z!m;;{&N1}Bf-;~`C`-RMpf%y%mba_oDDKQwi=kAqYDgbnf?*9aXe-NTM=Gp$(ugcV zDUzk$DkzkjP2+`{BrgmL{&?8!RAB2(z7Rs>9_0tyB8;Mp63N|9$7bY{Zw?`omq5z3 zX9B3Pj&ysb$Fb}5;C8dMsEYT?E>pwQ%y{*2JUjQ%{WBe~6`nJM8U>=cA;ui@OU_gy zO9xC8h-I1IC{GoMTvttTNWvAv{~SM(XzzN}F0|{N1&LlkUOl7ECd2=L0awA`rpB7? zYvN1X|7<2Y$L$csvjYrPF77x)v)p#O+gX7H*SB-3D<9we3}AQk-$PBHJRL z1hqq5)qV)C)Nc7HJU4B~?8^p{sa=guO{eo0*wR zfEK&A2TQ1(BkZG2ksH3fufTsVIH|^qUSqk+NwQo$2AA-H&zeXcy5o}D1&j)HCLlw= za@M4hef6X6D5Y1el-d`|C#cX-g9cKYESPAP#`4t57totG0gsjDrFt#Uv)dV7Fzzeg zR$RdMe;%-_n~)q>3mJu>iIP)8b#1!EUdDDt?`*_Oy_Q(%?u*e%onXjNfxq77%LOm7 zOGh&xBY_Y}Ja*ObFKe&NCPV-UZq26VPN`KU{r$UnJFG71-cc3U>~U-n?2YW=$IBQ2 z`(U-2gJhmnJR|gNyf&`#I|y{E;YtQ%g6w3_lu6iezIzz9%))a!2cj2y^GF=^rL92yzd znp8aq?ul35B~~8edk;~_@GCVsiUlkNkk9uULP6xKKFntWXYbHSIP6-lq`%ajn0>C{#}HLTw6HVKO6jYt_+?aQxv$UF!dnHg{d!+kr$$@6zDZ}{#uT%;1 z9B$9vjlLC@EAa#S?vbnVc_#U!?&T`K&HEzyZR4F5Dg-}a7jBvIFWZ#LN)D&%A2`cq%{|4l}Gfi5N%*fMgOCEGmqS3 zD>&*w5}vslA^j6W*caH1FR@Y}%7MR6r2+C% z|JtP6>7P&S(7Ei?Ru#5TA`KGl?udFo_~Md1$!-_OD(Qv1CK;`K`toOzi2Cgzx=fqh zA`}rBrjm-wi_@X=<9ce$(UPDNo&%<#O60!C+{d---NY5LU$j!dx8F`d>r>j^$MSh! zXoO#V#<^d6HaugY_vD15Ul_5V8zxZFI)BPBW$Kw<6A(1UfK&zvKuWVva?$qh!hmAj z$kQgg_hwy}YH**+=Rd6-nnLqe=zB%f6j<&bE;&mi`T}=DT+kZZ;XV8SXf1^|&~S$| zc4#4>XEfc#X}o;f2~1S-i)m(%oI27W`_WwD+}>BB$IUiqH!gLNs}k7?VFv9v=PwTm zj(=bsX|ccnZA$3YMZl*4K{H3dR=(XE@0jSfaMp3h>ZY zymc|gEvi;4yeDK@8Fm!|j(McdU0(xXfHMRzP1AudJY#AVZz$>pXa2k@2AM9<Fw=XRaVSHTXB!&}O0Rzly6hPD}(M~%C6h`#ak}63`M@c;bF>t6`&D#O^#_F+~#w@-#7v{83CVOGxO{NAg zqBWc7;p8mrhI;|Oj`FqTFnseBpqxiZ?}+A%kzQyVXez;Qc3V9FAa!*_$NQM4h3aVo ziY3K6F%Sw!L8;Huz0dpXDB-fuM}BDe+yKz#p(&z)88Yydk+3*@&PC79Fb>8UQ(|OT zFtZMLEp>_$y(u3SZKaZtAG`_@{8TPZG>PIUE0`2@c#E;pm9^=NH{P(IW_Y~5|ndh^H%(>YN z$fe|2zwvwwt+k0RLHT1*<&if5e{0EsdqXIccB?So8X#l>TpG|r+tQbtWhxzyu?;HF zZJC`<0&n8{Ge*lSrS-Rm&Ppw@jemKVYYAC-m}rR(d>C$_N@TV3j%eYs-kgM4Ro&Dh zyhyI~N>;J&0>jVru`{wkaO~>zJ4*40hi+MUl{mkdUe#wXp2>*#vX~vF46fwGe9n24 zab@3+`A7Bgh?&Hp8+-lqz^D6%^YJZJvr8|2gmIe|e6T7rRCQ>W`Qfsd2!=p6seUwGIKp9eXnCp)f3J-25+zgbR&W!jfkMo}UG z(rMK)xA$GzdG&Jf0SGY!>-!HuB4BzzWB0>Nl?7N++-H zKmK=B<3`SHJUs&cl3Ub(SRqudWZlHo-EYC9UB%Wpc<$uUYf1e1WHz)J-Z_PrfMj_q*nLVk;ne(=X`#nmQ?7Q z-@>T-8U32~_#6;cF|uFJJf4(s1G`RacL?*!9RC4UFg^=hYSXibMzD{dFM<6?cji#o z!o$a^tFC(I)d$1JPXH0(c?`&XKa65N2 z;GtcQ>h3*;=pB!6uH$ytybSTk*~R7&nDz27bfH3r!a#7jhN|RJ4Oq;;y>kIC^O?V> z_bjCtOUY+rF5h;3ZRQ}Lmh_&G{Q58{J5sC0YKuQ;e77YfvVzkwY&p+Ol4o#vH;cmf znhItcbORJ7vY2pSDW<4%MP@zL){wD9+B`*I!CJ_1w&=wKjg8hT#Gy~%7^rg183t>O z=ELbNS!uE6bS@a-*!s!@juB$F#P&Ow#~%H+)MRC*c=&NOI<@&?Hgd<3^7ic=W}x-w z=PKB%9k{XtXXz4Od;MX0-2+LaMto&hF_hqtw|Sc};*JYV_aO?1pZ)DGzMXG%v?24} zaeEW^!n(qu{gXCvhwEuAI)d--7EnK^^8&jlJ1cS>rbRl;`(HlvBgaChB=;TfxID|B$k0%B-v!1*c!S#7914%K}No31ECyN%keYM42rJASjS zF#KQfD1M$FM{a3qd;w)0d~KTAGd*#*FxPT(R|TacMV@`MyaN-h3X!H354+*9wKUa9 zS}wpWitJDU`aXQiE-6j!|h%#kvdMsMIgMUH>WWeEQ#m_pnH}_5CkK2iNzx1OjBv!6z~C;>_cC0;xy6cK^eV&xj>{s; z16Sz$@-4}8z_->k-tC-F?YRi;{1Bqbn+NUj&IWWD7wIpM&r3R6Ne%r%1q+)889-GL z1F|jkRj@MdCf6xk1~9jrWM(L%DK@Zw_!2QW;3Rsd@hARShY@^8op5Pw-byy`&bND+pKSFtm zOn3@DSl1Hu^Es#W`yF|Ut4S6m1$|eIr24g&%P&^Gq>>$fNj}R_1%jO7h`{@r-xER2 zaU#;)%VMA|o9->cGB|`R2~v&=#IKs)v1PF^?-vI-xwU$OR~!$l2BlIf1}UDBM3Dh~ z=*j`PyU5P|Je77&wZ_OKDkRKmnW6A7o82F zbU$HKZQ*halnz{aKZ(xGhG8`aak*L7{R0ms(wa1#{q3>id6eW9&&pNO-@2H{)an`g zd)4}viv7L(rCwy5a-)1}hbO0ax%MmhyL1nPt^AiA!R1CGNpk=+B(&u52Vb_>xDHYp zukvhPLjH>6rM9${ejy_}@KBzNrrDnEbBvzJ-%;bP@!B4KY}e%eqh4~!^rSayq7dDT zKl{y#f^D=_{gQv?$7wmz3Rq(6ck*R&^9uogOxrJHN9a-+IEH}Eo3DTC=CjX*$bo@3 z8~3p_9?3j70WdwzoHO7n{(+&?)icueYo_F;#LJ#Q0a67hS>!yADPP>z^Y1mqrxe~b z1hE@eCK*^A{ZX}9Y3du7Fj6rrfn%$4sESwA?6)6(`Hk zi<4HgtgD+>Mlg({8AkvB1XzP%000pG4QTT+fdiRlc?3kod7?f+q~SmiX6DA`f75N( o-IM%8o*ehr=#Iq=Q0BvwUBdJ3D#O0Nrc=1OUYV00000000000000000000 z0000#Mn+Uk92y=5U;u?e5eN!~<79=jS^+i!Bm600*lcKX+wfW(HdY zfN_R#dm&NLolxqx_tG1O83no>L_x*xw{C^(d@;VG{rRcc|NsBLAX$vz?hm|2KvZ=) zOIuYlvYz^cEXd)e6i3QlvtuZ5)HY)BifjsIEo;AS{=hCrH3#ONR4X&pisNaE6`o9R zCg{jzY$xUj)qIF1h0WrhL?M}8W@&a!Gh9f-773A;`E>=NG$e zQTTn4msXK)xyWnukjC7{D2KVM!UQovQoLP36Ms;#ZSl^uAEd?X=VDINb45_R3pZqZ zIDSR`c&6ED?Z#`2le(q2iuYd=Deu&3#!ySRI&|~R$j+|tJ$mAaCVzKi3FX+15)CaK z?^A^5Yb|>{jf(*U2|VQkK$fsP2p<{aQXcs3gg)c<56{o7w;~tKHezFpF`~wZ++PsA zQ6Zy3Qd-?4S|ue6Kn!eDRIr#CC}$KHb!MG6|39a_XFm_-F+9N)48sVKRv;92e@dZq z3YA@yv1(m6ZfXYr57K@4GMS(GyWsVkN_>l!YT+WE#05TdA*wOmxw#-Y7h}V%1=M-B z1r&~@FDu>7ms9_LB*#grv5IN>kYK=2N({OLNe$YJ?$SDcr;!Xv(Mb$RN&zgv<=hSw zHtpvfQMYB4sWI4hAGuziRDN$t2H7T-1ref;Esy{I{hwOWEKA8^>;Pf`_)03Lsb>q6 z0y+9I{Q1R0fJu?Vg4o$J6Kb+ZsU7SInvjTJgRHY6l9FePiTiL0BXY(a2@WXNhh_td$RP;vh>mu z*hwnjT2OSUf`g%Rfx!dOs^V{1!}D|N0V8@;kI|#X0tOrGuL4$#1*~9WW7J?oZ-9t^ z5+;ZzQ&c=LP{G2$x-{xey-+SH8Qf;b9WfnZdO~`~!^_ui2Y`6_R@(ma&*`hS-i)+( zca>ilGaBKoOl@>rg9tImoI0frXaIPxqa~6AxSv~?DqAncbiVO$ug*S=6lXUx zl9MCg>dNcLvI9%-krFqfR&xvxIH(AU>c4funC_(m^LQ=&Zfi;vRp|(ddV!I!nB?F0 zof@J6XslaoY%~_^QyaC`Me)zcRtJYSu-)E~h=34a00$$t^KYtU3y{Q#m$KF&>q2)f zx?MS?_T1&7pC4wx|NnddGXs#E8Gs}JQX&9K;tU9h0Lk3}21%|yX*X}s9cpUUD~Bxw6*`%>`@byFs}U)yRIPFsr*bG`L`T?WetqF{K(Ig(TPtf-PXpyZL|S{QN}g>q$2cUuk9$ zMuapT8EZ30AxP^G`6y&NV$KQ*nsok5LOg?t9i-Sn>bBY4fqNYz zQ=n@|#Joqj(KX1nx=r-b1O>z)vB4z-vi^ zQhnAu^R0O0=d&W&Dxdc(f_$*Yv#Agn(E0&x5h5fQ6rxW>FX z)O-g)e<4;w#t47|5R_&tBWz@s#AA`#O((TbFqnhrS!$Rht(6d^J~~Ix~WyEyba@TfgA#-$bRZ9rYaa zZpQb7i{kWut)CQcn3+G9GxphJ{|iR<>o-3ct})Uhn_8~!Ppv_O0%bI0xC>I4w5-zO zu_LZCX}TfZ#K?cWv=R(2j1r7t38TalXOSGSvEy9Qa+!IR5g0F(iiTAzT4jkN!ATyh zdXZcu7Z#@2gzHxk7Rx{}NHbm{GW20br{)`XBkoTayP6pU%fZDEJ77TAj-;*USj}G! zDnaLAQdRJvX=X!aa6*^?9%IULU8{3~cs&!t(#=2iWj$W2V(Kid=4~*-?F)$x?6Zt?#L3xW;Uy>L9<`j1#9Vsg zSpQ+EdBNh`@PGJyf~UIKb2;x(_j=JWq_QU!!@x6)wv|tXe;^$R4`yLhn2V%mn5~xYV-86RT_{^9xL)C)pZ(k_HmcQ!Ud!VL}*IY6`w)Vo6>g%u10iI#U3Q(~x z3>NDY?|i*Kc`Cox>`OuIq1-ouJRbzI7bn0UL4+{1_s6;Gf1Fq0BRuusQ z-{-N&1yZRGevvn@L=9I=`7#OBZmYV=p|r12VuVKp%5WNdb?cj(5BPLQRLbjf&C-_! zfF6|%Hqn#-Z_T2z&7v}E1-G4+I$)EwJfEZn@BIyz0&NrM^idp6n$=%;YfnieW;TS8 z$y)RsG+SS#WbcW2GPiN4vj4)w{+rB7kvO^84V7;eoZ*qJ;0oV{xEuTfL*mg`-Fd%G zh;%990Q07^h&{Z9`vb6MOy3g9F1W%P$ihjf<4s@Xr=8XzLOEZs*oR%V{nnY-GoPGxHxbui*F~%WR3Fx4mUFByJ!Ezq72Rc=SU){(smx4&mn(*ejEX$ z%{U@$l2|11aR{4g=wt>xrK#4nmgNx<>mnCgnkaKa(YADKekz2)NEdBd$6csGT14Q8 z^`xn77TYRGwuqFbK95+*1YYQ=+Qc)t{B8=N`MjT~-01T1x;teM`MphO$^}H$5@8L1 zha*VxZt$nG{cQk2ApW}PlUW7!~&OV2^P;xcw zd5s%lo{IQgY3rv08Rla2?xm0b=G1ZvMoyG04Q;5bO2x3!+lv>-sz$4}`@+Bf?sa z`C|q>2AeDd$roR*51!jr3_~N z0`!Lco1wLu1getp<<6^}xTed@^|LF9T)Z`8FjwnZWq1>Kd@G&Wwj*I#2nA!+N7ZIk zq#?ANj>lZqoJ(bK2XM8o4f=(RA`~KA9bfS?&t(^^UN< zn1f)zc>?&W=YdE&3-WNc5z5HpEP$18NTrH>t|RUpz3G{1I-^QKEhkvJoQJ$3dYNBO zQ;wO%+k2B|IM|Qs@t*zu?FM{ zP&$dBc?`8ZHd5%i?X>4@$ro7=g8kr1E#&;cD(HlDIi8M@%e#umoB&`3Um7wvZjls# z)Bf{~`UA>=_vz{$VyDJ?^q8zK`TBbD3y<{sI$yb`UH2MUi1?^;0&q}3XId{a?h$|^BLX8xS z)M6eoM5{+-uWipjqn{0g@Z?8^oOT{ci9jePbqCFSdBQ{|PeFPE>&EF#l8FR+oZq2CI&x(GJtdV^T89-tlsuQ zcim}R%}mi$N+6sVOvnWu;Rh^DNfi(z@XhH#HpoVHeKq|0gh$(VmJ@l!Jii@#3;Slj zl-}M9`UD%>8ylUi4c=_yq2_fu`B#(ooE?Dl1?7R?^lh@Qx4bCZ3U%4^*gkKkijWBV zf`y8UNLH+4JS2$WA@l}RtBm%xug(qvXM{S;{+F-!rR9aJ4MKRYGl-(xO6s^uc z`(-k|i1oasBZI0Q$aXn=BcGzmh2)-rklvjZpQ1>uWpGSm{|;z}F;ps4&6}?j5FUje zAfPNu_Re7G*3H)#+@V;Bq*V}MuM!GIT0XV2XWrISl&xX`c!!d~lrJHnSew|Yo)*BT z^QgwSJ=*@`L8OYWT4pD;z_}I~Ctpz*EDO|^%-&#u#7S0`d!*;vHXis0wP;?3$jrWSHeY)tj7y2B-2h>F?A_z5 zciF}o@8;A*Uz&77uWQ~hEuhB4DS{m+QU-4?!V-2PiJflXU>&&)#OID&5Xhc-FJ^tV znILx~Y(<-M5#mE5@tH9$L+K2&o5oeGdq|GLqeLBO-&!SostVdXYchjYM#v#rZ(qbb7b0G& zFxmjwOC#PGhz#Wo+-~?-dpLPsb!%)#rm`i#NM2I6mM*}6ktz_BAvB|~TYUR{2An=` z3iL%b)YcaEKi(pB!T$b}g7_T-xFfFWnEC)}1hRnVB$0j&s>~$a0*)HSJWO%Johle)zi z*)x{0cm5?@Dw?#-(8GGtrx7Qx#^P}d_Bh-eoSz#9J)rfo8{q~0#dc@U5^EyN#G>E#W zEL-{i16l59%I+KhGH#o|>Eyr3#k%mPpmBQps|l(yZN{+$`LEH$-uzev!4p<$RvKoe zUvq$@fL5_GK>kqBG-Hn%rn+*Mx7ivryiyUH>ee6@4)e;pI8bSD*)w6a1wYr#Hws7?;rj4WKagTxywU+ZbT0MrPO!{a*in(GK)E&$JZp>< z2hS=#7<^OkF+KQ&#Umg^u3>~SD#jiW32T%HS8bViOqiTh9%(hAsiTKtw8gU#+Jn=t z>moLzuWJKa@Yi*)?6hVtOQP#(&P@K3&Y%&}xWW5&XC zXm;BzmH6unu{a|$v+^k)%Y!77Kp_**1UtO!8}!Yl&?9*Io8G<3`KOCzs{Z{aQhEs5(+mAOXt0_>Eh zXqlciCX<-XDjqEA(q88c4U zj)d?1muWF%%KVs36`HcJ>kn1dMt&(G&X0msMqAc`bWh-@_A z7EXlSZrCUiWe5w~)be$Dt?D|}HBT@TWn~Rot(ufkV5?4_&qT=O0y=G^^fREz|1fW5 z^zp2EqGoYgN@*vh~wB|1D`m7DIY#cfVX1pxXT#ctV8*VNo?c&M5~= zQ6?|Ht0FBw=!=(rBf|`lF^KbG)n^(UO5;ubO#36a#V>F3Kr%Jq=Ai2Faq^l zE>seE2r9l^RJzf?xFAnz*QxFa3LcZ%T7xWx$4Cj=J7nZNqGl$QVD7!SbF)*(D`)W@=PM-omz)a%^q8@k@m<91F3i(W%8lMLi84v!T? z#vnfGEntC@Ju1OebUdiAM$@Iz{QL7RT3n)wdTXTPDn-Q!@j*mIH%;gQ^H|9OSJOj} zAcm;`_#me7nQNphyCQYNV}srhAw_MEch``^spG|?L2PG!m*{y~StuCnJGdc9fvvA5 zD47cO#(dDhg+P#>%7F=BVpAwgusC^}wx=Q73r%2z3IrT%U0;~x*a{UmZkD6_V<9ap z3~%N*<1ADBVHqljO`ky*EK%- z+I%&@vRMF30wB1eCy+up68T452-0%&-X?FGd(_Z$gza8s=q(8R?yEc+mLr3K88IGj z)RFgYN-CGre3~?EV<9D6GI@kK@Aj$}Z78jA535LDD`@oe`F!Hu*nD#Jz*Vgan_Tpn zL?8XvU;&*w^tnr~^4d>2D|3nh4t0Y~S4^b;XavK<;G}u)SGByi^d?9g?N=A~nd?Uj1civ%c#?{2Q@{qkS zdKyC4D`se0n<=$UKd?@OGzr1NRA&#)4lu?vie zjCcC(L5JeJ`Prp;QplG7CQQc<)k+xm$0b!GHS8DA_UjiR!fDCw(kSgmd}DcC>&awsbdsv1QdMco4wwnYXlx&vGhgtcz{49va0 z=hP9yDH`*?xoqNiy}3=4m@jGmbQxN(_i!BHu#6l;u8B^JK6m|U#4sztM7*nWssd2o z>{(Rj9@nRLM4k%Wv-#Aa^QSmjz2}5MSK#g^{nyT0O3%uY&zH|{KSRvyF#CcTTZ^>G zZR%A=e2TVXf9x=So#Nd}Jq`ZIt?obm2vk-@SKOWzH#uaY@{ecSaz`{ER!)+tsmmRy z6^(JHW?~bE_Pl*wiem+ZsX;`2-@v!+WRipa+*RC6|o*F^4p;k}A4gObSDB9M{wf+oLuwWs}U zvflQogb7C0f1y1jA*uNdYoeT&mooJ7=b*cArS;Zf;D>D&%@1x4iCcOi?_;m1y(?nh zOVn~Dr_mdrSp>Wz3{3S@ecVw}V=?}qX6f%S!iVKg?G^w$P$2vCJ#Vq6#}-}}(Ww*+ zMEb;lYK2v4=!z6QTaz8NT`f4@F-3u`2ij7(V<922cUCY)ffRm|7>WVxbsYM4c+V>k zp8G9GO=l=pDnbu_a~sbKVEM4xc`PylB&-BoaAYze;CAeUXO)grC$cobVwB7t1q>X) z*Rc@|Mgs6mv}DjME6kzfUw~9E5thstFesxgC{9bjM0zp=J{%rQs`%yN1;>qbrTxjL zMumJy9qb=R!87GF^P~+rlu?yK4t=C42)HSA2u@K|+QCs*T1ca>9i^O_tENyScqjk@ z4v5>3LIy#*BGAWTfk4`3%63frH=H;Q z@PKfz&vPQB=f$U5Jt;vGtuR))92~H?#&yNfnOzczp)|2%%h~}u$q=+jPd4TZ_$Q6Z zRt{;}pvoH=)D)yFPu2H|Ky*DoX;$sClvY_7n1frSW~HNSW<#e0H73$)khVH0QPW1_ z+{XhRscQJXpkIT8rr2RR8n8A{Bn*&YjtlHdMl`@{XyLF-lY$w?!4>96YTEpj0S;Q! zqEem!v0MKCI9YMBV`RbuV7e$^*{^DAe4KIYfDMBLw(F&VyPOshCx&;4+~;OVk}gbM zCTjDEAER<%?sm;LgYb+zEn3~J?*r))#Jb+~+)@hwp+w~pmEjAGu zbwpq-p0v3`jl4sOLjEkc_*q2(R%G}g>iVek3814Fprn?Iy#XO^why_+sH2lHs@sX& zuv$Yl2w{vt7-wI>6}xq$_j#hjmQBI{av7Z}mLVgq{{f1bYzk2rI$4^2om$y45~<*T zxdJiq5Q7USaH;4j3M7#iA}Z0NOt>*K0UL}5?yhHYJC;6U#89i1Ef6W)c~OQ9O*39X zfpDTmsB)7^Xj>YMOvp_7nKt|+pA*fLnoT~=Mf|cIicE2`PD&RUSA-oKlu4@H+RiRN zTt=u_C9EG{Bkb6xed-o0z_>_W0NFmxHX(l6K}#g=#pQK5L`x|cAzU_v;%xddiV;1S zvv-Wya$;svOR3aN;61AF20RB*Y89o(RLA)Vk4Q(ji&ox(^2SF;x>Pb|OFl^}yn}0e zI4=DVT*`1Pj7o*Dh{(ax)r2|_@(f%J?b*gwJKFE#wf>^4x4`?>ZW_{t)p~VbAYWi1iQCf@TUQ@F z^TLL5+oi}2w;#5uJvHh-2myRmiN@=2YxgYkOpD#Xq7-%A3$Ig6bYYVem$@gz#!w0b+*u+`B8|C3lg)kLBB>a%jf5~UhebK zm4geH&8Zl&x5Vth!E*ZAGt37DAGcsr2^A^?1OgJnzZNu@;foe%;_vfQiEtmf`@cqO%^ol}# zhivKxy)Mnz`EiS}V=~a##apt`XK;SS>+n`Wx@mfDkQHh!;xpx?D`pe?7G4<`a5X)2gUry3e-2*uY|6_# zx+`9TT-z~18ue7$GaTAuFXc@x5liIh=l3X4mOuI8!kACxnyDBe zTylOltLSn&=6Y%5;0I1pih1tMw&bJWlX%35haB!3A$n4fG+FBL41CNER1C$Zh%e}dF%a3Z34C@^Ltq^VCva^C=YxBkN_sLd!{Dsql=0EXBmQst($WoIP;w)@KgL8l1 zaPNBe^+vRrjD|T*k0RH$d9^s;>odv(08;*(#X#Mqf2Pc3jxFWgE>u<6h_zQOp&7(s zZ(5FKVcH-@MqHEhx)kxOm0Lx~d??UR0S@Kr;8x*f2N6T1p{x1jP zF3tu2T><|aB>?`NQhCFg7`kM@wbbBXT0Ng7eKFCp)^jK*d91cxyWCy2Um#;E z>F@Ogb>>cT%?E1se^mo^{1^f?>aY$L=t+m6k@6^T9A~gnV{i`^fl%*_`vjCz5Xeei z6hRdjlG!KGlmMx$3{SN&J2dSv3(lwh&)afyS=)aYSqo4mT;phv4`eX2PBh@~t8=3; zP(KM`L=1>93KpRsc~tKELV2}Qx&?azE#gw?a%va5@UQyI0V`f4HOoNN@)xe_ptN?m zP>;J>`|ywc%_saR@WuT=z2cv_OUUIP?U4WHe?Rmu0YrNL3bE!1`Qv^45e&b<2lC_4 zp9z(;=z|Dit(NC?TAu$YdHzBcb^kwesAu}QzxG)eGY?AE^`h%6Ni8RCzl&yeIr?_sG%m6{x?2`XNy$6_U z9r~9EWBin;2x+xKLT#BsO~P9k=m^yeg#*#q;0Uab_;Rf*{T-=D84ov!K`^nu;U(Tc zRbHlxztRl0A>K40%^L-{9Fnirb?!2@ozl5#z3c^0PKjqERArQhjIbB-MxkkDx>{-# zw6U3UA3r=&{3i}n7=#wIfOU%f-m=%TXU~|GQBzA#HBRR(M`5}CxUn2d4TxxX@&a9G z1}imDq{dC|y}*4!&7wCqoctqzkw<6&SEW9=wdQqnkN0HqKUrSyA+I9i)`zRq{yr1A zAF*ek*I&vU!P;jg-Y0xZkeKz65=L$>`}it{ooud1=C1$o1q-sM(uCS4-uzhcV^C|v z#Ac{?*IJ*EXIeUj(FZWv^5yYP;>N>`;ZjE4DaI#FAX>qi`cwmW`Uu@;^a;0sL2!$F zad%ynyA%}{IhI$%xyvXu?ec#UhGjQOh`)v+&Ff3#1W>g=H!dLKQ#f6u+%wf@LgP=h zJfJa`T;(anuT0A9DEUgd|B{h3adN52tW3X>uOBF5TTP0M^x}w7n)PKy9_BO_2Man3 zejQr)z_A_4w&M1#sy0l}BAvuG-6bpyP166{xaYqq2pe(M9N$mUIwMWDsD@J%VwIwL zxld1#{SwX%m*7E zD}ebILdkkp&4dy_owNnc^ENKRNdBU3D{Q8UAU&{A4+PQi+&rNpXeOt3(5xS=>P^Fj zAKqub(MO?K;Oxw~lccDZDrLKtF~~~|DwTYdfOzo>j1WlEKok~8jupH}aD;sHMs{o< zYT=|b?1=?#Zi-Ea&nG^A5n^<~P%1@%BP(wNHwOEKH^?DTFZV2&A_3nAptYl?ABEur zCQnSj9)urFGM#-)+H>?{VY(lwg_@D0gr4vgl2ng8=GmQJJwSGq0+a(|yMg-#dZ>(% z(3u;w)msS{jk;tENcn@6=yR#=wqBMSvfRhO!%{OmVVEpjU!KuiSkyqH>LAkvE)1e4 zPd3@9oWw?vb~5*8R{2#x>S#_)MzFHfrK>im(Y?aj6GdFlC$w@KNhc) zu|H9svdtskl_(RVg7hArGN~p1zQ5qG^??b@%HI`jwAEW;=JPz0zPP%==|a(4u{&E= zJ?i;=_V1#^?$eU)Jg|c{znRq>V+6jUT1wtN< zKM<=`{x1Nrzvsb6;VJ>}?g?lWV_>q*3^AOK{`f>(>D{}EqUa`s#tfB zJ_yL^j}}z-)Wc!g`vK_sGjk|h!1&@I&gpeU&uh9s&ETI zU6phAq>9rW<#8b;7&GevdQtvE^-?iF&Hs8yYbGKnQ(* z)-RN}1tKzxuk@CN4v@myro0bU`%v6mA=K5X8%;yt@VGz;EKqJ`&{;bTCwKRaeWt_) zORwyHsT=($k>%Fv)VhS+{_Aia<6w@Z9oS2)6KmD#GHP{2f*BP^R34R5VZhI2l{$OObL@C?wA1C^C4mf3AZN+Pb5Ibw>wBZ5On6OhGW( zvQF+2bQv%Sn@^lwe;IP+&JhK06P6Akc)*!LjRs-XL@kpq1X-aGg!U`mp;-WF zGsa);St2LI^Lvlp&zN$YEEJDuH%t!0&`IC))}9#Zf{N~@WV&c{7Sg|aR+SrTuN;vjK5 zBsR#eu~y-;SU)evI~Lb)NR5&%S-!@k)bnT`QwDCSgn&ftw7JW^dF^j^ER0_%O3~|! zq_}z0dTYcsO+*>K#7ut$A~=6=_KPic(X8b`P(Kf z{;ox``YFR>O;dE*G#7H~ypwze*IU{IFlFUSldL2%vsxRrIB{v4Hx!mcyEZg*QN)=P z>(QX6WS^$(5U?)Y z5f|s2^gq=P`or(zo|KdSoH9xJ#Up7 z^+SU#Z6!*JTUrWvLJ+((mxJvfs9|U58d$b!&Mjn!1U+GN0b>e^1eH6qEdF3!*S@bk zYmCR_SbjV{m#H%32V;59*h=E@HF0y2PddC}tbzYYo?5Lnvo^O;(^lDANJ5!1)8LIj zPTy(MOKmtB3zTmLcGBU^4mcaZkE8Mu3r0k6{sNEv++aVBVVZiv24qA$0ZkEYU* z_$mszD5%T5>DGt+qSMa{yI&bEGN8{Z_-E0i7^ zW5gNS?z}KlfWNP7zqTX`I3ENR`b=&KJ&E+#AJ5f+ID%uT8s=ennJdAr0NSU^+javf=O>ytU-#8S^rrWAQboA;)3kwEb+@<(X zkld1-jqa~eT;>kFe*Np1h@9c#v3_F~lj-;*0Pv1j^n7U=YX#y5Ou^AbSmrCs=CbY! zON2KhNn|UOiuG7xHVb002w;7dDJf|)|5}g*b(Wo8qTa5{I(ODVIczqgi^0L9U@)7! z_?9gM2iwHGL|(ecw}3- zUX$k#AwHr8&x9us4im*RX_QK*9u6u4nYmDE$Z0+q}-yx+^FQB{x}O#$ICcmzjxDEUo(@_yUiKH?4k_ zCXYJ4-0790K;cWyk21HEe=W54nqFgaQOX@3aGfLw_kn?w$YV1VzCeqpSq<(OZL-Vf zT*pqchDlPErP>SJCpL`=?FODuh2qKxZ5dXNGNT}d$1_HR9`i7wbes@#Ab~rkQ2ztg&k?PfX87Pg9JMqbmK9;u;r@y-_(ZTu~SR`GP9No#M4aM4ys z-DdJF0PHm%^S+{}C{BZsh!nQRWZiK$l5wEwgOkS=W{KIvqci1P1W~s*bm{B6{JFT7 zMxfk_JQp2au?H7O9Ks^R8I}0jbm9@V$ezUn}hr zP$fl_Fc(6+4W-lSKsg5&?kio=^xRG*kJzY!aQ#ldCPO>?H;h{K#5Ik2+8`u2c%0Xy ztJz+d&K&u{Iwi#!d$Z}om12DxdorVJyHXH?sI9T-{<37U<;2hxt~?uam(aB7fzmd8 zF?+oU2*3S=WY>AKrHCsvs(ne&So$@w4)>;ZY(sL)M@D1cUDJ}%) z`f-&rZ(`_Lj840o_&9E5_rMLpR}QI(D8P2IE_H-mwG#2`1ApCkl3Y?rL_*4O9$l+V z2%S=3dgXRe^(7!^yNBIs-I!#;+t?8>dq`|)ha{ z5US{WeK0T0<`(0wv+QTYpxhF~gAE%-9WiF$txiW~)Fhg(WWTWlO6f-f%q#>s$|A$b zX-F&P&&3gFb_#ojJ++h;>p%wX>F(+k$2thX>VLa*6@z+hA0=%-(ArT=!GWEhbx!Dt zpNYm;4-0*Wpr$ZR9%@p5R&tlA}>kA z6%JItKXkI6ButW)+(HOTv@(zqZ@y$^Oo`w2P}m2gUOjXNZe&olPhq91^=CFPDWIX+ zA&jGZ{>*kMauLGp4N9up=LC;biP$EbS#LKE!N3Uj zaEGGx=t#2$LF*sIr1bo@b!B{z?8g*Wo{jAacPjzch)1?Mguvb6qIT~sGBdI}*bDxj zQ1Ya0s?C?ujaAS3_r|C|=ri#7itQVzyRzvOuC>+FRZo@s-}A0@d6#bFNTtMUl$tET zOQKYG<>h?Ly_`Eku^^+CLoMw`{7?M)e2Lm>My`2wm8GtG#c9EI(ep0*?wb9KNP{7( zdXH+@9a{X=2y*Tg<_SuRm7aAy$W$Kx8>c{GeKVn4=bMKu?n=PimG|ZNI`aH;&y@Rl zuIL|Ip2nBD3-`?{Hy)euHaxpX4`yRCBs+Sz>;#BAW%69z{&hhO5Ht(n55O_;Cf4%_ zwoHvI&Z97{MJAMMRtea{tv;{CcjI_l$pVIOE7NvH+iZbA1)Ok)%w7F(eo#T7uGyEs z%wvh_in0d4%-v`K3Gka7U13eV1?JFK(XBhlW?!`);G1n_OX&3X3pFcdeZ6-+%?d^+ zl~Jf?1iMcz9=Il)#AY>BgQG*tA86+?sdN8q{Aw#MO}k`k$JlZ*lk-YYwlyi0$e4(ap7vj$o9fAXRu_D+WU79*O@YQ~w*jkBTGv6lY*veW=_<0a!YC z>NjXuRa#$&Ck_^J?-jV7O%W;!x6XEI(p2gcRz~-pQE?vKrLL!*Tj?UBEB3dtZ<m>;pTV`>=ZMEj=mp2mu&RFcmOgGI9i0 zO!-LC$g9`bTEfHB!#b44h#{}FSgM65)Nhf%D!osoz=vukRl-$$`YWrMaIJ*zd&bnz z@c5-EfuQ>Cjf`E$sJ;p4RmVg9OqU1Gw1EyA>8X}6fF14A!jIp1ZFBALFGHWwa&*c3>Bmmg}-VG(`Lx9gzRIA4@J*&+i< z`&7e}Ha+gwy64ZGFWK^a@aDI4c8xL{EFl0hm*6%iwP28I7QQ{8q|x64Q6Lni+3$k5 zlx|q|giOiGp!SE5T$vk@{}{!@C!oRP=j%bJa0?go$!~+IiEu(yt7w$lgGfX(Eh@WM z&*J%msOP*X;knBtx?YUU9j2uG@@W28u&In=Guf9+m@_H8u?l#HxH+O(UNwreNrZkh zTcTVzAkep9oj(&n278OFH4WzGZzG%2qU0=v=SrfaIqHGeS}|gP`L}k38PlXhm0u?! z@SA>Rg*5aa%thrC2R>hSLDJWCQ)Wz<{qY7h3(Eqk4>{GZQL`QrK72q3=9E;k0y?yJ zQ{_c#Oo}#MZ5Wr!l$RL2`6t){?B?dk%trs*)z^ERoqrA;e#RYBJ)DP})@ z34T$ceflBF?hTTHpLH)7j`BaAeUVCrEEfK{`)iQu|PV0FNVSRL=Y|T)$M4~ zRf9$8dm6qLdW|ZMCP9z7>z4?)lV$H_BpH?aK!4#XyWV)=4|;4$${)^eBpO4b=QjND z3%|QEdyDhl;KpF&4+IlX&xeA7#kkRPTNxq*R;M#%UKoAy&8fH7gI9su!C#DxWoLYP z3FGzSw!L|I7rY&&V6o~TxZ8M?$DNT0Y&e^TrC!1EVFxf4?YT=--}e^CN1*;(QowDa zRu2(~<@DH3@(6fw6WM_-fF3Bdqv+x8=5R2AE*zQei)=1>PGK=Lv0ps;@L zR*4|S5jPnS9)2|~70(mbjP*wem~rE2>q(+kg*q5{YboeSlW3kQVb-76RL@!^w-se= zdBG*k9jR_Wcs|^mX}GS~E=mv|t@lq&nvoEut?q9?jLD6GgzQl&_4f5~v22kdhk-sH zxN*#QI^Efab+3R9?Mly%Q5wiy9!lYP_iTEwV-)Ps<-$VyDeYfkIg-aTOX^V7FP(!A zt?}lqJLK@L0Y_F`kIuXG@#L;)#7>3W77!=Tzr)-L{adm)2rtzbqB7+Rg~ypfr{AOPP049Y1w(#*ER$293f6s1k{Ck`!_g7kPfDZiH44^s;E&58`}c# zVuQ(XARH~>=TM!1$+v&SVzR#O_;GZNiOG!|v zf7OX1XQUYr3Gfk^yVSrXbNV_ukzox`?V$2R4OM01oL^)|k_k$1Cti&$BN?nXK0HbV z&=lHyP^BZE3zUvdGFipmgLT$(eA(}mpH$1x>WXL49ljJC0V#z257DBF zKh`>osJa2sKq6>YEI*aYCLRzrg54=FA|2d3RsptN57T_uv9nz>|J>X3TYl5twMgwD5OLv3 zq>Y;=rKFq)*taM?zc|g;+J&gNX*q6vUYe*x+bNn!ITk|J$QK z35+P+iH`4Ktv|TS>PH+gn)VoV_#bCIM~pIBRgiTq;mGrU_NuiHY1<+_uCBrNT@5tiMy8j=0_@+{Q~RI6_HHDm26 z>8a<~opBI^2r+Cy87SX9%2%vo(Y@<6<(exl*<`J3t`Aa?!9kccY+IBOddSkgkboFA zQEAo2^<5BH`|qO$iRPm(CZQ*iBmIBl)Z8SH|smVg&!>++GLzgyvHuSW0p^*a4? z+1{)b*YAe~yiJ9e=EUOU-=)L>` zuwebJMh@GXs|Newz4|fSp1;GO z!C9~T)-=liEY*Hk7CFh3HZO`(?3LTMe{Y^@rNwyj-V%G(SSwD(9r3;zmh8A(eSc&< z;LMyBg@7dFJcV*V)D-&_>8kxa(M)H-FGJ%L_(f2M{d|B851sp( zdkkI-4fNDMF4b*@r5;CpMqFVOi<}K5#%5zg5(}ss%B6p~7sapmGla8B!PnJ%fE{87 zB%iRXbts#H`dOl8#yNl;FXqD?rxuGo%OUq z4TH&BNMFVx;&#m$UAoay-Bj(fvxS-q>x{frQz3{(g@v=XJ_BBzVsT9BcyA*lG-)kshy)w|lPaWmqS=_AM_USIQF(BOLSr7MIVe8770yfpl= zoc`B=C4=eSfSS zU`jYwL)9MKr2*Bba5aCj$bZQlODE>N_oIP;VoAaN8Zd?5y^!FshaSdp$2ygM{FEQ_ ztF1zG96f_R^&s}8piZD*nb$tHfjs*QMSXR&6BW{@Z{aZj>T6R- zQFP2W?M7oHw5@~)S|(kS8G|LpvfQ$4jbv)M5??!B90vk{<807VyTmz^odc8~aq+0h zQ&N`$MvfE@Lee2&K_c?Kvf6s?($||Gk$oa2h4>>fJLcZ0RVP~ak~lJHCDKt?S3k)M z^0NvLm+XN_Jqz(vPDJNyMi-GtPg|NSn?3)-2G^+?tf@A7#VyZuIYp`2)WoHa0VfDy zr=uv)Fazg!pl9Lv8dOw+eu7@sT|w4vhRBx?FGOyYl;(>9wxJ9Kyy41%W{}&r0UaC% z^^&S7YC_yc^|3hPc9Cfy$fg_)*N-@fOtSy;oWvWc`pIUuYD*s{HT+0cGz)_Zl2aHH z^$bT;+MP{IxqN&~TJoCeh~R5Zd|$dzi~!Js$7?9E54)Q47;qcdYj@BeW_S(Zus z00XgCx+*)u$w?>MHG}nPS`lV@#X&L|2(59xk~cQ8r%kK=0R~yg%^-V)K$+LJYoQmb zx?bB>ZWUcQMg)20{O|z11TN<2^INVRq3UMDZyni3 zXeuh<#nErwuLtE}c2OOhZ{r@1%@274#?PNt3P^g%Gk+eB#l+3k_-Ar9k|0HbRJFo& z+mL@CBW1jM_;?knUuDuhhxnp`>PKY5$wCAdhI1^!G6T+H{3|zJkTqJ5m3_L z##t*to$sYO|8c3MTQ0ri>R$PE-0T`X&{7C~^u`~=@B8@oqV)ZUS6b~Z%kb{HC!~rc z&-2D&nXzI+)a=k~7b~69H#>od)!CMk>cZWN5Z8>l@vm2;MU(MYwdhj6`tO6z-a5CI zxgpwCWtq`pR$1;A0gX?UBfN)7!#CHW44_Q&13+HTR6-ow3r6Z{;smyy4BogsvrtVp z#lKaD@|_8=#K5&s$bk=GB){&G%#&S*heE^Cjd2tBiMuEe2Yj|$gEyIf*RgN>sj|C0 z&mzsB0# zu_hWLaPg=+lJ-+0%}Mj5H5U}zE?h7_Yapbm-XY}4LkJyGIiW0#QB@eILLC)d;{)1d z0hrZ}HB%Uh;4ZBbxoIr9a1!~C4z-6+9ie1eR}lC-gvFK6&+|D1U}z@WHfc4m!vvVA zYHLyf+l9$kL4+diIdkFY7Zn*6gizhtvI7>yfQta!Fm?{~uq>~c)TiaUGq$chvsCoc z7?Z11j*rwx1MT{ki9oah9E&;E)UA#_flq7Mx15zje{o5Y1~Dv%v{CnbK_?_r{KPm} zem(ot?sNioisfRq{TWNhZkttE>2{w^2d` zr){3($U5j>M&W9NccZus7BMo;w2g~i-7#UW)wYdM)p59lWiaskIGkpNe;uc2gH*Y|3py$(@t>$m%d5=*MqKjnQx%KL3& z!b4$lHKbcd3KP8dkRNP}?q5;>j#&85-=U7HIk%bVK*aSbJDyu0-T>&G-H6$0A8dw&Gq3{9yXpdR2NgdRqE#O8X3e5t`$0 z)%vwK(4K0W`64xNWvR7Moxlx@@L;rEo-@`*e zQ0V~_D3*dx3pJvu$w~+mQr3Td&@yvlk|Q*4&lo(3*O?J_1u(E5pIQmnaP3kpt;r4@ znp6T_FfP|QCi+b62dj~VM~@c5Oq#$bve2aS3|2p=-4|0v2PS|3UqZdFtgpA)C~!c- zU=B01VI@uUuY`U9zHCeq05f@TqAu`{U)BLT#Ef^Bt@U5q6g5fL&yry<@@xiuGU~CZ zx<8>}QmKKcDiswA&Ya3K1oK|oRb9y8t|VwK%C$p?RbEcmFb8Uh4ltkV!~BX+Bz zh4aoIJbd=7Fcz2))zq0ho%9zi3?+md6s&&Zp+sWtfZ}Ex{Uu*FN=d5v7O;Mn=fw-n zuy7rKMGSW2ZT7yr%wWQ{ZosDM*Q(AMmFZFFAm5U6m4m^mskUl!XCz#OcgrBRFsq!^ zzEpimp{~eEEZAhVxnTxrZ1ZgNl)sIcViG-1c}_h z22;(ei$GT6-J;uXbu;`LAj zP77D9tB$&R#jx6K;DT>5`wotXrV38w`2PC~n=_osF~3utBfQ+&dQ|qHp>1TBb2`oM zJZ)hPoAc}6T+DD+fkR~DsFB8`PAb#-!YOJj0gDaF66k|^gj9ZV1uThQ^a;2gl@!&v zf;!jN=ge}!3-q_WQ-(l4CE2%zrTJz7n$2FhGH-3SI(1wR_4IO#YIPCUi zO@sWgzy8`4>GQQ#iaaz8l5)$aAg%$IE&Wn=;>TV^}W!VXAQJ6Zwn4Ht*XEn zvBnWo9}XJU00e>siB91TX)vy-C?8L%CaF&r5D;Qv&I%c%wqKGn?`(t0EMKKwv z>X??xTO=108C;!xw>%4VN`-iv{`4Ey*^dC?;H(8kG{dd}cGbgX9fpAU+zl4?2=eAs zT}NOl_CsYnKXIb!K3H|+o~tpx;{N(_=~OEwG;r@gKLaG5Za8A0;n{iZyix#e2Ldf9 z5j#&~v05+b=-79}jc|mDe-9i1S_hah&+LX+P*+5=Ae+lDjMw$+R~K*KQc#x?^}#C& z#odh!tw17xQ5p?15Tf~*!x%pLjE~f3qQ9b<-_8cwtzn30k|r<%k01^aqqYlld4&;7 zF7*tK^x9!(Fa*pN%wcB|lthw=rNPeYfe;)KNUwQG=1=WmW)(6ksza zq+v@g*DlnP-g_jh`C%Q5#OzN8Fyzk=$=MQq^TTOu31$uRS~LS`4m@E*GvvUp*pGcW z-dPNYA|VE4V12~V0l4tZK|e8tuL$@bpUqX~Kf|6dg~JzjM~)V?2?koT($;#{+S=1{ zA?Ns3Uq9MMXKH_(9iXoH2|M1>+N@JuFz7tFbKM0(O}Jc4c3ls#Ay410x~ftDb;&vk zCe-f_3EYma&okInY#iN820w8DvZck3a@JqB`Q-}VCWmEJMd%ua4eKG9k#2kZ$X;)V z(T4N~LxQ%G97mM80=AU%-6{Ek<^;fd8g*ZzHf?IBNO>8GR%K)49_b)MqfOOh4N&Ku ziO!OTb7EcTY!K=xZS7(dPN`W^7X+g~z_-s7?LL1Cz;lDn&OZoLfYv|swq3W%hP->M z%biB8Ici*&4xSOs_?-13blscE>HLfCy&htI?sCftC$Xh3BN~|CZCgBdI9ylPEt842n(6 zO8++fj(bhQ2##-HT>dkdla)vWKO2EfY43+9H&oSbE*h0m&etdfLx3|dQQ{~U4vYf; z56D7*QVCtYDG>lQN?e~Snd0G0&wny}@_gL&5Q#TLAVZiX1PFM8rLMHMWGwPq0spx8^MU_f3XiI$pdKC9pX=qH}L%4riM{dhvoES*{Xmz$M;q#$t0) zXPn=~3(-m(eu2(yvw8`#gTf+U+w7ZTD6^sCc~Qj%)I?Y^M!N>Z*dL@Yq?^mrSO%!Q z<}}MjM~}q<5?^3xx5U}Klooa~KDHaC=DML22jFp-UqOP#5Dp=s&8*Fjt};ZO+%sgr zsG2oaR|np_pGj1U(6L_ounJ6_mp}|<6sn|wfHNusHaeRPP`d1Fv<2P4erl`3^wiJ? z7=W82bn^Cvc52qWD@0wP1H;BFj2x+)V*zm-3Ab1T5TZ-m{;A6~*(T@KLuCTuA|QW)LDG)#)j*-arXL{Tk@q?&XnrJ;69c%=t+7m;Qt7 zJ7@Yb82gtP_DdHGD{M}oZ1TD&U^%{2zMGq~4=vKFcB;{X)0bWhMY4%muw6P!ksb~i z$PS&oeh=@i;*^wLm5mrh_Eg2fBWWS21Q8|*3qx#Wq@UH_sBc_Gif)BToz4@$VqiB7 zc3(E?UI5P(Y$^jn^k-=0S53m?Ih#EQ8_p__Xs&gAMEXHZC(;24D_W3+)Zc73lJNXP z(NZ9rV(Zj!LK?t?BEIOzv=$+PNAa*iq<`m<1uL?@9@Y*Y3^OE&_-_)N*yW`^K5@)i zdatE4)3qnF)mhKL(8+8^ziGQcp^b3`tGa7&Rta1wN_XF1KZTP9R3Jc6uU!bn7q$*1 z@{U~wljXbg_C9o=Uyuho0}ccX_f+Ij2H)Kb77^MZI@%x*uz=7Px7cs_3*)!7_g%(+ z+~l9Z&*y!MV;Rq9u~MjBO{B>EI3OyZ{Bg6 zHzlt(75(pPKY&IgNyRjaSq$n;t&h(Go-a^uYL%+RPpqxSVFj8LXlIzbJ9p}*-e@+I z95lEnJD5dA3bPK%-U4V&L@{?`l7fV}E?Iw^=O2@uP=AgYHCu1fdxJ!Kx#B>K{UfY z%4JCV>q9*T;O$(-o@D@(nz5FB`%H`bk;{Vtpj7h39q||j^#mvTHA3#pnI7|+jT0O8 zsR~@l7O+kG3#tTVb*U2PCk2R4EuuhK#Q_Qw?c2CY!L0y``;j#&hJZ9G|bno$7&V>+qQcOL#k{SuDgF>!?OxXqh|{hmK3 z7At`-e@8DMo1_$kz#&&PfNO#jPKY{M71k77Q*i89vl|%5$B)T#vVvXP=iUJITXFSzX6?vGe%vA?NV}P}Cfd?;xYh*6@$bJQoC#feLZI%? z8EKM<0HAkW=;|6|%(RTqthq`g?$9z>^c?=y5u`XagwG8t!2 z);(CE6k!8s)8Q1;G1E`@#Zvd)?skTgG58Z(?;8RLSbq z!Mxw@VoI8FtbwZ5GlV?`8$zRYf9`g+6vz>*c%?FV*|?;@@#J?7Dn?)2Wn`@v*00Zs ze6Bm-v_WWW(cR5rXzszNrU$+GIA;aOZ>qzGlm)F53CFQSj2h#FInJj{jUmD^33cec ze(VEme;*oOpyz{~#@Yc7FzNP04XNkc=pIIDqlT}~yt!;-gLP`9to^BLYnYn8VX5OJ zZ_jYbwPqyKE6edyHI+P2cNjLwwIsgski*pEtM0HDumm7Oa0Stf<7Sml#;Z4T!Wq$w zaPih;6=qAVTlPUl5-NqHvwcbSzE|*1{z7l7-KSlFVek)D!Slu@eeOP_W#$>$X5Jxz z_~#^~p@cr*Y>j!iX2Y?Hx&+;R>^}HjonEefFbf@;Lrd{VWDerWfE+lWsIgN1#K9v; zVGe^~6&kUIRl-6mowQ;b8pQL)BDa(&>@JIGCNHQK^|Sf~COFjp=GhW2WA(+DK095V zP~lkBaJlpI9E5@hsYl4Y`}QphUX>CmtL`id&OKo#<&QnTL&n~rv_Ip2($9nhg8 z7m-iybyEWf95{{*9c!>+d{{lvOXL}-~@CfC1nd1{!;WD6xv&4k0WDmu zx^P;wXn6|2>S`i*7W}Q{|MQe zv36__PSeX0%<(}9-Q97_B}_%^n{s3 zG+>RNVl?+8pDe!V*IuFD>u@wG(BrKoOdTt)1SKeyYT}n8UpIdFyw~juX*Ib2s;p(> zaQBY$ug*u3O&vi2e4kMO_88;*2vRS+N}k^*?YOkP%b1TA02Ln<0ArTt&^dmEr^_>B zJ;#bRFS4>BXARB3IVcFPCT8A98NeYXG6!Bph)S)q5@r?1;Y@j903kIsz_W;Of~`q; z|NapkDl`<8dSt_fJ$1*%E?*uSIp&yiY($QEtZq+QrAC8%kMLcW{I2;9Mho~7kz7Hb z07Blh!95ieiOXZ}t?|g$xUKP`-VN1|!NGvIJaMiUI%{!TTafpfQU$f!EB|^1>_>@$=2m>kSCy$Vf0oOnueJOyTmRZ=W zuUOXK3y#ndP{gN{l{)MePnL zqSO+yupMK%7(t3HH2~EuKYIAEG@E9(dPKRvJa&o$N}3G;Y$-4%GVm=1xX5tzy>=4 zB26ve-U6DksvRrkZz(^I%_~dH~nRvp#Jc&Od%tYjT+l(Bl zTD{mjrsptutf@R=Q&SkTWhXbWyLT#PrY%D{-B#T~{0ve4^y`d19)@{q*iHY#_46mM z^u245f^|GBwwLfjs@G6LnARBzOC5;rEGbP?+E}J?Q;e|{5wGDJ%-`Wn8E;q@bChAF zozm2Pp+JFG8Vr?rhy(u;LnxE|f)j@FGx5Y_=XjAuxS85imERQw9Vhtgis$2p9BQp-vF>t0NmTs7gy@Sytm+XLeB2L zQf07MeX@n06)%K(Hr|Wq4!KhB?%V@O@s%#)t6VCHw-eLcF)fHToL--2qWRMGBSky( z9en2`-R^Knz#FN|5YI6;!kDM%6Sbp30C(?}6qmwX+)w$RPX?)ps#DW_jp~A(hu-~j z(6(+TZlTjG{qdgG9H-4oW3@;l>!G61?GxoNiFq+xWL>;6Ql8GO+L>_XjBYt+^UzDD=LUGBO5o<(KO04sq|CI3Ix5`m;xeE!)UXn z;-)6cW;35r29{*BnnBgkzqPl{D7tR%EwqXgvDzqyz(AnTkN%lHe0chwM}PuL6@NdD z*kwtpZTL{CXL`uvck9+Y_A18qvx>cV#DNQ9BPimh)5*w0QJ$Y`#9^nCKWz)H3az2^ zluw2uVU)F9q;koNLAydkuUE+zHaRXbo@d$Ets~3fk-EjG8cK=v{g;*GJM=(2INWO6 z%JZwT1nyvh1^0}KBEq?&z^rP{h`k5`p4Mb1`}}y_w9h37B4pYrI0R;6EwHxv;lkDt z@SP<||uM1t4lz1eUzYx;9v z_4WYgX*?>O_aH`)t^=W$Qwl9UswF~!$+s-z#y>paF5B2xLoaXZ>Se%Ad(R1w!RhKX zBHNe1lG)x_2Iu0V{XG2RNHpu12*EQl6#YS&VHLa()P7f1wBm%)+rnc)<2hYcdbTUi zF^?-!+xVU#FoyIB&I(P`@!l3h7=hYDTRFY!VB@mnk3Se&$WL>jz`*WDJD_Hh7wcmT z2!YZW-7DQ|RbThX-vA`{6Zv^Jv2h$WBy=0?-zE{q^m@rHqoVU6f5^J#Ha9vTLh#ti z=ppH4kNNfAw8;W?_}w8>4phk(r9AxKuJtx<>{{tGyJpXt+*fa^#G!@|;wW(J0CG4K zMP4f!uvzwE02%H=- zS`UQx^)CO&s-ZpY0175un-a;8+cuZbHux$jw{!Ex-+k8qvvLc58V8C$|L!o-qDe2n zQ$0P#q*s72FU0u$=+PVrJs}{MLo*??ni>GWJ9zZycSf`(kL2!z5eB@)81zo-^VjN~ z6j!@e?7-=L|ATeu-4v;w&i8*fe@5%iRRP5lz954K27|I6|3n)&6Ea!xOE@7Dd(iM` z?G-oi-2<`Co6~9OdflRVVufG) z*;i#f!0k^B*aCShx46=2eKP$(6w_l%&nf)fNc^oHm|3KR-jQJX+=(oM`MDAiru+w{ zkABHSlt1yt71Eb+>6Q49d?P9#JD_p)U3qr@4_cbSgMOKj2S=e7VCr{xXZsCHr zMxQ*X9gB}=OgZEBm50>oz)WG>mFCXIu5!}MD-uUaaxSfp1j)Vg&V=aSI=YeZEJ;Y{ z43M*&cyJ6J zZexI0ofLIsf>jCkiH)cXs5)nf*Moq@^eP_?IbadMlnqN8kN&y<29dcX$U$*@n`x!= z75YM1WfSny($>}0ev;Zf0G?<&iBsI&VCCsf4S7@nWo$ZI#{Aqo)c|fLh{b!EAqba; zewrU#!2*QW(MbK9%dePq4zQ7?RGC(O<1bS}KmV}Yoy8JI1On(8G}SN~y^258j61&O zA2;4}JWn)BAqH^}bVr*))=?Au7wzBLT0nULO1%1X+qS$8HMh1PL?0jLKCtd0_uDN( z#dbsgZdsY7+}@*)b>%nvH)ni7ohROr(8bL4&;WEz9aY+ZovBe~-NJ*Wd{HDX$BX4j zKsI?-=WUl?Fk65WC57=~v4M`3l?(tYz(dJ-Re+5E3*}&A>mwtfh9(Y$9oQkK1ywN) z)OO|tfW;ILI(?EhI$>hsFYmgsuif-Kvuh!RmK-FPg(`E!jSkDf&!7_!>ZI1}WyUTYv%e&)>@=hVkpO@BLl zVrp2UP`o*->i|-=WXzZ@3Z;3rTX8MjmMUw=I{@V{h_`y}+7TXVp8fw0OA~Gb?9RWb z`|t-g){1xJ%GK?bsngwEM~=T-xa9~h>8yN>lT zOu2_Xs0xl`-jeYjNA9Kv=^rI1_G{92I3?ekgSZ`LH^Y7@Az;9*S1HVwLZxtHcgbAJ zFoEXu(rM7e2~v{X`zKn7^T3Q$<-w^DWkB~zN#Rmb=EChfwj_n5oU^jBR&Ez+P9=I0 zM_5WZ0EjBQ2X$2FJdmmT%U@YvKAc{K-l0=mx^MXY!{H63mI~Dj8h;s&8BA7}@T<*J zeR(xJ9(qvseFP+tK;rME(mm{$Xk$d%;NTbk5RVq)yp4-!Y7)!uNu^afU>_F}V5nHcffbvMtL+ZA`}Fsi&+?2gea5l;-U0Xj|yq) zu>@>jKENu{1y!|aV3g+rFYfi@4KFwETy(u2$9JF%g>Y56h@k)gIn^hH`wFtPi7SoD zP0L~YB}9sTq1i6Ia7>L?V9>ru*ICD2f0?qYnN~n`mj_a){)fmDZz;)WJL~_AW^ER} zk*Cl4QOwE|*s}=&a(AgPbj)JnO(hmn!1P6tZ8BkxjRT+i^KOmJZ4QLEk$n2wZ>3Q} zb~HesOhqNmv1&svr+O`RjNG{laouee!_=LENU2vUFj`vR8O8urYg25s7Hg--DT`_v z`J(TtOAc5U?v{$}Mn!wT#GJs9bf+7z=%_oo!SG5nAsVCYdPx!B75$!}ZJ}R^sY0D3 z7hr?en?r&5TsJebj3MFt3V~O{K;- zny7W6vDW33ry{661-tNmveA&3dZAIk7Mv^fAh0$S*pF#Bd9no~gGcBM8hlF){3~pq z!6y_hNkolZtPi;;Cg68$D{wbsdmR+Yr_Jvy*GkB`-F zZ+VyR&58M-l+!|$GcnF0eo=IZlw(gjfM+1`t|a`e{VG+#I|t~d`c71JsBDGxNk3B_ z>A*AYlPKSPH61GfX4A4;Pl}=owMkrEG8+JHF*@j ze~s6@m5r+c;UrNQ5g#6ftQ8arqrLF5cw}Sl-B_V#bic5=K2~L~QHN45(``z2>&yAy zy2U!BbEHQ?WBB@9uPT!oFG@BgCq>pXv^3+(1IJ9*b|jlHV(W|wvQN%&1hQ!^qCb;f zJmmrEYztFni~T!8nui;nMYw5#St9vJVCH}v9`NgfB?r1m?Y*e(jbP0@4-q{Q z7H@2g9SkhuwI{IA%~B?#z`x5oIh?gOpt>Nw(WfU@1fhgn`@flXL0MMSUZOaxOL}gB znXYuoP4grpDUQVn+rCS zDurEL+S3vu*m(-hQfZ!dSWbj=_ZII~Af)%F-#c|3lyVMsETNZex%iWCO#mSh1jv~g zwm|5X0|=H-&tCC$7LbaBP=pl)$bC8IFE9xWEbBO2%y60iY zr1)MV=A=)3_0McUcrc>4qLE9DxxY1~jre7?I$&WirwQ9Mk8G=9eb{6r4cAQsVA_$1 z!rf5T@l$dGCzyf!)J`aCcLG`Z*5K~qZedA;v6#xNix#Os$j#OBLGz0oK|q$S)Hxzu z$Kh6MkECnaznHlN5^H2_W#m#R^@LMeAZ*n~94@dEE*$pDt2QC;xc21K%`&QU_kpz2 zd9q+I*Q2tfbpZD%m#u!BU0H8$)0Joa7?drok!t4^syuyQLr?v^dZ1wf;H7!BC9hO@ z@s25M*Jze4`;hmLAaVZDz1ZH1dyIWzdmn8Y!;1nX!1HZg5r6C+`#x9ivvvRLU<<026y&9+xc;ut_bQGXzn4q=ax(uPQb_p7pv6dd(94;u zOHzGFf^l!zU15pTQK4(cLmRW$5s+Zh@j&a~%HSV91g|Ur5OV5(ep)q`BSfx*{VKp?%^Y|6EY0q*ooBd{ zS{b5jqMf}g(3Fz<#?iCXgQw0ao=uk@>nuJ8T~#0?`X$KduPz3F4r1!5B)4F&rG${y z*3FM}&;XH(joVnG-Z+mfQ$VzgzEdRF;3Hu%_e?f1)FVlYp&4!+A{ z!mm(s0)N{IlOs_=_=t^wXvZR{sHh*8kJmT`8uH)ktpev#6* zdwi=3Sut?JLT38lC7)IG*-YrheIO?|nu>p|GQ4A`|Kf90olAe}bb8wXJpf^y21{vv z*$Mg0oLzd$$S!wU{Xk5HXx!+qu*ffUQ~R*iLMg5|+%QIZ|8^&cjApoXVfLG)_fL+0 z+?}`Drz2x|+aH@QrxNyKy0l0_p!3hMG14ZpiLnMhU6G&1K`K%O`~-~>xB`f+hd7Wb zkSvQjH1j4RPU(Ds`vvFZkp6F&5DwdJ7G#HnI%lZ3ULq6D5=&sZKD#N1U{^wI2iS%| zDoU-|*g^fWqapA5Di^kevjoTVn1&9tAX1dq^I^?uIC7)`L`F9$unr!fXaZs#?EG+e zd_C-pMs;t1a=y;@sv0y{=Fg^Ils?-($t#w`qZX^!zW~n{w9aCo6u_=~uvYtm6h=jyeL{bGzj%#-(42pe%uQ@%^}1-=fl&NtpQFLclm zj=-^l4mgA}5oU!wBZ#B%jg({K7}^mC0ga5z%qui%7E7fwV_?T*4;2fc)+jF6hzU~= zr5GFy^wMGy=H3l2MTl7IX0c&vwMwm=$z&YaU@8|dRn45yuz)NJ3G(Ye0Adk!EZr^M z<#4=7%tZ=7cFK?z*A&-ZqIoA{hA_jJnVl6lp~A+UY5-M0s=w9MT@Q#umc*etJ8Pkg z&O-s3!*?I3f2VZI;X?u%|AhN+4sDdtc}QU4^v)sFFVp7_6VM#%ees=g$~*>&;Vh`e zq+br}AW}$j5J^ngf0)996a4-#!?}nQlOFwwIZXk(UtW*tqNw*dD+aM^M3Jg;wbCpv zRWafU6nF%FgdYOR%qw@Td3bj^h%2Q_V&MLw;{TWa|3NKSv6T3?wouPbY|va>{hHy9;{2M(qT!i7^qLa zv?x-Td~7U13v6V|^62Ep(>Y7{>N?}n6>A|St_Jp;cS~xi1wU=FS3j-Jjvu?SkI045 zZov?+WedY4UbH9x6>^w?$YtzQZO6#ginJLrQ*Wmk`^o7Q6<;MM52SLZY=$rq;}HRi z)dd~WH?MuotJa*~RJ7f5joqh{6lQbXLLA`@d)K5RAn&g0@0vF-L~$(`L&1EQS+bpd zu(zIRlFx_M-rw0JvPfa`FwlZ^b;%e%sNkTT$}h@>3pPfm67UdDX|>H|os@t9mKl}wKLJm=XOnR$5aR?>QKAHJE%SY=Hn}zstY~;1Bk2Y z+td8AnkHyUJ1QW(RR6(T{_X0H^M+6Egv@-qef!%?Bxsw=Z;^1%g}-6%%*Reu%j5oV zxaN!I{^cFsJ{->LxKYf8-D{HZC&A8mK1tJrgQ-=wP9W@-Dcu=imRt03z3UNmm+}Mf zwOZJ>Q_TTekroaIitWRUEiCjbNN`;UjwdMtE(1=t2z;B34+q8JplHP(?ab7uasW^j zyQs=*$fm2ed*!KIZNLP3lQW($67fU2!-9)?*YoAEzZPG1)nd~)ro1Z$+&coXO=fB8 z&(ZKReO6nVwPQ4F3)9~8=VkqI4CIxMzA=r41zCEri}JrDwo5f{Uzk1R#8_?hnm6YZ zU-vF@5j%AqDJtLe;qg;|gVWTLxQiLnms9rbIkQ9iX8EyOg+5c~r~WPLwOM!OiED2g zaBuV-HaklV>wZManshe{Qk{=>I(F>TIu^{IQnv1=dn_5E?}OA1Ht%YBaf1x%?9Ha@ zdH`}-A{09tWF$tJhDGap73{x$>a3UCu8w}nl|XsMulSuf6B7C5JfmZ!@`S<~1sa?H%K}0{HlZ>xw!^g`iN>T7!HU zTy++2NPL$AGBlBqwj^$STJMmxd`h z@4P=Z<~=DmY}^#gWPZ6MX|t8hLhQ|8TyT;LvIz)-Kmzp6e~Pb))k5Js&P+bM1h|89 zIvULY20iX6k_gZBb9{)Eo1Es)&&vp$Nyc(i6{rtbTtcUQPrwtl%fYdH`j~`3!h4Q1 zTp*E}RJtBH_%xxbKfnNOwu86jI30}9c-rflO&ZNOEl9nC8G|43m3V$OJy|ZX$$3oT zrOeGP5_-UL{Es*(DKm0KcPR20J=-ctSSZ@bW5wSmqR)*jeKU0FoUVgx)Vn`hv>Qao zJ?o{nfm9)IBJ5nOgUn)EmW$4W-$H}8lNxnMYS>)BWwm*f9FFUVy$>Q~vt8gn%BIHyPN>vmU z+ZLK~M=Y_o?j_`u?+g(`H4VcRRRnZ$P=U;yXI0DkQbv1^H+P-`4;$D)0;nzqm2Rq} zR^@Xfxm*=ch1&ogQe!FpBfX$@HyB9t0Nhuf7SKg-&K#7>YXxa+_8Ss*QsL5+xPC1Z zb%fZ5H|pAXM+)-I*^&-6+ftA(7nQau#pyBO&@-y-eX&fl%b;Jm2K>TJ-LB22tu8@du1Zk!&G z&VZ(frLQesp(pK@_6;1`ymPpd8>vv+28 zo0xL!`s+5hic>UNOx?7#lV-RgwA5#@*@fF6lEPM2Xr{3 zQkPT|sRF+~ghot&GV#&0ftFgUsF%(8{eaQR_rL`O4sc-*AB{N-tAI@@2OaVG%9%Fl zC^3``-8KUJwMC=uIOw)DZ9(sPQlC^k+wBQV=k7#S~B?X&0#Z6K4Ch zChznsU}EMA`q?~j@*XA^1))_ zKV!ecyv?9F@sq z`nnTFg@LID_3q!-8${y=2{}ECiE|H zaGdbVl}wq&%g35Lk-49mFwJ=a>oxp=C%gg>(#vz?oUxj|^76j5S(dw??vs4;A8ikfE@xJQTEfU?oA3i8`NJaeVK z4jg}b^pG9q#z>(Muv?e(CO>a|$BzDfCxSvjcsTt4Alcx`RF9ltjw)Gha7Cj{^y=1* zxs+74JrxVzNo%X6r&uK*SU2*+C_O9 zR;O-;*UFYhYjN5UaVhDkxowZP+HD=NvP_~G<};2MZ8I9Bzj-K2VmCAT~x za$tk-nibW``dS$1%v169G{6=fk2w5vtgbO!KWD2EXi2gqK!=Zt56%cbH)VbI4Pp9X zM))47HJxtph^sK+Lhziu!FqWN%DG{_WD}BGL4PEvAHj3NbBPf+b)}=Utlk zp+d8el^A-kJs|_N!KUJrgToW2x{Z&q%g-qt8|U!tYi+|y0;9gy*rRXE8prKZl^Q=Hrkn(TM@Ept0Q`goR zFWZ}!%~%31Y~HW8$ae^;>*|84nV7t{fM{5}0gLEh}2i$eHXdNMy6k5pR&XZjGBK#`N=KimPL# zA=e0VD~k!#+rT~tYl>knFz99yeVd@ zl&4-;(k@iUOy36O7Ro!44bKCoC>d%lC>=Iht{E_QNf59eoUaIQzjGmhWNNR(;1=949N;w-!IbV8t7a zTB0%Z(Tu6a`U)c}as)rSE=(zFd^2{L+V)EtLBJOkVWl^?CCb`|ZqxGP*M>5zS$z}{ zLNoM7Hu>L>hUgE1&YK)8!Zdf|g?dc1B&6}sO#p%GwEd7f@xBfH7v@%NV)P&>uBUOH z?)M8{jdkUR!E_>YI=M7B64Ia7owfD*VOr;Kj?PAnK)~H;jt@_PAKDdD6aye6xRd;_ zzyIMsu}s!mucAW+k*i2^eqiokgpqiDBUPw#^KtQJiNgRvOH8NzpC4z!kY=z{&v@jM zX1a-_A=UbKK5%_UGMc4S05!f2NU*?9w~Qm;D#SkGmt|F-xyBa<$R2Np&#s{SS?O!G zA`f8>&YJjwCkr;mnf*TN+t>+ki(To6|6{H@_gSO^J%S089v`_4aYMBs;AM)VA;o~v zv0&y?mX}_7-W^gA+N;%fNe5(j;Mc?Rmk3W#F86vpNfao&NYY#trM zaMne8@B`617aw|sYhAdg1Q%E*s^W^M-1v zVPw>B^hAS*rXcZ0(?K9IrtljUJote&`c;Nbkvm<;Yk+Y=2-LMEWeh&O%L>sM71>Y6 zttc@z`AcFzz}kk^ti>ZvNQPYi`Fq&Qb_|V647Lt1zg^}X5?0a#;0U#Asq~xNQy>S$ z#Z4t4g=M$R$p)klZaAj>CG33wIg7z|IWn)Rn(U8*(eM)UB>8q$V#jywoBP5g?d3d{ScFB}N)1xvk}RbiJ%OZMldmSIbMy5q z#ryc0=Y~WMoK+A%?AShOhfdm=d^@mJ+l9aRZhU_{`ZWg^tv0#XH_<5~-89QL_H4G` zP#TS1xg35X{8pMT8y9Is<04Mp@QqI04( zB<)Sw{dW^SdTdtJI4%Q+3A7vGR2xe2m~IDrPsx|X44QaFc1pG!L1R#t!$iL%<`wg^ zPFFgOCN{=9nG+4~EdxoBnN!~n?Bf1FaqRwY1_nl`E4x=2{J>l1bs*!^CR3L!u<)$; z&JENbtd>U9$010oIxK#o0;`({*s=#A<^^I`zNP0W>{R^9l}q6lnF&s1^4fq^6Xehx z81fOHHASplI*zyx8@Qpo*BmAlO$>UV5k4irxGJvG4;=Y!kzm}XhUH^7VIf>VZWYu0 zA+64UY+ibOC1W7$CRn~nNbljivWz|$Ky`=(3Sq&}CKJ?|bC--aX&KO|TQlD)t z3?##r&Ntlmb8@#z*$|AUv|sPuY}8?V(zwIuuyK3$^=RMqwnA>TiUe=AY7bB+Vm@xE zwtEt^r&hrNG@|>wW4H6mMHlz^E4auwr}x_-KA-;2o0qrn1lnkkp-7g)*3T=1`{tb~ zNlpJIsLEN2Na$9UyC-N@_dl)nV6iV~v+aluTkd|M-%n(l4n8%yZ}`%G`=3eI^!L@+ z47Avq?Ig9oXLlN&g@5Wt5}E$Wr=>7&rqEvWxW4T175$+fIYmDb^+o9Z9pIm3hNM3j zT}9u7oDWJ5?`OYGuAwjL_*>pFUgq=OQrlHR7bi7l$d(xV1p}PnL)Ic&{1`BeW=ZfI zFLzOF{h)qsqO%yE8+*#vWL&=DjuX=jlS8DVq?H(IIPK(Z>f9OjtSQok=K7!ZmVi%2 za;HagSArvEUfRjlG5)mOmlhZUVRM_#HlVf?A)fkR8TI?=c4W>y2#tbPf{BYey zcT`zS&0eU|NeVXGM{?|4ebB#ZzWqs7&S0>EX}0^Nbz~Nivx4k7lFFZgR}L)j1)ZZ( z{!^-|mAd~dc%)|m1@L;b6_#ih1~LML+Y{MiKc#Y1GNnw4w~!??#SZksyOE!t6?YX) z>$v(sip=~R;3EUlEcJED7mR;;b1Lw^;{2A(ZtAk6Kp#+wL5{}&_=^i z-o=D`1Y*(3+G=n&u=jS%hV8PC6!_Wkj{(~@i&0zmIkQa$_w_WyOd$~eH+6z?rt|K& zn>08%D)MmJYpi2oL`5R^l|`w}+Vn@)&=Mm<*g{nR$c$~L|LbgZdT$Nu-5*W3kQrnDB`9h2pL+&494fc;^IHzAjQmL zJ@YSCtZnjsT{270&P*S%@q|GWJW@R3TLzDxUqiBw?w{B1Jj8mCiHG0xKrC_n2JU;# z^u4YsBqIc|j*RD*-!BF5n`Y&1#5k&8}3C6+>b`+&X%x)1E60x#Ez?U%AsJq7tT~-i=a8HXes6C zaS$eL^A58B$YrwX$`=Xe`nYR03T-@}x+KvMokVl0Uv*Qz2yq4$@6;8J(u<&)=z>=1 zexwAsh}~vtNi&({_pvd>u6_mwx<)r8!{J+rV-Ltt$pMn@Bwu2WF67FLhZT>U44_fI z?#cOEj}-{_yN|u`Zs_-J0D(lykEy^J|1D}qNN?HjN;d!BLw)}?cx{LNb4ki`!!C_o z50A@{cMr8DchOXQba2)`m2raXin+UTvFK6t`%rmD*w(e5i$-!lZ;i zqLg!`%S=I0ec@Sz^C?b3rq4QN4By%|=}XwbGFZx}o#hiXT&HMuWLKTsdo8LYT0cuwIOM;oJzql}fr$mj2{ z0U-n41c&IT^24Nf9HzDEz_Yjjx2a4%aIJIYEfRNV$TgH2-KSIsZ?}*-aBT(*Gz*Cp zBpQZSs#Fx{ksbou+;vcPKZ}k(S2l!JUDbJs{0{~Ip`*@G!D-0so#t*J zmVEK_oC}X8(4nk$*3L?#pHvT*6wOU|()wb8fmv7`~*Y-E6euc)BBf9eDU9u#;HCI>u$D}M9%2+E}wlOmyde9`{1fgsZsI0p8YEl^JzI& zwL}%(Wzn`d%c!g_lBImRWYCp0u;g-7Ntp)oFSoRfF6yd@5}BR#rg_tM2+9a6{~vmP zpeEv{Ai%uN-kyB>^l%x8x$(nvHG5)8p+z6dWelDd)uZJJTOzEOR69Z|}A%ML3GBYRf| zw$A&}^Egh8m}2v-d|E(wT>w#Fra;D`B1jBMUm+|}mwW4dRBXQ5#14~CokF>NUZPM^ zsj-B>0|()7YPaKXOdGdAVB2PHg{^b|VS5d!(amk5d>1r^AYU$0YO#*FaZ587vF#LF zCGSe2%$O4WGXXYyRjm(YH4H_Kk4TJfPcvuO;XN-)ty?HYVi?fKfe__-Ey4OT!h`AI ztT$OU0^Y?V4c$A3EFzZ7`{GUIQ?lW0_kH#s9$BX|G^Dfcz;(-Q-tf9={M4hyJnShh zf3jl92MoGo#`SNo=FHucoH z|1jGtriMD9M_;`N!I*WJO^MSgFYJg64z3Gno68<;;is4vFS)5_j!I~kXGVGtHT{-| z<)+to0k1MJzVb^(G`}0jw;ZUje%hmsYN=AqYkhG9jUXL2Ruoy~DHPo%NG(>3C0;wc zn7m&FLB4jTw4AOGcsL|a<%GxEVIau9VKG^;Mn(BK&aayPHs?}^%CVnSl-;O55(`Zj zL$lv0$#C~t{c*?qy`_7R{lXz;++bW%rXuOS@%nZ1#+(&}oy>fO8Rzt1ffhhcJQx0> zj0_fi{^=7TE7T<+7CrK|WJD4pqlwue&fmIha;|ZiuM9&EBxMH=f8&7Q4T`rcyfE7( z`1o3Z$!*qo50xaBk=`1v6W}&fhLIwp$c)az&ZdFvsiK_ul;iS^U}V&VK_x|n5i>ml zj<0hzdCt4GJ5aQob8-ssd2wmcA{cA(34(HZnM6mY0wA7iygXj@!=b+Z$sFL4%(NQI z*^QEyTK{FyrwyiRE_y*hR2&OTGGUEHED(5IXi@1p+l?$n}pWwL%9lHZ$J zhQf=dA*6de>NR~}!@8^+1p0I)^yTdDCc@n-{TF@^>LKm-uJ%X0oZ*N|XM6N=b2MJA zfwDXwSN`EeF}0D2MR~t&ylp}WmRa`~o8s~&Bh)8O&0bUN&is0_$I*Ng{)wQ%W9z!= zk0gSl!~`ly!_S^Idno~g^y=sU?M1bmbl{XvNo8aI{MX%a{(I8=9s15Y=G6Js1A@<9 z8v~Tg&Ra;qtvwbM zZ5#OM60A>Q$6K|hr8H#nReX2l9lMxhJYhXJC#YOzQ!7eeV zppvJ@V{2O1)s7tSjBoI+jr}x}_XfwA%UGlSjjRJLv73TwaUbBzq&u=XLTNlzSsVN* z%F!af&fw;e|TDFK$fW?T|QX!_!Rm4lGXYh_qb|r_%GRf6-%fh_`m6FGQH4j z>Ue`AR1weANTr3OxENAlY;4!_Sj57FZ_mp);l zpps|WXNOJZaSN<}0G5=pChw(ogw7QQn4fPB#@|oRVqp@e7M?h-(6L-(`x3FPpdcR$ zn^b_!F|O>{^1ouwngO>}X;E7mf;>wF$YoE*M;3*bH9E=~1X00IL?C zO6(SiG`_LmgBxC4zD=GE2x+QqnwA8vOkXy>eC4v-IAk|vK0wT7&FjUOAqVd!&-;s6 zOk^y8l18@&EAZ*NDN9y(J(((4*-K*CRrH=?%Yu>A(A+Y0x9idyysK>SvLiV@6W^G* z)Pzd`s#h@0yVtSlXCVHF%umyBom=cGeXH9bEsCX`kb6!_`mZW?)`vXlIm4&qv*kmO^%gMJBiuYO);M7z6)yQ zcaneX3?)GU%tAE#@!u(slSqh8*~cDNetW@XvvzSc=2i z)p@&ugNxob>CSrL4re2r{(71cj&=Eb+-3>YWv{%{Iq)j9`(mcaa%Xz%Q-j-0I%Dw- z$T-2%>(ElT;lp~g^RNYFMZ^?s*0ePI$I$O8bajSwkjG(;0i5Fwtdt3(QnSw&qK zl`C5D{h!&-+L#a+%!LPhpXIVos%&q=y%u|zkz~q75QtPo@;qc`HJI=6ZDrI7R%umT z05|Zk)AB5&N|i3s68ytj^9j2sWhH23D^!$LHC0Lpb&XkWt3|=-sSLI36LiT!er7mW zpZp^UkN6zCx*$mMfti_G_LIR5*<~ET%(&6o&4b!|G`rHcBwZ{2nPV*>(6R#x=bz7!Tu{~cpf9B^RfxiF)=CcYN< zbx$+EvlS&@)5O}y8l9Xmfi1;$&BHb(Z0y+yJ10}EsKvTnc}S1bP925VlT`! zt%%rR!xnK-Z{o@hc~hKqb2Sg$6(MQLx6zsDv6ma_qr$SFzVf-!rv0ld%}y5ghnD`tumGy5xr5i504`9d*s?$C|EqA8#8CNI@?y@v8pc z)mK#GDGU{Yv}eqVt5!{m-*%U z_AR&Z2kce$O?Th&D|)&|Cw;tCC-yc}U+kw@pC|5WSQnP9#>fqK!w&0dA33V02SUdz z9VHe=aY<>~!jH)Z*DYnuVuH$j!s+p$O3c<;O#3-GtCTDj-dMbviOlSf29<4mthsTcud|~yy|dS0Jqscgi8sfqm?O0Ro}%B@alT_xxH7}QKT7~kRODAgnK#1R z`MN#ZFR_1hYc$9ZJ0(1@EQ&bM`a2?tGC zFY?`P)V^IA@&1yHq}|c+a`}w3f=ET9d%?#E$9ETim&@v1KA08rKjZXa&ALFh)IiAp zLUXOZ8Wom+Rj6vd6xe~xDD+gS&>|+Q2+t9K|JW|Z~<%Eo^ z9V2J$e3ysK{W-Q0|DmnDo!_!A3~&USa367cx>r#6P!HphKk8oArCK`a-OvxjzrFK$8PexMzP`?zxwaU@6wEY-*`QJ4OOG3|3+V$6CdV&U|s-U0)v1? zm7tdB*CI>?n)G!tZWH{{>RJzPDi6F)z|)#&22mlr>LJwK2 zKQP$tF^!7Hovj75LHFV0>e7s7s|e0cQ7(;=VY6NX5qjvvR%Qsy;5d1l5&%b;z-siR zF7wZxxkfcwuw%o6YF?w`wW1K&2r~eKfkhpQ&!}tHG&%2Nz-3Y%6;sEMx;EUd(5qa+ zi$Y@^V1AaO)uYO1&i4*0KTWrc(?MFmMZAHS*d{i8v zc=6szy8xIP0&7=uGzvPUtc_j_QjyPdpp+u!be%R~g`kh=xSp5P6(Q*?cmX>}L|0fP zU(+=_G~&qfyr3kU5Yv_pw1dehJ69^Jwn`0peDjw2Gb>%6F8}YJVy37z4B*MXMx!Aq zEWM@(2a|@!UhXl(#w7jQ?zaO)k--UWy>1C)QwL9rc?eajJsyHXt{U!2g@RIrZPC$9 zz{YODA}PzLt~J}YnlD&(9r)~AP1@YHyXGUC8#j;!Y(#s=kzXgC8|jP*qZgfcEiVY5 z>OONegQ|mu&tpbMUWeO=?3W;%sibPWbUj5YW^v>_L;Bs=oDO*BnXr_j^6+FnyXFsMO7H!S8q&o50AvXMJTdF0pyMp4n{|Ym= zoUPgP=G9i@0%95lM{U!6^I~&h{l!H5Icw|KXt{=;&mH8h?%!hI*hre!(vB3tySA=e zI+9iSi%-BYF;tw#7w6(bB=`)OB_x4FY>|*=NuyLBSykD&u(Ea{Rr~U3;#v`zFA#{Z z`GL~>^e~bP%DqxVYe*y4Z0i6STR;XcW(Ko#d;Ikia>HW)7D8WfQD`XNuAmo*-@cSW zF$lU~UP(#s0_m6nNYb+b7PzVfy@z`4(FN6_KW~{JAK0){UewiMvaNf;PI+L1`~iNP zM;BBeuuuEW?dsDi6oA1hOUVY;Hr5_wZ@^)HW`L2)$36O}Ni!V4mN2TWJQz@^2md*f zU8*f+hx> zsAV=IkEv464k2x-+ZJ*|WO{MEu%9-SyO?_K8cJLYdE=w+ zTlZ{*2&b!+Uxwd}x%)EQq+HCuFzQB)56J%Lp5z{};sXfcsZlXMw)~~(qrD1eRfu>8 zc+g^vAEpZ~3L8r(0#lGc_I--ZK$0)I0EjHlw{ zS~8SYov<^STU@FvP84tE^oB;~8+pZ)H?#uYBk_)*$=X?)vHRq81Q0Wm_hJVWyQ}mlRs^sjsO-?QuaoH zb#e*EGYk>F>3A_!^LB7UmHz@}R|c8waP^9(N= z8le}S^_%w*F#T0KMvRCST$(LBb+JjppQe}X1I0ZCldv-+eU}o_RpZf_qWGRe1UQUA$x8U z^iQ9j`oyI&G4)(6S>*yV6W?6lHX525M$AE|UlGWdkB+@%=|_&ix(ms-ZmUCi$!0iz z0^*ROKV$x}jvwv z+0X{)amM=xe<3TuW{T%2^D*vCT?!~&<@?t+{8DCQJ1u)k%g%b6mX$#(E%seQ{8w64 zI<^Rm9zj&`wDI+RJ0g=&OUp9f!)ko$^maxpW3>D$PCFn|^iDF4&~NBbfUuntDT8yl zjCQ(bChHwq)>zYHt?qrzZ397jDue$z_}I&YQ40jmC4n&l8pfe74ux0IvGf9dW=^g? zNjGB@FcRn=yY*A;dfh2iv{zpG=Eur7KV}rZ85LLEmX`J`E$flHcll?LaUUSOT=LAc&^>OMc5Co>;d1bK zoESOe_)BYk`r*yiwFAPD)B08hrjaUDWc;XS|E`B$K1*mwJX;eta&YyFI;l+%^Xh{m zaT|uimq`A$9z9>|1)VNt8B%<^>UUuEdvHUIEH}W2ZwXFhMaNt;rQrt_Pb}F1Y8UcvCW1m%5BEZ zpQ#^YAn%+;fX(81a;w9?RD(4Lq1yjQ1LtvCHNVMqy*U&at6&&2mkjbVv>c9^F}b?0 zZ+Lj)#?y9FwKX*>2Zl}e1-n}tH=Z$leXBd8%p6WF{f2-2x^s0D$n7zbEN?r56C|a5 zt!HZg7Afg%Q!3Dfs!;Z}u4}K2C9}ijk^)-Nfh`H~Oo|fAjRVn92)G0+Mq{Qe-4Y62 zP)`&RAog>$3c#HWG`Ve1)%!b35^dfuva}$L%wjt!-=!EZU?tiLAVQSH%Cv#sOl z?cet9^;^Gy?%rM1RDb{uvb#!<5Hgc3|35kHo#s2C6(bfaiw4TgU{uNdkJCTYobyH6K=d)| zKJO~;SvaAukLWX4Utc+;Qc#gWG_kMmFIIni-#XQX^8%tD*C$Y^Iy{ZI#86NYMgg0k z_I^9w3Ti65C%Dtjn$5=ubw>59U%|Hjz4M=GPE#TKCz^HE0Ig;`ypUZSFdD>j@BCQi z!lEFuKFx&Y>{}60<4Vd)Eb+X*@!m+QHzJ{sO|(Loq<@%)m|kc5*;k9%M9Us_Vbflr z>k5AH!Nha!9uLOujf7J#S3nv6m7G?0kXz<;;*uB>gS;BwI7*iwzvo zL7Z$-#YY1x@|`mB{RzJIEGn6h-0oR~Kp=Iv(e>I!q(HQTMgqbdOA}Hh6Jxdd}GzC5LTv%F}YfW$4?Z+_?tV7#1G(SQP?^fRQ=IcaixCG2FF? z;)tLqf=;tmsUz_J=S>JFeN1~*Uu`UwT=5)lRU^j(=C&-LQCp|m{VNhv>cNmPyRkT_o^! zex_JwO|U{av$Krj!g+X?Q1iH?nm2i!zkYZ19_U`&XH8$=r}vdqJ4~AYHNkr8N0SOWK8ojTXWS0M)NJVvZ2#s8XddgZ}WujP7W8m2oDI}hkY7>uK*$$$mG21 zr9o8{0!^`odwZX;TvSXUf5B@{e^Z3TZ=%H17;bXUILJ$In-3{Z4<#R_qVxM_{IUO1 zc%jm?93O~}_7U5qM~7Ndxmo({nR+ftP|ER#EcV9|r(*1H+F|x-c)*Bu#++W0TQf-u zOnY@SOYt&p-hXBEeVr+{_5>@z8q}VDp(#XY8VmLhvw!TC8cG?`Wtn|-3kl7$sX!k6 z3Cc7A_p%s8MlICIDPfe%JC3`KyO2WD>YpF=jORu9O41M(##RyDBI}S(qRdO=E%SKm zS|5kKzj!YBrn|kT=Nj6Z+x@J5ip9VwFY0{A`F`u*U5KLM+blIx z`gJ^ARUXz$`fX4dw}lYnBC?HN!e*pX{D&M~AurH| z1ExW&vq%??^_|WNWTrv>10ZJ|e$4F|?v7i3uzwx|j^o6*@9i1wAg|xOjT1rc33Kfc`6X4qb*W)(Q+sfK zV_Tz;sNJ>jWExbElDBeV66aD2Hb8pG>QO+Mz>$bXyfC-GP{*{>mLv8tKDBIE?2!#P z5=m=si=cys?PDdyB~2CCbw@SkArdT4q?xf4=*dt1|Ky6~!QRQuAA z@dmVoD@N`Iq8nUO`PfwGD^C$b3nzWUGPoWhRzQ(BP8|BqcfSG%qK4JKz%w0;<+P6o z#r~;U`L8@Kn^>qAR*?frZsW6j-jCX!%t3rz@f~f&Khr`RdxBwoSl?fNdkufT8{AH| zW+lA%!sf&|?>C4M;mRQ*Wo=|m~{pSeiUFj#7Tla*&!z-6uS zPsgN%{b{V6Sc%njX~(^)-kxiVep9`@phmMB-&VZ{Ef=cx8Yp**=^w3@X!26^PmkCm zfm?0B6_uc3G>z*Rx_r{%RLj@D zpgQebL)2?d_@cnY8r>M53)5n0r#zbwVJRD8)dwby?_OW8`*^4^cGyo7xPWR$RiJ95 zk?onR@RU~8(m-r7#Vfl!EU`Q>aUc-Ce|66$R*!ep*lWFw1~SEe#}7RX-c{okwgSB$ zSUsYfoV5NZJG&`NdyYw|q~qUi<7Y&3$yr+ZO(yNe*~S+ONy*q1wNN-SGd`EpK>r;u zb1InRjM(6oO*L9&XW#Oa(w->kr5+ZQeN%KDT(ou4u(54Bjm^e5vGv6`VPo5FY@3a3 zHRg%U<^*kWV%?1KKm0HE<*xm_#+dtU@3kh*?m7mQpAIngA~Tnk`i*>9s-A*gHgO4C za@+KBk4cnawVaVqtYlai;O~Xhcw2A@n9#R3FZduYJ-+vrE9Ej_LI=gqf5T=T&}h#N z=NbvI608tctfY#Rx|3(c$deb5Pue4t2lr{k`9-js~Hqdd`? zvT*cEr1PqT@+~A~cQDl$fFdhm;z8w|JwysFU*Hzy6KnE+yC9qQxo?DT?c;3X^$fs) zs#6Eu#+V|%FzPF>AlhFOHW;I#&rQQNp56mjtE+ii7~%)~d@L#`>aN^9g?qk~O%`-H zRlW!-=bBmX6q5uS6u3kW&!d&k592TcRWO+WI79$u64&e1YgV3z4;+%1t=mT&g0sjw zKciigw$t?9_0AJ}vwHiXo{er6p8iSmiKcb`YWCwhZSQ97D5ehzKE{$sdww!+0iV8m z=uy-UBSHaoa*@d7I^{4K&yIg`$uC}Zi-Q>*yO!gfOT+H#m;${+c0=n09jtJ|FGIbz45F1*TRpZ4V{5 z4R9vqO~U~%K2dkHRc;k>v#9bK6+JExtfBL8mZ|!i6>V_(O0a_3W6RHU)i@`myG{i> z(UD^RnCfokd7oGoY6YF^<7W$z%o~0|Cpm8mxL#52c11zB)3I3tzUEw<%^B^jZ)y(N zeHC?6KS;lDr1-;)r|WD}vFaR}OSE+FR5ZR%SF^nJKq}{VgzpakojiNAnXsjgq4Zjj zU6o@en@^m8mlnrF=mHb!0tH*@0!bWaXb^<-4V^7dGU$|(%zsvL7Nbzg<_-XtM8#YL zsiHgH4xP3doea&YXm2u`QPuZcn$Wsg53A^5>GH2v)YbR^OA$0kUW$v_Rp zdd+j>4YaO}Wr#r9LC9ZO8$lt8UzPQ#NjJT-IEdGj&c2M_xh!v5o#F4xJPShGI`yCr zgZ;)+wjAqCR2+>PaSZpaBYKXncyd;7H`}y=mcI!3!CCe%<+`1 zOCe&^V4}bXE01fCo^S*1kBsE;ogXQ?^NeG|DgPr$0efGOarZ!nZv9(11~YNy)3DCf zWW|tIWsXMDem&d~%8e*?$Ih%N=TDU_O^&T6d(!7M#DO*u$?UE14s!jR%kf zJaqRlU`nxu3+>j2)lTW;y}<%@Px%&mbD73@Ic=IF?p3sffBo&v{vJ7a(Ppr=^hCv! zv`Q{){6R&F-9hHW?^R1?WKIr5gp2mQcWS1Ny%5Fq$Z@))aH0D3Dpa_CuIa?vyKuMjjOTC^Ur z*|;7V+if2Y6t?51JcOZ3(n}ar|TEiC2T-Au0*Kk+3V z4M?2%;4LYTt$^fnq2v7d)1dBSt>W3x@9X~^5~pZwrqS)90V>=v+n9Rjkc$A2kr)O# z`0yXvs^Uc7?~0Pv;wa`!CwU(;N8(LpzuR^V4H(sB$Lj5ZI?GIf=9}dNmUrbup=0&S zBigQCCax!>{208iK&__eT&E6AXn+{%R&Uh@*vf{tH~+2N7NoxgB}{YmU92zJPqG%9 zZB*Moue;^~co0AI=|j4W)wFcs!WIW`Yu^*@p>tV#&Y5} z6v{6jHk>uf^U7M~g(H-eN{kJvQLuvYm zD?mp@jV4qh6ZqhDOVJawy|tV=VyD)h6>5r-_9NBSvym+I2kWR6^=1%(Udfg-4d%0X z=7xA)GTRRObf!oc#h3Vwa3XFqmxYfLJb!h;2-nDMcVqIpz`oeGxKMd|Zzq9cF^7GM za7W4ruIZoGvl)Ixve658n?70TC0-xeNJrlVP4`bkfziqJ9v>@XG`l&l=Cw0A5BlL* zt!|z#`(R1MF@{cB6Wu6-eBMX{I6ABTb8GqfdK*y^!%N=chkHgx-TrSEt>47T^{6X9 zN@tU75&fvsfnk5CeC^J43OyehDP_tIkGTej#wP7YN4Qi_YE%W|3-(9di`*>OU~Cdw^PVM^J# z)JV+-o9jw%JBL@fd?KNY$-}r}6t(Xv()YwBv?6Nr?ef<5{X7RomKq92N^?2l4>i33 zJ8AYcT(m4(v^|#o(p)c0a;n0b)Vj^8?q;l%B>c~4f3b~&PZilGRcMPCs+=CviYB5| zkwlunSwKt(>_7Q{P&-8My57?)p6!avF_MMU=F0a?TmDtiS>%VlgYfJ(Y{yQgnx1Uqr#+t zr=qjSr8z6ZoF~51s%mnJuJ4D}ThpZtH^GDE;S&1ucc!7a?q_GAm!pvFgu&h84MRF( zN+)*r&)NFy*l|Q`Q$3X2fYB1`6xFo7Pt&)K8X-(w~j=1GNh_d%my_S36t3GloknA|VF|*2jG6 z!BKb~*HKWZ)AtonV{pDf{k6vTy&{lp1!T^uXA0l^Y* zwM>iDg_()@*EmSjH=_6l`u+sW<$GL+=E$Nsn5mn=)@U;-rxDr6VeXFTp-eo~gp)c4 zd#a*So*I9)8SVmO8?!zna;CyB$y>{mlS_t{tIjzkp%rhzixdGoX z83&=<2Lq?uocQXM*v&4trRFD$Dc{5jY*dj}1y zxfXD@COAVmNxeeITX{C>G;<&x@_Mt4ywXH_WtUEq=}887mIX`0xXKLuO1oV=Z&M$X zs&Y>sb9s#HT8>CBHyRVn>$4|%uk(}0_)Jv<*h=442Q@Z-lE%;UK2Eg{YXDog-GnIm_bhsTnTT*4D94zn^TEvzBa~4ON9)0PGeYINQ6P-B zQxEBX#o3;nt6g3CQc#E=?4YO{lU08)?4vvztjG^UM{TzRRW%lsE$F+MK>D6rn?1=~ zEa(-{@0vy1(FRbu7vgVJl~pEQJ2PKMP`dLat5@p}3>;5gy5;x12mV-YkgU!lLn4R* zvf2S&|Jj$g5Ee~73bF|QCubEkdz%(vC80H~d z)izq6wq^xgPD-26`G`=l9nm{_^K7V6HBh-;Vg9|0@}u1C%!SwcRehUO5?|!`%Rj8u zif%5bGMH&mfgDIUjo{nTuw`J|$;F-~+Qrpgof+BB?#XLLBbHwyF$Zf=9y9MVg<keo7X3%{6w}iJ>)XWx9lR^dFngSlo^0>>F%oSMk z9iW;%h$=ikIN&v8spbq5Bw$>KyM3yla7eOw1mH9U;9x% z>z8btwH^wac#%x1UAr0?G1CZEW@k zC<~hDv`OxA0T`YU8X>-!Z^8{NZMk~658ysV9(+lDh6fRx9i#h8_x0D_!!&WnrlIvt z^fQ#-o=W2u6Z4bmLcJabJ3gC_ry*@YA=;gPS^Hw_RtCYF3YG(nLf7eRLzk?KK-a9- z!2qgu5qjvu#V}IGMT2!+3{znk^ZuQQgC^z${-RZW_t}Htj|+n-fRZAPY4Ex9!mjn3 z8^BFZ`OS7TM0)x3`z15xP`)pq21Jnh-1=V40>@EUbApZ$N=QH7ylP^6Ur=qS|Qr$mToM>$gWfU?PpJo zZCDx`y*zFW17fV{oXOL^`!|p(z#pD{o871A4eq5>1Ty<%>2S@79I-YWRfXtxH(tP{ zSj6_$z#Eu48O}EygwujVraXiTd@u9t{eUE;X6?`32j7o!qv+_Hts&dUZ!--qjt?gxoqv@;M?7~mp4gMehGE%;U7H| z3Qfg!U8eeNhd!c+LkxgVU(v~G$BlaOF-)63IY>Dg`F(X)2O7*JM%S3emr*GNQcr`Ou&RtOA7zAI!2QlSvh(bsA zze-_cNtP`TD&ge}AOC|JqWJh+m7n(2T#3QQC^eg3(I<&mk1Z3SbhwV2eJiS z1a5mvKLKyZ#Ial#fiCrg^AKcSZbZ90yR;qU2KJ2MAyRHeO^#Ug)^HvA502phyPE;+ z=Z2phA43FCK;I!=I%YLdEmB6PQ}3C`Zcm~4~AuXU0#!cd=mayXK3!&4RCAE`i}DA*0pf00}`3(mjT zOFo)ZtQCh*!}B>xn*6TWs#@|LE|e)TNf`Kon^&k{$M#M%X6)nApqq|zrypDMi7+p? zcnF(VCV3jVMHw48A7G<%BvW->JVYO{7T0~YHI+=w{#MC=ax^smxWN4*C;jGMUIY$X zgJ2Ln{KWTPG2Ct6^OVoyJ7FC~@B^DTa9pvNiO;}{?cqe1(Mys3X2Te*E@F;F(VE!; z5&5}iazhcBHfDJ729QF2z(L{qSsLY5i$OT>eqb!AV8e@9=S@hms^&UU%MJj2>*aAV z-(vPc)FfuFE}+OP8N-<*y(Nr8(u#+U*-e^m$9uV!WvR^5GU8m!ePKt?Da}3ErGe25 z-Ro?h6X8g^*NhCnI)j{^&4J+b4x)YJs$V#A2_Ba!CTvo)C4nunPD|Bd2>9AKEIuWb zzpwvxT(n?!?VAX6>g&TCdRkyD>rcKht2g7{{fC0sc1EDd&IXS`irCedfVLvcZf7Ht z47rfc#{S+kDKtM{Ndo-xHHB$d$}eEa%&3Ag$pd2)`A6W1RuW>Zh8l@h(B+oC?d8h? z`GC+)Hs2l|yZ8Hue%H$t4UT8{SHe5F(TX?`;qz4=c@-2z;5KI)>H?y=E}lGhhWNk3 zqh#&Lor-1GDaVpb1eLcZpr$_u$6=S=?Q$p%UakFVWBC3=qn0K+2`tVZzc9b2qS%@W> zuuM4}7|P{8?y@H#{!H*uSaTx^KjeS4mPp9&x2{GtA%B49%5uIjvY11BSVHV(8ZmG3 zx)SZij`Whgoo{2^-u*M@h?Ua(NucW-q^s@d&3ySI$R<_l{K@{I z=?=)xC>&0d*#WX3C=mappA~F)dK{P&e=@Cl-=~Z{j$_SaKQqk@|&1quk>gHeo%bQ}THuYnNBAgDrH^}mE z|FA=ZWd=L!36?1H%oJpMryr8Sxf+v;SnPBKNc7EYCchShcU`j0=$@XG&et-`I6d+1 z16|jvN70r0S5)AY6^G{( ztpUa(o8;A?R;(rR_8Iyf^j)WMdpGVQKBMN;Rft~FU;*{&P9xPzqS2n6bctA56*aMK z3^`2~$g1Ef1Q<|9v(!sMca5}zU->WGU&~eMZ21vp@?WiQ_)?En7g1;_K`qj1ViefL zNIM|*PmT+YCgX<=hW%0!gG)3!1vib=wIY!#%r&UrLR9-!*3a~N--mFDzd(Hzs?})> zqtulG`JJ(`-u^Zu(8Vf!Q`*RJD3DW(=ti(-?)fq~>(@_ua&+SBSpD^ehQ=zYIOHm~ zr>XnDMS6RHY*G<0wdUotw6dz;j7;Llr-lo~$3hnp0?O!FrcscM89^Zk0=r?j$QTwI z8ZZmrSgry4Gt}5Pxh-ra<}s33uu=Xq+SET>u#8^b{v*R@(0XO{gEF=uAE3i$7>)tn zFHcg4%v4ucp9yzpBw5MhK9ws6kFA zfDthN@4&-wMn!xYE#$sLme2$9Xhu4c6c7-oKC4<`n!r4cV+>^f9{T<+h643J$naE} diff --git a/sources/assets/js/app.js b/sources/assets/js/app.js index 460fd3d..02cafe0 100644 --- a/sources/assets/js/app.js +++ b/sources/assets/js/app.js @@ -50,4 +50,4 @@ c,a,e),l[d.key][c?"unshift":"push"]({callback:b,modifiers:d.modifiers,action:d.a unbind:function(a,b){return m.bind(a,function(){},b)},trigger:function(a,b){if(q[a+":"+b])q[a+":"+b]({},a);return this},reset:function(){l={};q={};return this},stopCallback:function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable},handleKey:function(a,b,d){var c=C(a,b,d),e;b={};var f=0,g=!1;for(e=0;eel día",eventLimitText:"más"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){function c(a,b,c,e){var f="";switch(c){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=d(a,e)+" "+f}function d(a,b){return 10>a?b?f[a]:e[a]:a}var e="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),f=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",e[7],e[8],e[9]];(b.defineLocale||b.lang).call(b,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
    journée",eventLimitText:"en plus"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){function c(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function d(a){return(a?"":"[múlt] ")+"["+e[this.day()]+"] LT[-kor]"}var e="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(b.defineLocale||b.lang).call(b,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return d.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return d.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),a.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),a.fullCalendar.lang("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
    giorno",eventLimitText:function(a){return"+altri "+a}})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiemParse:/午前|午後/i,isPM:function(a){return"午後"===a},meridiem:function(a,b,c){return 12>a?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),a.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),a.fullCalendar.lang("ja",{buttonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(a){return"他 "+a+" 件"}})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){var c="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),d="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(b.defineLocale||b.lang).call(b,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,b){return/-MMM-/.test(b)?d[a.month()]:c[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("nb","nb",{closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nb",{buttonText:{month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){function c(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function d(a,b,d){var e=a+" ";switch(d){case"m":return b?"minuta":"minutę";case"mm":return e+(c(a)?"minuty":"minut");case"h":return b?"godzina":"godzinę";case"hh":return e+(c(a)?"godziny":"godzin");case"MM":return e+(c(a)?"miesiące":"miesięcy");case"yy":return e+(c(a)?"lata":"lat")}}var e="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),f="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(b.defineLocale||b.lang).call(b,"pl",{months:function(a,b){return/D MMMM/.test(b)?f[a.month()]:e[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:d,mm:d,h:d,hh:d,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:d,y:"rok",yy:d},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pl",{buttonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"}),a.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(a){return"mais +"+a}})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){function c(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function d(a,b,d){var e={mm:b?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===d?b?"минута":"минуту":a+" "+c(e[d],+a)}function e(a,b){var c={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function g(a,b){var c={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}(b.defineLocale||b.lang).call(b,"ru",{months:e,monthsShort:f,weekdays:g,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:d,mm:d,h:"час",hh:d,d:"день",dd:d,M:"месяц",MM:d,y:"год",yy:d},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(a){return/^(дня|вечера)$/.test(a)},meridiem:function(a,b,c){return 4>a?"ночи":12>a?"утра":17>a?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-я";default:return a}},week:{dow:1,doy:7}}),a.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ru",{buttonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(a){return"+ ещё "+a}})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}}),a.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sv",{buttonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){var c={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,b,d){var e=c.words[d];return 1===d.length?b?e[0]:e[1]:a+" "+c.correctGrammaticalCase(a,e)}};(b.defineLocale||b.lang).call(b,"sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:c.translate,mm:c.translate,h:c.translate,hh:c.translate,d:"dan",dd:c.translate,M:"mesec",MM:c.translate,y:"godinu",yy:c.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),a.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sr",{buttonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(a){return"+ још "+a}})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a,b,c){return 12>a?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),a.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){var c={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};(b.defineLocale||b.lang).call(b,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var b=a%10,d=a%100-b,e=a>=100?100:null;return a+(c[b]||c[d]||c[e])},week:{dow:1,doy:7}}),a.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})});!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):a(jQuery,moment)}(function(a,b){(b.defineLocale||b.lang).call(b,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"下午"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b,c){var d=100*a+b;return 600>d?"凌晨":900>d?"早上":1130>d?"上午":1230>d?"中午":1800>d?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var a,c;return a=b().startOf("week"),c=this.unix()-a.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var a,c;return a=b().startOf("week"),c=this.unix()0};r.prototype.open=function(w){var v=this;v.app.dropdown.close();$.get(w,function(x){$("body").append('

    ");v.router.dispatch();v.app.listen()})};r.prototype.close=function(v){if(v){v.preventDefault()}$("#popover-container").remove()};r.prototype.onClick=function(w){w.preventDefault();w.stopPropagation();var v=w.target.getAttribute("href");if(!v){v=w.target.getAttribute("data-href")}if(v){this.open(v)}};r.prototype.listen=function(){$(document).on("click",".popover",this.onClick.bind(this));$(document).on("click",".close-popover",this.close.bind(this));$(document).on("click","#popover-container",this.close.bind(this));$(document).on("click","#popover-content",function(v){v.stopPropagation()})};function p(){}p.prototype.listen=function(){var v=this;$(document).on("click",function(){v.close()});$(document).on("click",".dropdown-menu",function(y){y.preventDefault();y.stopImmediatePropagation();var w=$(this).next("ul");var x=240;if(!w.is(":visible")){v.close();if($(this).offset().top+x-$(window).scrollTop()>$(window).height()){w.addClass("dropdown-submenu-open dropdown-submenu-top")}else{w.addClass("dropdown-submenu-open")}}else{v.close()}})};p.prototype.close=function(){$(".dropdown-submenu-open").removeClass("dropdown-submenu-open")};function o(v){this.app=v}o.prototype.listen=function(){var v=this;$(".tooltip").tooltip({track:false,show:false,hide:false,position:{my:"left-20 top",at:"center bottom+9",using:function(w,x){$(this).css(w);var y=x.target.left+x.target.width/2-x.element.left-20;$("
    ").addClass("tooltip-arrow").addClass(x.vertical).addClass(y<1?"align-left":"align-right").appendTo(this)}},content:function(){var y=this;var w=$(this).attr("data-href");if(!w){return'
    '+$(this).attr("title")+"
    "}$.get(w,function x(B){var A=$(".ui-tooltip:visible");$(".ui-tooltip-content:visible").html(B);A.css({top:"",left:""});A.children(".tooltip-arrow").remove();var z=$(y).tooltip("option","position");z.of=$(y);A.position(z);$("#tooltip-subtasks a").not(".popover").click(function(C){C.preventDefault();C.stopPropagation();if($(this).hasClass("popover-subtask-restriction")){v.app.popover.open($(this).attr("href"));$(y).tooltip("close")}else{$.get($(this).attr("href"),x)}})});return''}}).on("mouseenter",function(){var w=this;$(this).tooltip("open");$(".ui-tooltip").on("mouseleave",function(){$(w).tooltip("close")})}).on("mouseleave focusout",function(w){w.stopImmediatePropagation();var x=this;setTimeout(function(){if(!$(".ui-tooltip:hover").length){$(x).tooltip("close")}},100)})};function k(){}k.prototype.showPreview=function(A){A.preventDefault();var y=$(this);var B=$(this).closest("ul");var w=$(".write-area");var z=$(".preview-area");var v=$("textarea");var x=$.ajax({url:"?controller=app&action=preview",contentType:"application/json",type:"POST",processData:false,dataType:"html",data:JSON.stringify({text:v.val()})});x.done(function(C){B.find("li").removeClass("form-tab-selected");y.parent().addClass("form-tab-selected");z.find(".markdown").html(C);z.css("height",v.css("height"));z.css("width",v.css("width"));w.hide();z.show()})};k.prototype.showWriter=function(v){v.preventDefault();$(this).closest("ul").find("li").removeClass("form-tab-selected");$(this).parent().addClass("form-tab-selected");$(".write-area").show();$(".preview-area").hide()};k.prototype.listen=function(){$(document).on("click","#markdown-preview",this.showPreview.bind(this));$(document).on("click","#markdown-write",this.showWriter.bind(this))};function b(){}b.prototype.expand=function(v){v.preventDefault();$(".sidebar-container").removeClass("sidebar-collapsed");$(".sidebar-collapse").show();$(".sidebar h2").show();$(".sidebar ul").show();$(".sidebar-expand").hide()};b.prototype.collapse=function(v){v.preventDefault();$(".sidebar-container").addClass("sidebar-collapsed");$(".sidebar-expand").show();$(".sidebar h2").hide();$(".sidebar ul").hide();$(".sidebar-collapse").hide()};b.prototype.listen=function(){$(document).on("click",".sidebar-collapse",this.collapse);$(document).on("click",".sidebar-expand",this.expand)};function f(v){this.app=v;this.keyboardShortcuts()}f.prototype.focus=function(){$(document).on("focus","#form-search",function(){if($("#form-search")[0].setSelectionRange){$("#form-search")[0].setSelectionRange($("#form-search").val().length,$("#form-search").val().length)}})};f.prototype.listen=function(){var v=this;$(document).on("click",".filter-helper",function(x){x.preventDefault();var w=$(this).data("filter");$("#form-search").val(w);if($("#board").length){v.app.board.reloadFilters(w)}else{$("form.search").submit()}})};f.prototype.keyboardShortcuts=function(){var v=this;Mousetrap.bind("v b",function(x){var w=$(".view-board");if(w.length){window.location=w.attr("href")}});Mousetrap.bind("v c",function(x){var w=$(".view-calendar");if(w.length){window.location=w.attr("href")}});Mousetrap.bind("v l",function(x){var w=$(".view-listing");if(w.length){window.location=w.attr("href")}});Mousetrap.bind("v g",function(x){var w=$(".view-gantt");if(w.length){window.location=w.attr("href")}});Mousetrap.bind("f",function(x){x.preventDefault();var w=document.getElementById("form-search");if(w){w.focus()}});Mousetrap.bind("r",function(w){w.preventDefault();$("#form-search").val("status:open");if($("#board").length){v.app.board.reloadFilters("status:open")}else{$("form.search").submit()}})};function l(){this.board=new j(this);this.markdown=new k();this.sidebar=new b();this.search=new f(this);this.swimlane=new g();this.dropdown=new p();this.tooltip=new o(this);this.popover=new r(this);this.keyboardShortcuts();this.chosen();this.poll();$(".alert-fade-out").delay(4000).fadeOut(800,function(){$(this).remove()});var v=false;$("select.task-reload-project-destination").change(function(){if(!v){$(".loading-icon").show();v=true;window.location=$(this).data("redirect").replace(/PROJECT_ID/g,$(this).val())}})}l.prototype.listen=function(){this.popover.listen();this.markdown.listen();this.sidebar.listen();this.tooltip.listen();this.dropdown.listen();this.search.listen();this.search.focus();this.taskAutoComplete();this.datePicker();this.focus()};l.prototype.refresh=function(){$(document).off();this.listen()};l.prototype.focus=function(){$("[autofocus]").each(function(v,w){$(this).focus()});$(document).on("focus",".auto-select",function(){$(this).select()});$(document).on("mouseup",".auto-select",function(v){v.preventDefault()})};l.prototype.poll=function(){window.setInterval(this.checkSession,60000)};l.prototype.keyboardShortcuts=function(){var v=this;Mousetrap.bindGlobal("mod+enter",function(){$("form").submit()});Mousetrap.bind("b",function(w){w.preventDefault();$("#board-selector").trigger("chosen:open")});Mousetrap.bindGlobal("esc",function(){v.popover.close();v.dropdown.close()})};l.prototype.checkSession=function(){if(!$(".form-login").length){$.ajax({cache:false,url:$("body").data("status-url"),statusCode:{401:function(){window.location=$("body").data("login-url")}}})}};l.prototype.datePicker=function(){$.datepicker.setDefaults($.datepicker.regional[$("body").data("js-lang")]);$(".form-date").datepicker({showOtherMonths:true,selectOtherMonths:true,dateFormat:"yy-mm-dd",constrainInput:false});$(".form-datetime").datetimepicker({controlType:"select",oneLine:true,dateFormat:"yy-mm-dd",constrainInput:false})};l.prototype.taskAutoComplete=function(){if($(".task-autocomplete").length){if($(".opposite_task_id").val()==""){$(".task-autocomplete").parent().find("input[type=submit]").attr("disabled","disabled")}$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"),minLength:1,select:function(v,w){var x=$(".task-autocomplete").data("dst-field");$("input[name="+x+"]").val(w.item.id);$(".task-autocomplete").parent().find("input[type=submit]").removeAttr("disabled")}})}};l.prototype.chosen=function(){$(".chosen-select").chosen({width:"180px",no_results_text:$(".chosen-select").data("notfound"),disable_search_threshold:10});$(".select-auto-redirect").change(function(){var v=new RegExp($(this).data("redirect-regex"),"g");window.location=$(this).data("redirect-url").replace(v,$(this).val())})};l.prototype.showLoadingIcon=function(){$("body").append(' ')};l.prototype.hideLoadingIcon=function(){$("#app-loading-icon").remove()};l.prototype.isVisible=function(){var v="";if(typeof document.hidden!=="undefined"){v="visibilityState"}else{if(typeof document.mozHidden!=="undefined"){v="mozVisibilityState"}else{if(typeof document.msHidden!=="undefined"){v="msVisibilityState"}else{if(typeof document.webkitHidden!=="undefined"){v="webkitVisibilityState"}}}}if(v!=""){return document[v]=="visible"}return true};l.prototype.formatDuration=function(v){if(v>=86400){return Math.round(v/86400)+"d"}else{if(v>=3600){return Math.round(v/3600)+"h"}else{if(v>=60){return Math.round(v/60)+"m"}}}return v+"s"};function e(){this.pasteCatcher=null}e.prototype.execute=function(){this.initialize()};e.prototype.initialize=function(){this.destroy();if(!window.Clipboard){this.pasteCatcher=document.createElement("div");this.pasteCatcher.id="screenshot-pastezone";this.pasteCatcher.contentEditable="true";this.pasteCatcher.style.opacity=0;this.pasteCatcher.style.position="fixed";this.pasteCatcher.style.top=0;this.pasteCatcher.style.right=0;this.pasteCatcher.style.width=0;document.body.insertBefore(this.pasteCatcher,document.body.firstChild);this.pasteCatcher.focus();document.addEventListener("click",this.setFocus.bind(this));document.getElementById("screenshot-zone").addEventListener("click",this.setFocus.bind(this))}window.addEventListener("paste",this.pasteHandler.bind(this))};e.prototype.destroy=function(){if(this.pasteCatcher!=null){document.body.removeChild(this.pasteCatcher)}else{if(document.getElementById("screenshot-pastezone")){document.body.removeChild(document.getElementById("screenshot-pastezone"))}}document.removeEventListener("click",this.setFocus.bind(this));this.pasteCatcher=null};e.prototype.setFocus=function(){if(this.pasteCatcher!==null){this.pasteCatcher.focus()}};e.prototype.pasteHandler=function(A){if(A.clipboardData&&A.clipboardData.items){var y=A.clipboardData.items;if(y){for(var z=0;z0){this.checkInterval=window.setInterval(this.check.bind(this),v*1000)}};j.prototype.reloadFilters=function(v){this.app.showLoadingIcon();$.ajax({cache:false,url:$("#board").data("reload-url"),contentType:"application/json",type:"POST",processData:false,data:JSON.stringify({search:v}),success:this.refresh.bind(this),error:this.app.hideLoadingIcon.bind(this)})};j.prototype.check=function(){if(this.app.isVisible()){var v=this;this.app.showLoadingIcon();$.ajax({cache:false,url:$("#board").data("check-url"),statusCode:{200:function(w){v.refresh(w)},304:function(){v.app.hideLoadingIcon()}}})}};j.prototype.save=function(x,y,v,w){this.app.showLoadingIcon();$.ajax({cache:false,url:$("#board").data("save-url"),contentType:"application/json",type:"POST",processData:false,data:JSON.stringify({task_id:x,column_id:y,swimlane_id:w,position:v}),success:this.refresh.bind(this),error:this.app.hideLoadingIcon.bind(this)})};j.prototype.refresh=function(v){$("#board-container").replaceWith(v);this.app.refresh();this.app.swimlane.refresh();this.app.swimlane.listen();this.resizeColumnHeight();this.app.hideLoadingIcon();this.listen();this.dragAndDrop();this.compactView();this.restoreColumnViewMode()};j.prototype.resizeColumnHeight=function(){if($(".board-swimlane").length>1){$(".board-task-list").each(function(){if($(this).height()>500){$(this).height(500)}else{$(this).css("min-height",320)}})}else{$(".board-task-list").height($(window).height()-145)}};j.prototype.dragAndDrop=function(){var v=this;var w={forcePlaceholderSize:true,delay:300,distance:5,connectWith:".board-task-list",placeholder:"draggable-placeholder",items:".draggable-item",stop:function(x,y){y.item.removeClass("draggable-item-selected");v.save(y.item.attr("data-task-id"),y.item.parent().attr("data-column-id"),y.item.index()+1,y.item.parent().attr("data-swimlane-id"))},start:function(x,y){y.item.addClass("draggable-item-selected");y.placeholder.height(y.item.height())}};if($.support.touch){$(".task-board-sort-handle").css("display","inline");w.handle=".task-board-sort-handle"}$(".board-task-list").sortable(w)};j.prototype.listen=function(){var v=this;$(document).on("click",".task-board",function(w){if(w.target.tagName!="A"){window.location=$(this).data("task-url")}});$(document).on("click",".filter-toggle-scrolling",function(w){w.preventDefault();v.toggleCompactView()});$(document).on("click",".board-column-title",function(){v.toggleColumnViewMode($(this).data("column-id"))})};j.prototype.toggleCompactView=function(){var v=localStorage.getItem("horizontal_scroll")||1;localStorage.setItem("horizontal_scroll",v==0?1:0);this.compactView()};j.prototype.compactView=function(){if(localStorage.getItem("horizontal_scroll")==0){$(".filter-wide").show();$(".filter-compact").hide();$("#board-container").addClass("board-container-compact");$("#board th:not(.board-column-header-collapsed)").addClass("board-column-compact")}else{$(".filter-wide").hide();$(".filter-compact").show();$("#board-container").removeClass("board-container-compact");$("#board th").removeClass("board-column-compact")}};j.prototype.toggleCollapsedMode=function(){var v=this;this.app.showLoadingIcon();$.ajax({cache:false,url:$('.filter-display-mode:not([style="display: none;"]) a').attr("href"),success:function(w){$(".filter-display-mode").toggle();v.refresh(w)}})};j.prototype.restoreColumnViewMode=function(){var v=this;$("tr:first th").each(function(){var w=$(this).data("column-id");if(localStorage.getItem("hidden_column_"+w)){v.hideColumn(w)}})};j.prototype.toggleColumnViewMode=function(v){if(localStorage.getItem("hidden_column_"+v)){this.showColumn(v)}else{this.hideColumn(v)}};j.prototype.hideColumn=function(v){$(".board-column-"+v+" .board-column-expanded").hide();$(".board-column-"+v+" .board-column-collapsed").show();$(".board-column-header-"+v+" .board-column-expanded").hide();$(".board-column-header-"+v+" .board-column-collapsed").show();$(".board-column-header-"+v).each(function(){$(this).removeClass("board-column-compact");$(this).addClass("board-column-header-collapsed")});$(".board-column-"+v).each(function(){$(this).addClass("board-column-task-collapsed")});$(".board-column-"+v+" .board-rotation").each(function(){var w=$(".board-swimlane").position();$(this).css("width",$(".board-column-"+v+"").height())});localStorage.setItem("hidden_column_"+v,1)};j.prototype.showColumn=function(v){$(".board-column-"+v+" .board-column-expanded").show();$(".board-column-"+v+" .board-column-collapsed").hide();$(".board-column-header-"+v+" .board-column-expanded").show();$(".board-column-header-"+v+" .board-column-collapsed").hide();$(".board-column-header-"+v).removeClass("board-column-header-collapsed");$(".board-column-"+v).removeClass("board-column-task-collapsed");if(localStorage.getItem("horizontal_scroll")==0){$(".board-column-header-"+v).addClass("board-column-compact")}localStorage.removeItem("hidden_column_"+v)};j.prototype.keyboardShortcuts=function(){var v=this;Mousetrap.bind("c",function(){v.toggleCompactView()});Mousetrap.bind("s",function(){v.toggleCollapsedMode()});Mousetrap.bind("n",function(){v.app.popover.open($("#board").data("task-creation-url"))})};function g(){}g.prototype.getStorageKey=function(){return"hidden_swimlanes_"+$("#board").data("project-id")};g.prototype.expand=function(w){var x=this.getAllCollapsed();var v=x.indexOf(w);if(v>-1){x.splice(v,1)}localStorage.setItem(this.getStorageKey(),JSON.stringify(x));$(".swimlane-row-"+w).css("display","table-row");$(".show-icon-swimlane-"+w).css("display","none");$(".hide-icon-swimlane-"+w).css("display","inline")};g.prototype.collapse=function(v){var w=this.getAllCollapsed();if(w.indexOf(v)<0){w.push(v);localStorage.setItem(this.getStorageKey(),JSON.stringify(w))}$(".swimlane-row-"+v).css("display","none");$(".show-icon-swimlane-"+v).css("display","inline");$(".hide-icon-swimlane-"+v).css("display","none")};g.prototype.isCollapsed=function(v){return this.getAllCollapsed().indexOf(v)>-1};g.prototype.getAllCollapsed=function(){return JSON.parse(localStorage.getItem(this.getStorageKey()))||[]};g.prototype.refresh=function(){var w=this.getAllCollapsed();for(var v=0;v",{"class":"ganttview"});z.append(this.renderVerticalHeader());z.append(this.renderSlider(v,A));w.append(z);jQuery("div.ganttview-grid-row div.ganttview-grid-row-cell:last-child",w).addClass("last");jQuery("div.ganttview-hzheader-days div.ganttview-hzheader-day:last-child",w).addClass("last");jQuery("div.ganttview-hzheader-months div.ganttview-hzheader-month:last-child",w).addClass("last");if(!$(this.options.container).data("readonly")){this.listenForBlockResize(v);this.listenForBlockMove(v)}else{this.options.allowResizes=false;this.options.allowMoves=false}};c.prototype.renderVerticalHeader=function(){var z=jQuery("
    ",{"class":"ganttview-vtheader"});var w=jQuery("
    ",{"class":"ganttview-vtheader-item"});var y=jQuery("
    ",{"class":"ganttview-vtheader-series"});for(var v=0;v").append(jQuery("",{"class":"fa fa-info-circle tooltip",title:this.getVerticalHeaderTooltip(this.data[v])})).append(" ");if(this.data[v].type=="task"){x.append(jQuery("",{href:this.data[v].link,target:"_blank"}).append(this.data[v].title))}else{x.append(jQuery("",{href:this.data[v].board_link,target:"_blank",title:$(this.options.container).data("label-board-link")}).append('')).append(" ").append(jQuery("",{href:this.data[v].gantt_link,target:"_blank",title:$(this.options.container).data("label-gantt-link")}).append('')).append(" ").append(jQuery("",{href:this.data[v].link,target:"_blank"}).append(this.data[v].title))}y.append(jQuery("
    ",{"class":"ganttview-vtheader-series-name"}).append(x))}w.append(y);z.append(w);return z};c.prototype.renderSlider=function(w,y){var v=jQuery("
    ",{"class":"ganttview-slide-container"});var x=this.getDates(w,y);v.append(this.renderHorizontalHeader(x));v.append(this.renderGrid(x));v.append(this.addBlockContainers());this.addBlocks(v,w);return v};c.prototype.renderHorizontalHeader=function(v){var D=jQuery("
    ",{"class":"ganttview-hzheader"});var B=jQuery("
    ",{"class":"ganttview-hzheader-months"});var A=jQuery("
    ",{"class":"ganttview-hzheader-days"});var z=0;for(var E in v){for(var x in v[E]){var F=v[E][x].length*this.options.cellWidth;z=z+F;B.append(jQuery("
    ",{"class":"ganttview-hzheader-month",css:{width:(F-1)+"px"}}).append($.datepicker.regional[$("body").data("js-lang")].monthNames[x]+" "+E));for(var C in v[E][x]){A.append(jQuery("
    ",{"class":"ganttview-hzheader-day"}).append(v[E][x][C].getDate()))}}}B.css("width",z+"px");A.css("width",z+"px");D.append(B).append(A);return D};c.prototype.renderGrid=function(v){var F=jQuery("
    ",{"class":"ganttview-grid"});var A=jQuery("
    ",{"class":"ganttview-grid-row"});for(var D in v){for(var x in v[D]){for(var C in v[D][x]){var z=jQuery("
    ",{"class":"ganttview-grid-row-cell"});if(this.options.showWeekends&&this.isWeekend(v[D][x][C])){z.addClass("ganttview-weekend")}A.append(z)}}}var E=jQuery("div.ganttview-grid-row-cell",A).length*this.options.cellWidth;A.css("width",E+"px");F.css("width",E+"px");for(var B=0;B",{"class":"ganttview-blocks"});for(var v=0;v",{"class":"ganttview-block-container"}))}return w};c.prototype.addBlocks=function(w,v){var D=jQuery("div.ganttview-blocks div.ganttview-block-container",w);var x=0;for(var A=0;A",{"class":"ganttview-block-text"});var y=jQuery("
    ",{"class":"ganttview-block tooltip"+(this.options.allowMoves?" ganttview-block-movable":""),title:this.getBarTooltip(this.data[A]),css:{width:((E*this.options.cellWidth)-9)+"px","margin-left":(z*this.options.cellWidth)+"px"}}).append(C);if(E>=2){C.append(this.data[A].progress)}y.data("record",this.data[A]);this.setBarColor(y,this.data[A]);jQuery(D[x]).append(y);x=x+1}};c.prototype.getVerticalHeaderTooltip=function(w){var B="";if(w.type=="task"){B=""+w.column_title+" ("+w.progress+")
    "+w.title}else{var y=["managers","members"];for(var x in y){var z=y[x];if(!jQuery.isEmptyObject(w.users[z])){var A=jQuery("